176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; -----------------------------------------------------------------------
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;   Copyright 2005-2008 H. Peter Anvin - All Rights Reserved
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;   Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;   This program is free software; you can redistribute it and/or modify
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;   it under the terms of the GNU General Public License as published by
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;   Boston MA 02111-1307, USA; either version 2 of the License, or
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;   (at your option) any later version; incorporated herein by reference.
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; -----------------------------------------------------------------------
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; stack.inc
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; How to reset the stack pointer
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%ifndef _STACK_INC
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define _STACK_INC
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; This macro resets the stack pointer (including SS), and sets
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; DS == ES == 0, interrupts on, DF = 0.
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; It takes a 16-bit register that can be safely clobbered as parameter.
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%macro RESET_STACK_AND_SEGS 1
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor %1,%1
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ds,%1
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov es,%1
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		lss esp,[BaseStack]
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov dword [PMESP],__stack_end	; Reset PM stack
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		sti
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cld
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endmacro
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		section .data16
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		alignz 4
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		global BaseStack:data hidden
4276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanBaseStack	dd StackHome		; ESP of the "home" stack pointer
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw 0			; SS of the "home" stack pointer
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		section .text16
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif ; _STACK_INC
48