From: BitKeeper B. <ri...@su...> - 2005-02-14 12:19:11
|
ChangeSet 1.1201, 2005/02/14 11:42:11+00:00, ka...@sc... Fix SMP booting. Clean up x86/64 a bit. Signed-off-by: kei...@cl... arch/x86/domain.c | 20 ++++++++++---------- arch/x86/smpboot.c | 2 +- arch/x86/x86_64/entry.S | 28 +++++++++++++++++++--------- drivers/char/console.c | 2 ++ include/asm-x86/shadow.h | 27 ++++++--------------------- 5 files changed, 38 insertions(+), 41 deletions(-) diff -Nru a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c --- a/xen/arch/x86/domain.c 2005-02-14 07:02:45 -05:00 +++ b/xen/arch/x86/domain.c 2005-02-14 07:02:45 -05:00 @@ -541,6 +541,14 @@ #ifdef __x86_64__ +void toggle_guest_mode(struct exec_domain *ed) +{ + ed->arch.flags ^= TF_kernel_mode; + __asm__ __volatile__ ( "swapgs" ); + update_pagetables(ed); + write_ptbase(ed); +} + #define loadsegment(seg,value) ({ \ int __r = 1; \ __asm__ __volatile__ ( \ @@ -655,12 +663,7 @@ } if ( !(n->arch.flags & TF_kernel_mode) ) - { - n->arch.flags |= TF_kernel_mode; - __asm__ __volatile__ ( "swapgs" ); - update_pagetables(n); - write_ptbase(n); - } + toggle_guest_mode(n); regs->entry_vector = TRAP_syscall; regs->rflags &= 0xFFFCBEFFUL; @@ -681,10 +684,7 @@ unlikely(pagetable_val(ed->arch.guest_table_user) == 0) ) return -EFAULT; - ed->arch.flags &= ~TF_kernel_mode; - __asm__ __volatile__ ( "swapgs" ); - update_pagetables(ed); - write_ptbase(ed); + toggle_guest_mode(ed); regs->rip = stu.rip; regs->cs = stu.cs; diff -Nru a/xen/arch/x86/smpboot.c b/xen/arch/x86/smpboot.c --- a/xen/arch/x86/smpboot.c 2005-02-14 07:02:45 -05:00 +++ b/xen/arch/x86/smpboot.c 2005-02-14 07:02:45 -05:00 @@ -668,7 +668,7 @@ set_bit(DF_IDLETASK, &idle->d_flags); - ed->arch.guest_table = mk_pagetable(__pa(idle_pg_table)); + ed->arch.monitor_table = mk_pagetable(__pa(idle_pg_table)); map_cpu_to_boot_apicid(cpu, apicid); diff -Nru a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S --- a/xen/arch/x86/x86_64/entry.S 2005-02-14 07:02:45 -05:00 +++ b/xen/arch/x86/x86_64/entry.S 2005-02-14 07:02:45 -05:00 @@ -19,6 +19,7 @@ movq (reg),reg; ALIGN +/* %rbx: struct exec_domain */ restore_all_guest: btr $_TF_failsafe_return,EDOMAIN_thread_flags(%rbx) jc failsafe_callback @@ -37,9 +38,11 @@ 1: sysretl ALIGN +/* No special register assumptions. */ iret_exit_to_guest: addq $8,%rsp FLT1: iretq + .section .fixup,"ax" FIX1: popq -15*8-8(%rsp) # error_code/entry_vector SAVE_ALL # 15*8 bytes pushed @@ -79,6 +82,7 @@ RESTORE_ALL addq $8,%rsp FLT2: iret + .section .fixup,"ax" FIX2: pushq %rbx GET_CURRENT(%rbx) @@ -91,6 +95,7 @@ .previous ALIGN +/* No special register assumptions. */ restore_all_xen: RESTORE_ALL addq $8,%rsp @@ -130,6 +135,7 @@ pushq restore_all_guest(%rip) jmp create_bounce_frame +/* %rbx: struct exec_domain */ hypercall: sti movq %r10,%rcx @@ -138,6 +144,7 @@ callq *(%r10,%rax,8) movq %rax,XREGS_rax(%rsp) # save the return value +/* %rbx: struct exec_domain */ test_all_events: cli # tests must not race interrupts /*test_softirqs:*/ @@ -163,6 +170,7 @@ jmp restore_all_guest ALIGN +/* %rbx: struct exec_domain */ process_softirqs: sti call SYMBOL_NAME(do_softirq) @@ -170,8 +178,8 @@ /* CREATE A BASIC EXCEPTION FRAME ON GUEST OS STACK: */ /* { RCX, R11, [DS-GS,] [CR2,] [ERRCODE,] RIP, CS, RFLAGS, RSP, SS } */ -/* %rdx == trap_bounce, %rbx == task_struct */ -/* %rax,%rcx are clobbered. %rsi contains new XREGS_rsp. */ +/* %rdx: trap_bounce, %rbx: struct exec_domain */ +/* On return only %rbx is guaranteed non-clobbered. */ create_bounce_frame: /* Push new frame at existing %rsp if already in guest-OS mode. */ movq XREGS_rsp+8(%rsp),%rsi @@ -225,19 +233,16 @@ FLT15: movq %rax,(%rsi) # RCX /* Rewrite our stack frame and return to guest-OS mode. */ /* IA32 Ref. Vol. 3: TF, VM, RF and NT flags are cleared on trap. */ - movb $0,TRAPBOUNCE_flags(%rdx) - bts $_TF_kernel_mode,EDOMAIN_thread_flags(%rbx) - jc 1f - swapgs - movq %rbx,%rdi - call SYMBOL_NAME(write_ptbase) -1: movl $TRAP_syscall,XREGS_entry_vector+8(%rsp) + movl $TRAP_syscall,XREGS_entry_vector+8(%rsp) andl $0xfffcbeff,XREGS_eflags+8(%rsp) movl $__GUEST_SS,XREGS_ss+8(%rsp) movq %rsi,XREGS_rsp+8(%rsp) movl $__GUEST_CS,XREGS_cs+8(%rsp) movq TRAPBOUNCE_eip(%rdx),%rax movq %rax,XREGS_rip+8(%rsp) + movb $0,TRAPBOUNCE_flags(%rdx) + testb $TF_kernel_mode,EDOMAIN_thread_flags(%rbx) + jz SYMBOL_NAME(toggle_guest_mode) ret .section .fixup,"ax" FIX3: sti @@ -264,6 +269,7 @@ .previous ALIGN +/* %rbx: struct exec_domain */ process_guest_exception_and_events: leaq EDOMAIN_trap_bounce(%rbx),%rdx testb $TBF_EXCEPTION,TRAPBOUNCE_flags(%rdx) @@ -273,6 +279,7 @@ jmp test_all_events ALIGN +/* No special register assumptions. */ ENTRY(ret_from_intr) GET_CURRENT(%rbx) testb $3,XREGS_cs(%rsp) @@ -280,6 +287,7 @@ jmp restore_all_xen ALIGN +/* No special register assumptions. */ error_code: SAVE_ALL testb $X86_EFLAGS_IF>>8,XREGS_eflags+1(%rsp) @@ -294,6 +302,7 @@ jz restore_all_xen jmp process_guest_exception_and_events +/* No special register assumptions. */ exception_with_ints_disabled: testb $3,XREGS_cs(%rsp) # interrupts disabled outside Xen? jnz 1b # it really does happen! @@ -315,6 +324,7 @@ movq %rax,XREGS_kernel_sizeof(%rsp) jmp restore_all_xen # return to fixup code +/* No special register assumptions. */ FATAL_exception_with_ints_disabled: movl XREGS_entry_vector(%rsp),%edi movq %rsp,%rsi diff -Nru a/xen/drivers/char/console.c b/xen/drivers/char/console.c --- a/xen/drivers/char/console.c 2005-02-14 07:02:45 -05:00 +++ b/xen/drivers/char/console.c 2005-02-14 07:02:45 -05:00 @@ -553,6 +553,8 @@ debugtrace_buf = (unsigned char *)alloc_xenheap_pages(order); ASSERT(debugtrace_buf != NULL); + memset(debugtrace_buf, '\0', debugtrace_bytes); + return 0; } __initcall(debugtrace_init); diff -Nru a/xen/include/asm-x86/shadow.h b/xen/include/asm-x86/shadow.h --- a/xen/include/asm-x86/shadow.h 2005-02-14 07:02:45 -05:00 +++ b/xen/include/asm-x86/shadow.h 2005-02-14 07:02:45 -05:00 @@ -739,11 +739,8 @@ if ( unlikely(smfn == 0) ) smfn = shadow_l2_table(d, gpfn); #ifdef CONFIG_VMX - else - if (shadow_mode_translate(ed->domain) ) - { - vmx_update_shadow_state(ed, gpfn, smfn); - } + else if ( shadow_mode_translate(ed->domain) ) + vmx_update_shadow_state(ed, gpfn, smfn); #endif ed->arch.shadow_table = mk_pagetable(smfn<<PAGE_SHIFT); @@ -756,28 +753,16 @@ { if ( unlikely(shadow_mode_enabled(ed->domain)) ) { - SH_VVLOG("update_pagetables( gptbase=%p, mode=%d )", - pagetable_val(ed->arch.guest_table), - shadow_mode(ed->domain)); - shadow_lock(ed->domain); __update_pagetables(ed); shadow_unlock(ed->domain); - - SH_VVLOG("leaving update_pagetables:\n" - "( gptbase=%p, mode=%d ) sh=%p", - pagetable_val(ed->arch.guest_table), - shadow_mode(ed->domain), - pagetable_val(ed->arch.shadow_table) ); } - else #ifdef __x86_64__ - if ( !(ed->arch.flags & TF_kernel_mode) ) - ed->arch.monitor_table = ed->arch.guest_table_user; - else + else if ( !(ed->arch.flags & TF_kernel_mode) ) + ed->arch.monitor_table = ed->arch.guest_table_user; #endif - ed->arch.monitor_table = ed->arch.guest_table; |