aboutsummaryrefslogtreecommitdiff
path: root/src/entryfuncs.S
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2009-05-06 23:33:32 -0400
committerKevin O'Connor <kevin@koconnor.net>2009-05-06 23:33:32 -0400
commitf8e176c48b0a4c6609f06786052ba711b324ca2a (patch)
tree34349dd4e7e7d8944322985600fd127a2b58f92a /src/entryfuncs.S
parent4edb2759795a5679bc4858e225d5b597e7dcd7dc (diff)
downloadseabios-hppa-f8e176c48b0a4c6609f06786052ba711b324ca2a.zip
seabios-hppa-f8e176c48b0a4c6609f06786052ba711b324ca2a.tar.gz
seabios-hppa-f8e176c48b0a4c6609f06786052ba711b324ca2a.tar.bz2
Move assembler entry macros in romlayout.S into new file entryfuncs.S.
This allows the entry macros to be used in other assembler code.
Diffstat (limited to 'src/entryfuncs.S')
-rw-r--r--src/entryfuncs.S134
1 files changed, 134 insertions, 0 deletions
diff --git a/src/entryfuncs.S b/src/entryfuncs.S
new file mode 100644
index 0000000..ad0c79d
--- /dev/null
+++ b/src/entryfuncs.S
@@ -0,0 +1,134 @@
+// Macros for entering C code
+//
+// Copyright (C) 2008,2009 Kevin O'Connor <kevin@koconnor.net>
+//
+// This file may be distributed under the terms of the GNU LGPLv3 license.
+
+
+/****************************************************************
+ * Entry macros
+ ****************************************************************/
+
+ // 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.
+ .macro ENTRY cfunc
+ cli // In case something far-calls instead of using "int"
+ cld
+ pushl %eax // Save registers clobbered by C code
+ pushl %ecx
+ pushl %edx
+ pushw %es
+ pushw %ds
+ movw %ss, %ax // Move %ss to %ds
+ movw %ax, %ds
+ pushl %esp // Backup %esp, then clear high bits
+ movzwl %sp, %esp
+ calll \cfunc
+ popl %esp // Restore %esp (including high bits)
+ popw %ds // Restore registers saved above
+ popw %es
+ popl %edx
+ popl %ecx
+ popl %eax
+ .endm
+
+ // Call a C function with current register list as an
+ // argument. This backs up the registers and sets %eax
+ // to point to the backup. On return, the registers are
+ // restored from the structure.
+ .macro ENTRY_ARG cfunc
+ cli
+ cld
+ pushl %eax // Save registers (matches struct bregs)
+ pushl %ecx
+ pushl %edx
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ pushw %es
+ pushw %ds
+ movw %ss, %ax // Move %ss to %ds
+ movw %ax, %ds
+ movl %esp, %ebx // Backup %esp, then zero high bits
+ movzwl %sp, %esp
+ 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 %ebx
+ popl %edx
+ popl %ecx
+ popl %eax
+ .endm
+
+ // As above, 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 %esi
+ pushl %edi
+ pushw %es
+ pushw %ds
+ 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 %ebx
+ popl %edx
+ popl %ecx
+ popl %eax
+ .endm
+
+ // Reset stack, transition to 32bit mode, and call a C function.
+ // Clobbers %ax
+ .macro ENTRY_INTO32 cfunc
+ xorw %ax, %ax
+ movw %ax, %ss
+ movl $ BUILD_STACK_ADDR , %esp
+ pushl $ \cfunc
+ jmp transition32
+ .endm
+
+ // Declare a function
+ .macro DECLFUNC func
+ .section .text.asm.\func
+ .global \func
+ .endm
+
+ // Define an entry point for an interrupt (no args passed).
+ .macro IRQ_ENTRY num
+ .global entry_\num
+ entry_\num :
+ ENTRY handle_\num
+ iretw
+ .endm
+
+ // Define an entry point for an interrupt (can read/modify args).
+ .macro IRQ_ENTRY_ARG num
+ .global entry_\num
+ entry_\num :
+ ENTRY_ARG handle_\num
+ iretw
+ .endm
+
+ // Macros that put each handler into its own section
+ .macro DECL_IRQ_ENTRY num
+ .section .text.asm.entry_\num
+ IRQ_ENTRY \num
+ .endm
+ .macro DECL_IRQ_ENTRY_ARG num
+ .section .text.asm.entry_\num
+ IRQ_ENTRY_ARG \num
+ .endm