mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
minios: Clean up and remove Linux remnants from x86_64.S
Sigend-off-by: Keir Fraser <keir.fraser@citrix.com>
This commit is contained in:
1 parent
a2b4ad1e99
commit
eedc9ebb14
1 file changed
+20
-111
@@ -46,88 +46,21 @@ NMI_MASK = 0x80000000
|
||||
#define ORIG_RAX 120 /* + error_code */
|
||||
#define EFLAGS 144
|
||||
|
||||
#define REST_SKIP 6*8
|
||||
.macro SAVE_REST
|
||||
subq $REST_SKIP,%rsp
|
||||
# CFI_ADJUST_CFA_OFFSET REST_SKIP
|
||||
movq %rbx,5*8(%rsp)
|
||||
# CFI_REL_OFFSET rbx,5*8
|
||||
movq %rbp,4*8(%rsp)
|
||||
# CFI_REL_OFFSET rbp,4*8
|
||||
movq %r12,3*8(%rsp)
|
||||
# CFI_REL_OFFSET r12,3*8
|
||||
movq %r13,2*8(%rsp)
|
||||
# CFI_REL_OFFSET r13,2*8
|
||||
movq %r14,1*8(%rsp)
|
||||
# CFI_REL_OFFSET r14,1*8
|
||||
movq %r15,(%rsp)
|
||||
# CFI_REL_OFFSET r15,0*8
|
||||
.endm
|
||||
|
||||
|
||||
.macro RESTORE_REST
|
||||
movq (%rsp),%r15
|
||||
# CFI_RESTORE r15
|
||||
movq 1*8(%rsp),%r14
|
||||
# CFI_RESTORE r14
|
||||
movq 2*8(%rsp),%r13
|
||||
# CFI_RESTORE r13
|
||||
movq 3*8(%rsp),%r12
|
||||
# CFI_RESTORE r12
|
||||
movq 4*8(%rsp),%rbp
|
||||
# CFI_RESTORE rbp
|
||||
movq 5*8(%rsp),%rbx
|
||||
# CFI_RESTORE rbx
|
||||
addq $REST_SKIP,%rsp
|
||||
# CFI_ADJUST_CFA_OFFSET -(REST_SKIP)
|
||||
.endm
|
||||
|
||||
|
||||
#define ARG_SKIP 9*8
|
||||
.macro RESTORE_ARGS skiprax=0,addskip=0,skiprcx=0,skipr11=0,skipr8910=0,skiprdx=0
|
||||
.if \skipr11
|
||||
.else
|
||||
.macro RESTORE_ALL
|
||||
movq (%rsp),%r11
|
||||
# CFI_RESTORE r11
|
||||
.endif
|
||||
.if \skipr8910
|
||||
.else
|
||||
movq 1*8(%rsp),%r10
|
||||
# CFI_RESTORE r10
|
||||
movq 2*8(%rsp),%r9
|
||||
# CFI_RESTORE r9
|
||||
movq 3*8(%rsp),%r8
|
||||
# CFI_RESTORE r8
|
||||
.endif
|
||||
.if \skiprax
|
||||
.else
|
||||
movq 4*8(%rsp),%rax
|
||||
# CFI_RESTORE rax
|
||||
.endif
|
||||
.if \skiprcx
|
||||
.else
|
||||
movq 5*8(%rsp),%rcx
|
||||
# CFI_RESTORE rcx
|
||||
.endif
|
||||
.if \skiprdx
|
||||
.else
|
||||
movq 6*8(%rsp),%rdx
|
||||
# CFI_RESTORE rdx
|
||||
.endif
|
||||
movq 7*8(%rsp),%rsi
|
||||
# CFI_RESTORE rsi
|
||||
movq 8*8(%rsp),%rdi
|
||||
# CFI_RESTORE rdi
|
||||
.if ARG_SKIP+\addskip > 0
|
||||
addq $ARG_SKIP+\addskip,%rsp
|
||||
# CFI_ADJUST_CFA_OFFSET -(ARG_SKIP+\addskip)
|
||||
.endif
|
||||
addq $9*8+8,%rsp
|
||||
.endm
|
||||
|
||||
|
||||
.macro HYPERVISOR_IRET flag
|
||||
# testb $3,1*8(%rsp) /* Don't need to do that in Mini-os, as */
|
||||
# jnz 2f /* there is no userspace? */
|
||||
testl $NMI_MASK,2*8(%rsp)
|
||||
jnz 2f
|
||||
|
||||
@@ -150,44 +83,25 @@ NMI_MASK = 0x80000000
|
||||
* and the exception handler in %rax.
|
||||
*/
|
||||
ENTRY(error_entry)
|
||||
# _frame RDI
|
||||
/* rdi slot contains rax, oldrax contains error code */
|
||||
cld
|
||||
subq $14*8,%rsp
|
||||
# CFI_ADJUST_CFA_OFFSET (14*8)
|
||||
movq %rsi,13*8(%rsp)
|
||||
# CFI_REL_OFFSET rsi,RSI
|
||||
movq 14*8(%rsp),%rsi /* load rax from rdi slot */
|
||||
movq %rdx,12*8(%rsp)
|
||||
# CFI_REL_OFFSET rdx,RDX
|
||||
movq %rcx,11*8(%rsp)
|
||||
# CFI_REL_OFFSET rcx,RCX
|
||||
movq %rsi,10*8(%rsp) /* store rax */
|
||||
# CFI_REL_OFFSET rax,RAX
|
||||
movq %r8, 9*8(%rsp)
|
||||
# CFI_REL_OFFSET r8,R8
|
||||
movq %r9, 8*8(%rsp)
|
||||
# CFI_REL_OFFSET r9,R9
|
||||
movq %r10,7*8(%rsp)
|
||||
# CFI_REL_OFFSET r10,R10
|
||||
movq %r11,6*8(%rsp)
|
||||
# CFI_REL_OFFSET r11,R11
|
||||
movq %rbx,5*8(%rsp)
|
||||
# CFI_REL_OFFSET rbx,RBX
|
||||
movq %rbp,4*8(%rsp)
|
||||
# CFI_REL_OFFSET rbp,RBP
|
||||
movq %r12,3*8(%rsp)
|
||||
# CFI_REL_OFFSET r12,R12
|
||||
movq %r13,2*8(%rsp)
|
||||
# CFI_REL_OFFSET r13,R13
|
||||
movq %r14,1*8(%rsp)
|
||||
# CFI_REL_OFFSET r14,R14
|
||||
movq %r15,(%rsp)
|
||||
# CFI_REL_OFFSET r15,R15
|
||||
#if 0
|
||||
cmpl $__KERNEL_CS,CS(%rsp)
|
||||
je error_kernelspace
|
||||
#endif
|
||||
|
||||
error_call_handler:
|
||||
movq %rdi, RDI(%rsp)
|
||||
movq %rsp,%rdi
|
||||
@@ -197,29 +111,22 @@ error_call_handler:
|
||||
jmp error_exit
|
||||
|
||||
.macro zeroentry sym
|
||||
# INTR_FRAME
|
||||
movq (%rsp),%rcx
|
||||
movq 8(%rsp),%r11
|
||||
addq $0x10,%rsp /* skip rcx and r11 */
|
||||
pushq $0 /* push error code/oldrax */
|
||||
# CFI_ADJUST_CFA_OFFSET 8
|
||||
pushq %rax /* push real oldrax to the rdi slot */
|
||||
# CFI_ADJUST_CFA_OFFSET 8
|
||||
leaq \sym(%rip),%rax
|
||||
jmp error_entry
|
||||
# CFI_ENDPROC
|
||||
.endm
|
||||
|
||||
.macro errorentry sym
|
||||
# XCPT_FRAME
|
||||
movq (%rsp),%rcx
|
||||
movq 8(%rsp),%r11
|
||||
addq $0x10,%rsp /* rsp points to the error code */
|
||||
pushq %rax
|
||||
# CFI_ADJUST_CFA_OFFSET 8
|
||||
leaq \sym(%rip),%rax
|
||||
jmp error_entry
|
||||
# CFI_ENDPROC
|
||||
.endm
|
||||
|
||||
#define XEN_GET_VCPU_INFO(reg) movq HYPERVISOR_shared_info,reg
|
||||
@@ -253,7 +160,6 @@ ENTRY(hypervisor_callback2)
|
||||
decl %gs:0
|
||||
jmp error_exit
|
||||
|
||||
# ALIGN
|
||||
restore_all_enable_events:
|
||||
XEN_UNBLOCK_EVENTS(%rsi) # %rsi is already set up...
|
||||
|
||||
@@ -261,12 +167,18 @@ scrit: /**** START OF CRITICAL REGION ****/
|
||||
XEN_TEST_PENDING(%rsi)
|
||||
jnz 14f # process more events if necessary...
|
||||
XEN_PUT_VCPU_INFO(%rsi)
|
||||
RESTORE_ARGS 0,8,0
|
||||
RESTORE_ALL
|
||||
HYPERVISOR_IRET 0
|
||||
|
||||
14: XEN_LOCKED_BLOCK_EVENTS(%rsi)
|
||||
XEN_PUT_VCPU_INFO(%rsi)
|
||||
SAVE_REST
|
||||
subq $6*8,%rsp
|
||||
movq %rbx,5*8(%rsp)
|
||||
movq %rbp,4*8(%rsp)
|
||||
movq %r12,3*8(%rsp)
|
||||
movq %r13,2*8(%rsp)
|
||||
movq %r14,1*8(%rsp)
|
||||
movq %r15,(%rsp)
|
||||
movq %rsp,%rdi # set the argument again
|
||||
jmp 11b
|
||||
ecrit: /**** END OF CRITICAL REGION ****/
|
||||
@@ -274,7 +186,7 @@ ecrit: /**** END OF CRITICAL REGION ****/
|
||||
|
||||
retint_kernel:
|
||||
retint_restore_args:
|
||||
movl EFLAGS-REST_SKIP(%rsp), %eax
|
||||
movl EFLAGS-6*8(%rsp), %eax
|
||||
shr $9, %eax # EAX[0] == IRET_EFLAGS.IF
|
||||
XEN_GET_VCPU_INFO(%rsi)
|
||||
andb evtchn_upcall_mask(%rsi),%al
|
||||
@@ -282,13 +194,18 @@ retint_restore_args:
|
||||
jnz restore_all_enable_events # != 0 => enable event delivery
|
||||
XEN_PUT_VCPU_INFO(%rsi)
|
||||
|
||||
RESTORE_ARGS 0,8,0
|
||||
RESTORE_ALL
|
||||
HYPERVISOR_IRET 0
|
||||
|
||||
|
||||
error_exit:
|
||||
RESTORE_REST
|
||||
/* cli */
|
||||
movq (%rsp),%r15
|
||||
movq 1*8(%rsp),%r14
|
||||
movq 2*8(%rsp),%r13
|
||||
movq 3*8(%rsp),%r12
|
||||
movq 4*8(%rsp),%rbp
|
||||
movq 5*8(%rsp),%rbx
|
||||
addq $6*8,%rsp
|
||||
XEN_BLOCK_EVENTS(%rsi)
|
||||
jmp retint_kernel
|
||||
|
||||
@@ -313,17 +230,11 @@ ENTRY(device_not_available)
|
||||
|
||||
|
||||
ENTRY(debug)
|
||||
# INTR_FRAME
|
||||
# CFI_ADJUST_CFA_OFFSET 8 */
|
||||
zeroentry do_debug
|
||||
# CFI_ENDPROC
|
||||
|
||||
|
||||
ENTRY(int3)
|
||||
# INTR_FRAME
|
||||
# CFI_ADJUST_CFA_OFFSET 8 */
|
||||
zeroentry do_int3
|
||||
# CFI_ENDPROC
|
||||
|
||||
ENTRY(overflow)
|
||||
zeroentry do_overflow
|
||||
@@ -351,9 +262,7 @@ ENTRY(segment_not_present)
|
||||
|
||||
/* runs on exception stack */
|
||||
ENTRY(stack_segment)
|
||||
# XCPT_FRAME
|
||||
errorentry do_stack_segment
|
||||
# CFI_ENDPROC
|
||||
|
||||
|
||||
ENTRY(general_protection)
|
||||
|
||||