diff options
author | Ian Moffett <ian@osmora.org> | 2024-07-29 02:17:24 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2024-07-29 02:17:24 -0400 |
commit | f312ec0097a1f518e9585c5756443752c457d60e (patch) | |
tree | c68106b2c6afa5ffa6207ad68dc1458d19b92b8a /sys/include/arch/amd64 | |
parent | 6b6133186d9eb1fb076e63013b1ed3bdaebea973 (diff) |
kernel/amd64: Use only defines + handle err codes
- Use only defines in frame.h
- Improve handling of trap error codes
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys/include/arch/amd64')
-rw-r--r-- | sys/include/arch/amd64/frameasm.h | 135 |
1 files changed, 75 insertions, 60 deletions
diff --git a/sys/include/arch/amd64/frameasm.h b/sys/include/arch/amd64/frameasm.h index 41c9ebe..5a4210f 100644 --- a/sys/include/arch/amd64/frameasm.h +++ b/sys/include/arch/amd64/frameasm.h @@ -37,47 +37,45 @@ * XXX: A trapframe created with this must be popped with * pop_trapframe_ec */ -.macro push_trapframe_ec trapno - push %r15 - push %r14 - push %r13 - push %r12 - push %r11 - push %r10 - push %r9 - push %r8 - push %rbp - push %rdi - push %rsi - push %rbx - push %rdx - push %rcx - push %rax - push \trapno -.endm +#define PUSH_TRAPFRAME_EC(TRAPNO) \ + push %r15 ; \ + push %r14 ; \ + push %r13 ; \ + push %r12 ; \ + push %r11 ; \ + push %r10 ; \ + push %r9 ; \ + push %r8 ; \ + push %rbp ; \ + push %rdi ; \ + push %rsi ; \ + push %rbx ; \ + push %rdx ; \ + push %rcx ; \ + push %rax ; \ + push TRAPNO /* * If the interrupt has an error code, this macro shall * be used to cleanup the trapframe. */ -.macro pop_trapframe_ec - add $8, %rsp /* Trapno */ - pop %rax - pop %rcx - pop %rdx - pop %rbx - pop %rsi - pop %rdi - pop %rbp - pop %r8 - pop %r9 - pop %r10 - pop %r11 - pop %r12 - pop %r13 - pop %r14 +#define POP_TRAPFRAME_EC \ + add $8, %rsp /* Trapno */ ; \ + pop %rax ; \ + pop %rcx ; \ + pop %rdx ; \ + pop %rbx ; \ + pop %rsi ; \ + pop %rdi ; \ + pop %rbp ; \ + pop %r8 ; \ + pop %r9 ; \ + pop %r10 ; \ + pop %r11 ; \ + pop %r12 ; \ + pop %r13 ; \ + pop %r14 ; \ pop %r15 -.endm /* * If the interrupt has no error code, this macro @@ -86,20 +84,17 @@ * XXX: A trapframe created with this must be popped * with pop_trapframe */ -.macro push_trapframe trapno - push $0 - push_trapframe_ec \trapno -.endm - +#define PUSH_TRAPFRAME(TRAPNO) \ + push $0 ; \ + PUSH_TRAPFRAME_EC(TRAPNO) /* * If the interrupt has no error code, this macro shall * be used to cleanup the trapframe. */ -.macro pop_trapframe - pop_trapframe_ec - add $8, %rsp /* Pop error code */ -.endm +#define POP_TRAPFRAME \ + POP_TRAPFRAME_EC ; \ + add $8, %rsp /* * Generic interrupt entry. @@ -110,10 +105,10 @@ jz 1f ; \ lfence ; \ swapgs ; \ - 1: push_trapframe $0 ; \ + 1: PUSH_TRAPFRAME($0) ; \ mov %rsp, %rdi ; \ call HANDLER ; \ - pop_trapframe ; \ + POP_TRAPFRAME ; \ testq $0x3, 8(%rsp) ; \ jz 2f ; \ lfence ; \ @@ -124,20 +119,40 @@ * Trap entry where an error code is on * the stack. */ -#define TRAPENTRY(ENTLABEL, TRAPNO) \ - ENTLABEL: \ - testq $0x3, 16(%rsp) ; \ - jz 1f ; \ - lfence ; \ - swapgs ; \ - 1: push_trapframe_ec TRAPNO ; \ - mov %rsp, %rdi ; \ - call trap_handler ; \ - pop_trapframe_ec ; \ - testq $0x3, 16(%rsp) ; \ - jz 2f ; \ - lfence ; \ - swapgs ; \ +#define TRAPENTRY_EC(ENTLABEL, TRAPNO) \ + ENTLABEL: ; \ + testq $0x3, 16(%rsp) ; \ + jz 1f ; \ + lfence ; \ + swapgs ; \ + 1: PUSH_TRAPFRAME_EC(TRAPNO) ; \ + mov %rsp, %rdi ; \ + call trap_handler ; \ + POP_TRAPFRAME_EC ; \ + testq $0x3, 16(%rsp) ; \ + jz 2f ; \ + lfence ; \ + swapgs ; \ + 2: iretq + +/* + * Trap entry where no error code is on + * the stack. + */ +#define TRAPENTRY(ENTLABEL, TRAPNO) \ + ENTLABEL: ; \ + testq $0x3, 8(%rsp) ; \ + jz 1f ; \ + lfence ; \ + swapgs ; \ + 1: PUSH_TRAPFRAME(TRAPNO) ; \ + mov %rsp, %rdi ; \ + call trap_handler ; \ + POP_TRAPFRAME ; \ + testq $0x3, 8(%rsp) ; \ + jz 2f ; \ + lfence ; \ + swapgs ; \ 2: iretq #endif /* !_MACHINE_FRAMEASM_H_ */ |