ptos/amd64: frame: Add assembly frame macros
Signed-off-by: Chloe M <chloe@mensia.org>
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
* Copyright (c) 2026, Chloe M.
|
||||
* Provided under the BSD-3 clause.
|
||||
*
|
||||
* Description: AMD64 trapframe helpers
|
||||
* Author: Chloe M.
|
||||
*/
|
||||
|
||||
#ifndef _MACHINE_FRAMEASM_H_
|
||||
#define _MACHINE_FRAMEASM_H_ 1
|
||||
|
||||
/*
|
||||
* Push all general purpose registers alongside an
|
||||
* interrupt vector number
|
||||
*/
|
||||
#define _TRAP_PUSHALL(VEC) \
|
||||
push %r15 ;\
|
||||
push %r14 ;\
|
||||
push %r13 ;\
|
||||
push %r12 ;\
|
||||
push %r11 ;\
|
||||
push %r10 ;\
|
||||
push %r9 ;\
|
||||
push %r8 ;\
|
||||
push %rbp ;\
|
||||
push %rdi ;\
|
||||
push %rsi ;\
|
||||
push %rdx ;\
|
||||
push %rcx ;\
|
||||
push %rbx ;\
|
||||
push %rax ;\
|
||||
push $VEC
|
||||
|
||||
/*
|
||||
* Pop an interrupt vector alongside all general purpose
|
||||
* registers
|
||||
*/
|
||||
#define _TRAP_POPALL() ;\
|
||||
add $8, %rsp ;\
|
||||
pop %rax ;\
|
||||
pop %rbx ;\
|
||||
pop %rcx ;\
|
||||
pop %rdx ;\
|
||||
pop %rsi ;\
|
||||
pop %rdi ;\
|
||||
pop %rbp ;\
|
||||
pop %r8 ;\
|
||||
pop %r9 ;\
|
||||
pop %r10 ;\
|
||||
pop %r11 ;\
|
||||
pop %r12 ;\
|
||||
pop %r13 ;\
|
||||
pop %r14 ;\
|
||||
pop %r15 ;\
|
||||
add $8, %rsp
|
||||
|
||||
/*
|
||||
* Interrupt entry macro used when the CPU pushes an error
|
||||
* code onto the stack.
|
||||
*/
|
||||
#define INTR_ENTRY_EC(VEC) \
|
||||
cld ;\
|
||||
_TRAP_PUSHALL() ;\
|
||||
testb $3, 16(%rsp) ;\
|
||||
jz 1f ;\
|
||||
lfence ;\
|
||||
swapgs ;\
|
||||
1:
|
||||
|
||||
/*
|
||||
* Interrupt entry macro used when there is no error code pushed
|
||||
* onto the stack.
|
||||
*/
|
||||
#define INTR_ENTRY(VEC) ;\
|
||||
cld ;\
|
||||
push $0 ;\
|
||||
_TRAP_PUSHALL() ;\
|
||||
testb $3, 8(%rsp) ;\
|
||||
jz 1f ;\
|
||||
lfence ;\
|
||||
swapgs ;\
|
||||
1:
|
||||
|
||||
/*
|
||||
* Interrupt exit macro used when there is no error code
|
||||
* pushed onto the stack.
|
||||
*/
|
||||
#define INTR_EXIT() ;\
|
||||
_POP_FRAME() ;\
|
||||
testb $3, 8(%rsp) ;\
|
||||
jz 1f ;\
|
||||
lfence ;\
|
||||
swapgs ;\
|
||||
1:
|
||||
|
||||
#endif /* !_MACHINE_FRAMEASM_H_ */
|
||||
Reference in New Issue
Block a user