aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/x86_64.S
diff options
context:
space:
mode:
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2005-02-11 18:04:56 +0000
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2005-02-11 18:04:56 +0000
commit054206d161ad06d19298132f1c3a54d2a1598270 (patch)
tree8e4829d2ba79a078e5175c2efc717e5fbcafcfb1 /extras/mini-os/x86_64.S
parent28268ccd6d678a5bff48c00acc014f6c9df639cc (diff)
downloadxen-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.S160
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