diff options
author | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2005-02-11 18:04:56 +0000 |
---|---|---|
committer | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2005-02-11 18:04:56 +0000 |
commit | 054206d161ad06d19298132f1c3a54d2a1598270 (patch) | |
tree | 8e4829d2ba79a078e5175c2efc717e5fbcafcfb1 /extras/mini-os/x86_64.S | |
parent | 28268ccd6d678a5bff48c00acc014f6c9df639cc (diff) | |
download | xen-054206d161ad06d19298132f1c3a54d2a1598270.tar.gz xen-054206d161ad06d19298132f1c3a54d2a1598270.tar.bz2 xen-054206d161ad06d19298132f1c3a54d2a1598270.zip |
bitkeeper revision 1.1185 (420cf3c8-bMMcsnH1kMVRwy5AQ-ecg)
Various mini-os and Xen fixes. The M2P table is now definitely
accessible (read-only) from guest context.
Signed-off-by: keir.fraser@cl.cam.ac.uk
Diffstat (limited to 'extras/mini-os/x86_64.S')
-rw-r--r-- | extras/mini-os/x86_64.S | 160 |
1 files changed, 152 insertions, 8 deletions
diff --git a/extras/mini-os/x86_64.S b/extras/mini-os/x86_64.S index 4a4708ddd5..0f37d596f7 100644 --- a/extras/mini-os/x86_64.S +++ b/extras/mini-os/x86_64.S @@ -6,7 +6,42 @@ #define ENTRY(X) .globl X ; X : .globl _start, shared_info - + +#define SAVE_ALL \ + cld; \ + pushq %rdi; \ + pushq %rsi; \ + pushq %rdx; \ + pushq %rcx; \ + pushq %rax; \ + pushq %r8; \ + pushq %r9; \ + pushq %r10; \ + pushq %r11; \ + pushq %rbx; \ + pushq %rbp; \ + pushq %r12; \ + pushq %r13; \ + pushq %r14; \ + pushq %r15; + +#define RESTORE_ALL \ + popq %r15; \ + popq %r14; \ + popq %r13; \ + popq %r12; \ + popq %rbp; \ + popq %rbx; \ + popq %r11; \ + popq %r10; \ + popq %r9; \ + popq %r8; \ + popq %rax; \ + popq %rcx; \ + popq %rdx; \ + popq %rsi; \ + popq %rdi + _start: cld movq stack_start(%rip),%rsp @@ -23,56 +58,165 @@ shared_info: .org 0x2000 ENTRY(hypervisor_callback) + popq %rcx + popq %r11 + iretq ENTRY(failsafe_callback) - iret - + popq %rcx + popq %r11 + iretq + +error_code: + SAVE_ALL + movq %rsp,%rdi + movl 15*8+4(%rsp),%eax + leaq exception_table(%rip),%rdx + callq *(%rdx,%rax,8) + RESTORE_ALL + addq $8,%rsp + iretq + ENTRY(divide_error) + popq %rcx + popq %r11 pushq $0 - + movl $TRAP_divide_error,4(%rsp) + jmp error_code + ENTRY(coprocessor_error) + popq %rcx + popq %r11 pushq $0 + movl $TRAP_copro_error,4(%rsp) + jmp error_code ENTRY(simd_coprocessor_error) + popq %rcx + popq %r11 pushq $0 + movl $TRAP_simd_error,4(%rsp) + jmp error_code ENTRY(device_not_available) - iret + popq %rcx + popq %r11 + movl $TRAP_no_device,4(%rsp) + jmp error_code ENTRY(debug) + popq %rcx + popq %r11 pushq $0 + movl $TRAP_debug,4(%rsp) + jmp error_code ENTRY(int3) + popq %rcx + popq %r11 pushq $0 + movl $TRAP_int3,4(%rsp) + jmp error_code ENTRY(overflow) + popq %rcx + popq %r11 pushq $0 + movl $TRAP_overflow,4(%rsp) + jmp error_code ENTRY(bounds) + popq %rcx + popq %r11 pushq $0 + movl $TRAP_bounds,4(%rsp) + jmp error_code ENTRY(invalid_op) + popq %rcx + popq %r11 pushq $0 + movl $TRAP_invalid_op,4(%rsp) + jmp error_code ENTRY(coprocessor_segment_overrun) + popq %rcx + popq %r11 pushq $0 - -ENTRY(double_fault) + movl $TRAP_copro_seg,4(%rsp) + jmp error_code ENTRY(invalid_TSS) + popq %rcx + popq %r11 + movl $TRAP_invalid_tss,4(%rsp) + jmp error_code ENTRY(segment_not_present) + popq %rcx + popq %r11 + movl $TRAP_no_segment,4(%rsp) + jmp error_code ENTRY(stack_segment) + popq %rcx + popq %r11 + movl $TRAP_stack_error,4(%rsp) + jmp error_code ENTRY(general_protection) + popq %rcx + popq %r11 + movl $TRAP_gp_fault,4(%rsp) + jmp error_code ENTRY(alignment_check) + popq %rcx + popq %r11 + movl $TRAP_alignment_check,4(%rsp) + jmp error_code +ENTRY(virt_cr2) + .quad 0 ENTRY(page_fault) - + popq %rcx + popq %r11 + popq virt_cr2(%rip) + movl $TRAP_page_fault,4(%rsp) + jmp error_code + ENTRY(machine_check) + popq %rcx + popq %r11 pushq $0 + movl $TRAP_machine_check,4(%rsp) + jmp error_code ENTRY(spurious_interrupt_bug) + popq %rcx + popq %r11 pushq $0 + movl $TRAP_spurious_int,4(%rsp) + jmp error_code + +ENTRY(exception_table) + .quad do_divide_error + .quad do_debug + .quad 0 # nmi + .quad do_int3 + .quad do_overflow + .quad do_bounds + .quad do_invalid_op + .quad 0 + .quad 0 + .quad do_coprocessor_segment_overrun + .quad do_invalid_TSS + .quad do_segment_not_present + .quad do_stack_segment + .quad do_general_protection + .quad do_page_fault + .quad do_spurious_interrupt_bug + .quad do_coprocessor_error + .quad do_alignment_check + .quad do_machine_check + .quad do_simd_coprocessor_error |