[SeaBIOS] [PATCH 05/13] Add macros for pushing and popping struct bregs
Marc Jones
marcj303 at gmail.com
Wed Jan 30 17:58:30 CET 2013
On Mon, Jan 28, 2013 at 9:23 AM, David Woodhouse <dwmw2 at infradead.org> wrote:
> From: David Woodhouse <David.Woodhouse at intel.com>
>
> I want to do this too, and can't bring myself to introduce yet another copy.
>
> Not-yet-signed-off-by: David Woodhouse <David.Woodhouse at intel.com>
would-be-acked-by: Marc Jones <marc.jones at se-eng.com>
> ---
> src/entryfuncs.S | 74 ++++++++++++++++++++++----------------------------------
> 1 file changed, 29 insertions(+), 45 deletions(-)
>
> diff --git a/src/entryfuncs.S b/src/entryfuncs.S
> index afc5e61..ea6f990 100644
> --- a/src/entryfuncs.S
> +++ b/src/entryfuncs.S
> @@ -9,6 +9,30 @@
> * Entry macros
> ****************************************************************/
>
> + .macro PUSHBREGS
> + pushl %eax // Save registers (matches struct bregs)
> + pushl %ecx
> + pushl %edx
> + pushl %ebx
> + pushl %ebp
> + pushl %esi
> + pushl %edi
> + pushw %es
> + pushw %ds
> + .endm
> +
> + .macro POPBREGS
> + popw %ds // Restore registers (from struct bregs)
> + popw %es
> + popl %edi
> + popl %esi
> + popl %ebp
> + popl %ebx
> + popl %edx
> + popl %ecx
> + popl %eax
> + .endm
> +
> // Call a C function - this does the minimal work necessary to
> // call into C. It sets up %ds, backs up %es, and backs up
> // those registers that are call clobbered by the C compiler.
> @@ -63,15 +87,7 @@
> .macro ENTRY_ARG cfunc
> cli
> cld
> - pushl %eax // Save registers (matches struct bregs)
> - pushl %ecx
> - pushl %edx
> - pushl %ebx
> - pushl %ebp
> - pushl %esi
> - pushl %edi
> - pushw %es
> - pushw %ds
> + PUSHBREGS
> movw %ss, %ax // Move %ss to %ds
> movw %ax, %ds
> movl %esp, %ebx // Backup %esp, then zero high bits
> @@ -79,15 +95,7 @@
> movl %esp, %eax // First arg is pointer to struct bregs
> calll \cfunc
> movl %ebx, %esp // Restore %esp (including high bits)
> - popw %ds // Restore registers (from struct bregs)
> - popw %es
> - popl %edi
> - popl %esi
> - popl %ebp
> - popl %ebx
> - popl %edx
> - popl %ecx
> - popl %eax
> + POPBREGS
> .endm
>
> // As above, but get calling function from stack.
> @@ -111,43 +119,19 @@
> movl %esp, %eax // First arg is pointer to struct bregs
> calll *%ecx
> movl %ebx, %esp // Restore %esp (including high bits)
> - popw %ds // Restore registers (from struct bregs)
> - popw %es
> - popl %edi
> - popl %esi
> - popl %ebp
> - popl %ebx
> - popl %edx
> - popl %ecx
> - popl %eax
> + POPBREGS
> .endm
>
> // Same as ENTRY_ARG, but don't mangle %esp
> .macro ENTRY_ARG_ESP cfunc
> cli
> cld
> - pushl %eax // Save registers (matches struct bregs)
> - pushl %ecx
> - pushl %edx
> - pushl %ebx
> - pushl %ebp
> - pushl %esi
> - pushl %edi
> - pushw %es
> - pushw %ds
> + PUSHBREGS
> movw %ss, %ax // Move %ss to %ds
> movw %ax, %ds
> movl %esp, %eax // First arg is pointer to struct bregs
> calll \cfunc
> - popw %ds // Restore registers (from struct bregs)
> - popw %es
> - popl %edi
> - popl %esi
> - popl %ebp
> - popl %ebx
> - popl %edx
> - popl %ecx
> - popl %eax
> + POPBREGS
> .endm
>
> // Reset stack, transition to 32bit mode, and call a C function.
> --
> 1.8.0.2
>
>
> _______________________________________________
> SeaBIOS mailing list
> SeaBIOS at seabios.org
> http://www.seabios.org/mailman/listinfo/seabios
--
http://se-eng.com
More information about the SeaBIOS
mailing list