diff options
-rw-r--r-- | .hgignore | 2 | ||||
-rw-r--r-- | extras/mini-os/Makefile | 8 | ||||
-rw-r--r-- | extras/mini-os/sched.c | 2 | ||||
-rw-r--r-- | extras/mini-os/traps.c | 10 | ||||
-rw-r--r-- | extras/mini-os/x86_32.S | 53 | ||||
-rw-r--r-- | extras/mini-os/x86_64.S | 219 |
6 files changed, 96 insertions, 198 deletions
@@ -14,6 +14,7 @@ .*\.orig$ .*\.rej$ .*/a\.out$ +.*cscope\.*$ ^[^/]*\.bz2$ ^TAGS$ ^dist/.*$ @@ -184,7 +185,6 @@ ^tools/xm-test/ramdisk/buildroot ^xen/BLOG$ ^xen/TAGS$ -^xen/cscope\.*$ ^xen/arch/x86/asm-offsets\.s$ ^xen/arch/x86/boot/mkelf32$ ^xen/arch/x86/xen\.lds$ diff --git a/extras/mini-os/Makefile b/extras/mini-os/Makefile index 2271f00be2..3a31e3a0d6 100644 --- a/extras/mini-os/Makefile +++ b/extras/mini-os/Makefile @@ -60,4 +60,12 @@ clean: %.o: %.S $(HDRS) Makefile $(CC) $(CFLAGS) -D__ASSEMBLY__ -c $< -o $@ +define all_sources + ( find . -follow -name SCCS -prune -o -name '*.[chS]' -print ) +endef + +.PHONY: cscope +cscope: + $(all_sources) > cscope.files + cscope -k -b -q diff --git a/extras/mini-os/sched.c b/extras/mini-os/sched.c index 68d4805d03..ee1adb6549 100644 --- a/extras/mini-os/sched.c +++ b/extras/mini-os/sched.c @@ -324,7 +324,7 @@ void th_f2(void *data) void init_sched(void) { - printk("Initialising scheduler, idle_thread %p\n", idle_thread); + printk("Initialising scheduler\n"); idle_thread = create_thread("Idle", idle_thread_fn, NULL); INIT_LIST_HEAD(&idle_thread->thread_list); diff --git a/extras/mini-os/traps.c b/extras/mini-os/traps.c index e11192040b..b6f366818e 100644 --- a/extras/mini-os/traps.c +++ b/extras/mini-os/traps.c @@ -123,8 +123,13 @@ void page_walk(unsigned long virt_address) void do_page_fault(struct pt_regs *regs, unsigned long error_code) { unsigned long addr = read_cr2(); - printk("Page fault at linear address %p, regs %p, code %lx\n", addr, regs, - error_code); +#if defined(__x86_64__) + printk("Page fault at linear address %p, rip %p, code %lx\n", + addr, regs->rip, error_code); +#else + printk("Page fault at linear address %p, eip %p, code %lx\n", + addr, regs->eip, error_code); +#endif dump_regs(regs); page_walk(addr); do_exit(); @@ -195,7 +200,6 @@ static trap_info_t trap_table[] = { { 15, 0, __KERNEL_CS, (unsigned long)spurious_interrupt_bug }, { 16, 0, __KERNEL_CS, (unsigned long)coprocessor_error }, { 17, 0, __KERNEL_CS, (unsigned long)alignment_check }, - { 18, 0, __KERNEL_CS, (unsigned long)machine_check }, { 19, 0, __KERNEL_CS, (unsigned long)simd_coprocessor_error }, { 0, 0, 0, 0 } }; diff --git a/extras/mini-os/x86_32.S b/extras/mini-os/x86_32.S index 1e83cb3bf8..f434b3233e 100644 --- a/extras/mini-os/x86_32.S +++ b/extras/mini-os/x86_32.S @@ -30,10 +30,10 @@ shared_info: hypercall_page: .org 0x3000 -ES = 0x1c -ORIG_EAX = 0x20 -EIP = 0x24 -CS = 0x28 +ES = 0x20 +ORIG_EAX = 0x24 +EIP = 0x28 +CS = 0x2C #define ENTRY(X) .globl X ; X : @@ -69,7 +69,7 @@ ENTRY(divide_error) pushl $0 # no error code pushl $do_divide_error do_exception: - pushl %ds + pushl %ds pushl %eax xorl %eax, %eax pushl %ebp @@ -92,7 +92,7 @@ do_exception: pushl %edx pushl %eax call *%edi - addl $8,%esp + jmp ret_from_exception ret_from_exception: movb CS(%esp),%cl @@ -223,70 +223,55 @@ ENTRY(invalid_op) pushl $do_invalid_op jmp do_exception + ENTRY(coprocessor_segment_overrun) pushl $0 pushl $do_coprocessor_segment_overrun jmp do_exception + ENTRY(invalid_TSS) pushl $do_invalid_TSS jmp do_exception + ENTRY(segment_not_present) pushl $do_segment_not_present jmp do_exception + ENTRY(stack_segment) pushl $do_stack_segment jmp do_exception + ENTRY(general_protection) pushl $do_general_protection jmp do_exception + ENTRY(alignment_check) pushl $do_alignment_check jmp do_exception -# This handler is special, because it gets an extra value on its stack, -# which is the linear faulting address. -# fastcall register usage: %eax = pt_regs, %edx = error code, -# %ecx = fault address -ENTRY(page_fault) - pushl %ds - pushl %eax - xorl %eax, %eax - pushl %ebp - pushl %edi - pushl %esi - pushl %edx - decl %eax /* eax = -1 */ - pushl %ecx - pushl %ebx - cld - movl ORIG_EAX(%esp), %edi - movl %eax, ORIG_EAX(%esp) - movl %es, %ecx - movl %ecx, ES(%esp) - movl $(__KERNEL_DS),%eax - movl %eax, %ds - movl %eax, %es - pushl %edi - movl %esp, %eax - pushl %eax - call do_page_fault - jmp ret_from_exception +ENTRY(page_fault) + pushl $do_page_fault + jmp do_exception + ENTRY(machine_check) pushl $0 pushl $do_machine_check jmp do_exception + ENTRY(spurious_interrupt_bug) pushl $0 pushl $do_spurious_interrupt_bug jmp do_exception + + ENTRY(thread_starter) popl %eax popl %ebx diff --git a/extras/mini-os/x86_64.S b/extras/mini-os/x86_64.S index ae667810ad..e9d973a094 100644 --- a/extras/mini-os/x86_64.S +++ b/extras/mini-os/x86_64.S @@ -13,40 +13,6 @@ #define ENTRY(X) .globl X ; X : .globl _start, shared_info, hypercall_page -#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 @@ -240,7 +206,17 @@ error_call_handler: # 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 #define XEN_PUT_VCPU_INFO(reg) @@ -319,159 +295,84 @@ ENTRY(failsafe_callback) 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 + zeroentry do_coprocessor_error + ENTRY(simd_coprocessor_error) - popq %rcx - popq %r11 - pushq $0 - movl $TRAP_simd_error,4(%rsp) - jmp error_code + zeroentry do_simd_coprocessor_error + ENTRY(device_not_available) - popq %rcx - popq %r11 - movl $TRAP_no_device,4(%rsp) - jmp error_code + zeroentry do_device_not_available + ENTRY(debug) - popq %rcx - popq %r11 - pushq $0 - movl $TRAP_debug,4(%rsp) - jmp error_code +# INTR_FRAME +# CFI_ADJUST_CFA_OFFSET 8 */ + zeroentry do_debug +# CFI_ENDPROC + ENTRY(int3) - popq %rcx - popq %r11 - pushq $0 - movl $TRAP_int3,4(%rsp) - jmp error_code +# INTR_FRAME +# CFI_ADJUST_CFA_OFFSET 8 */ + zeroentry do_int3 +# CFI_ENDPROC ENTRY(overflow) - popq %rcx - popq %r11 - pushq $0 - movl $TRAP_overflow,4(%rsp) - jmp error_code + zeroentry do_overflow -ENTRY(bounds) - popq %rcx - popq %r11 - pushq $0 - movl $TRAP_bounds,4(%rsp) - jmp error_code +ENTRY(bounds) + zeroentry do_bounds + + ENTRY(invalid_op) - popq %rcx - popq %r11 - pushq $0 - movl $TRAP_invalid_op,4(%rsp) - jmp error_code + zeroentry do_invalid_op + ENTRY(coprocessor_segment_overrun) - popq %rcx - popq %r11 - pushq $0 - movl $TRAP_copro_seg,4(%rsp) - jmp error_code + zeroentry do_coprocessor_segment_overrun + ENTRY(invalid_TSS) - popq %rcx - popq %r11 - movl $TRAP_invalid_tss,4(%rsp) - jmp error_code + errorentry do_invalid_TSS + ENTRY(segment_not_present) - popq %rcx - popq %r11 - movl $TRAP_no_segment,4(%rsp) - jmp error_code + errorentry do_segment_not_present + +/* runs on exception stack */ ENTRY(stack_segment) - popq %rcx - popq %r11 - movl $TRAP_stack_error,4(%rsp) - jmp error_code +# XCPT_FRAME + errorentry do_stack_segment +# CFI_ENDPROC + ENTRY(general_protection) - popq %rcx - popq %r11 - movl $TRAP_gp_fault,4(%rsp) - jmp error_code + errorentry do_general_protection + ENTRY(alignment_check) - popq %rcx - popq %r11 - movl $TRAP_alignment_check,4(%rsp) - jmp error_code + errorentry do_alignment_check + + +ENTRY(divide_error) + zeroentry do_divide_error -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 + zeroentry do_spurious_interrupt_bug + + +ENTRY(page_fault) + errorentry do_page_fault + + + ENTRY(thread_starter) |