ChangeSet 1.1440, 2005/04/03 11:11:45+01:00, kaf24@viper.(none)
Xen fixes and cleanups for x86/64 guests.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
freebsd-5.3-xen-sparse/i386-xen/include/hypervisor.h | 2
linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/hypervisor.c | 14 ------
linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/hypercall.h | 5 --
linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/system.h | 2
linux-2.6.11-xen-sparse/include/asm-xen/hypervisor.h | 2
netbsd-2.0-xen-sparse/sys/arch/xen/include/hypervisor.h | 2
xen/arch/x86/domain.c | 8 ++-
xen/arch/x86/mm.c | 6 --
xen/arch/x86/x86_64/entry.S | 7 +--
xen/arch/x86/x86_64/mm.c | 21 +++++++++
xen/common/schedule.c | 16 ++-----
xen/include/public/arch-x86_64.h | 1
xen/include/public/xen.h | 22
+++++-----
13 files changed, 53 insertions(+), 55 deletions(-)
diff -Nru a/freebsd-5.3-xen-sparse/i386-xen/include/hypervisor.h
b/freebsd-5.3-xen-sparse/i386-xen/include/hypervisor.h
--- a/freebsd-5.3-xen-sparse/i386-xen/include/hypervisor.h 2005-04-03
07:03:05 -04:00
+++ b/freebsd-5.3-xen-sparse/i386-xen/include/hypervisor.h 2005-04-03
07:03:05 -04:00
@@ -176,7 +176,7 @@
__asm__ __volatile__ (
TRAP_INSTR
: "=a" (ret) : "0" (__HYPERVISOR_set_timer_op),
- "b" (timeout_hi), "c" (timeout_lo) : "memory" );
+ "b" (timeout_lo), "c" (timeout_hi) : "memory" );
return ret;
}
diff -Nru a/linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/hypervisor.c
b/linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/hypervisor.c
--- a/linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/hypervisor.c 2005-04-03
07:03:04 -04:00
+++ b/linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/hypervisor.c 2005-04-03
07:03:05 -04:00
@@ -430,20 +430,6 @@
spin_unlock_irqrestore(&update_lock, flags);
}
-void xen_load_gs(unsigned long ptr)
-{
- int cpu = smp_processor_id();
- int idx;
- unsigned long flags;
- spin_lock_irqsave(&update_lock, flags);
- idx = per_cpu(mmu_update_queue_idx, cpu);
- per_cpu(update_queue[idx], cpu).ptr = phys_to_machine(ptr);
- per_cpu(update_queue[idx], cpu).ptr |= MMU_EXTENDED_COMMAND;
- per_cpu(update_queue[idx], cpu).val = MMUEXT_LOAD_GS;
- increment_index_and_flush();
- spin_unlock_irqrestore(&update_lock, flags);
-}
-
void xen_invlpg(unsigned long ptr)
{
int cpu = smp_processor_id();
diff -Nru a/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/hypercall.h
b/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/hypercall.h
--- a/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/hypercall.h
2005-04-03 07:03:05 -04:00
+++ b/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/hypercall.h
2005-04-03 07:03:05 -04:00
@@ -218,15 +218,12 @@
HYPERVISOR_set_timer_op(
u64 timeout)
{
- unsigned long timeout_hi = timeout >> 32;
- unsigned long timeout_lo = timeout & 0xffffffff;
int ret;
__asm__ __volatile__ (
TRAP_INSTR
: "=a" (ret)
- : "0" ((unsigned long)__HYPERVISOR_set_timer_op),
- "D" (timeout_hi), "S" (timeout_lo)
+ : "0" ((unsigned long)__HYPERVISOR_set_timer_op), "D" (timeout)
: __syscall_clobber );
return ret;
diff -Nru a/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/system.h
b/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/system.h
--- a/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/system.h
2005-04-03 07:03:05 -04:00
+++ b/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/system.h
2005-04-03 07:03:05 -04:00
@@ -55,7 +55,7 @@
extern void load_gs_index(unsigned);
#define __load_gs_index(index) \
- xen_load_gs((index))
+ HYPERVISOR_set_segment_base(SEGBASE_GS_USER_SEL, index)
/*
* Load a segment. Fall back on loading the zero
diff -Nru a/linux-2.6.11-xen-sparse/include/asm-xen/hypervisor.h
b/linux-2.6.11-xen-sparse/include/asm-xen/hypervisor.h
--- a/linux-2.6.11-xen-sparse/include/asm-xen/hypervisor.h 2005-04-03
07:03:05 -04:00
+++ b/linux-2.6.11-xen-sparse/include/asm-xen/hypervisor.h 2005-04-03
07:03:05 -04:00
@@ -342,7 +342,7 @@
__asm__ __volatile__ (
TRAP_INSTR
: "=a" (ret), "=b" (ign1), "=c" (ign2)
- : "0" (__HYPERVISOR_set_timer_op), "b" (timeout_hi), "c" (timeout_lo)
+ : "0" (__HYPERVISOR_set_timer_op), "b" (timeout_lo), "c" (timeout_hi)
: "memory");
return ret;
diff -Nru a/netbsd-2.0-xen-sparse/sys/arch/xen/include/hypervisor.h
b/netbsd-2.0-xen-sparse/sys/arch/xen/include/hypervisor.h
--- a/netbsd-2.0-xen-sparse/sys/arch/xen/include/hypervisor.h 2005-04-03
07:03:05 -04:00
+++ b/netbsd-2.0-xen-sparse/sys/arch/xen/include/hypervisor.h 2005-04-03
07:03:05 -04:00
@@ -284,7 +284,7 @@
__asm__ __volatile__ (
TRAP_INSTR
: "=a" (ret), "=b" (ign1), "=c" (ign2)
- : "0" (__HYPERVISOR_set_timer_op), "b" (timeout_hi), "c" (timeout_lo)
+ : "0" (__HYPERVISOR_set_timer_op), "b" (timeout_lo), "c" (timeout_hi)
: "memory");
return ret;
diff -Nru a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c 2005-04-03 07:03:05 -04:00
+++ b/xen/arch/x86/domain.c 2005-04-03 07:03:05 -04:00
@@ -573,7 +573,7 @@
void toggle_guest_mode(struct exec_domain *ed)
{
ed->arch.flags ^= TF_kernel_mode;
- __asm__ __volatile__ ( "swapgs" );
+ __asm__ __volatile__ ( "mfence; swapgs" ); /* AMD erratum #88 */
update_pagetables(ed);
write_ptbase(ed);
}
@@ -657,7 +657,7 @@
/* If in kernel mode then switch the GS bases around. */
if ( n->arch.flags & TF_kernel_mode )
- __asm__ __volatile__ ( "swapgs" );
+ __asm__ __volatile__ ( "mfence; swapgs" ); /* AMD erratum #88 */
if ( unlikely(!all_segs_okay) )
{
@@ -711,7 +711,9 @@
"movl %0,%%ds; "
"movl %0,%%es; "
"movl %0,%%fs; "
- "movl %0,%%gs; swapgs; movl %0,%%gs"
+ "movl %0,%%gs; "
+ "mfence; swapgs; " /* AMD erratum #88 */
+ "movl %0,%%gs"
: : "r" (0) );
}
diff -Nru a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c 2005-04-03 07:03:05 -04:00
+++ b/xen/arch/x86/mm.c 2005-04-03 07:03:05 -04:00
@@ -2218,8 +2218,7 @@
}
-long do_update_descriptor(
- unsigned long pa, unsigned long word1, unsigned long word2)
+long do_update_descriptor(unsigned long pa, u64 desc)
{
unsigned long pfn = pa >> PAGE_SHIFT;
struct desc_struct *gdt_pent, d;
@@ -2227,8 +2226,7 @@
struct exec_domain *ed;
long ret = -EINVAL;
- d.a = (u32)word1;
- d.b = (u32)word2;
+ *(u64 *)&d = desc;
LOCK_BIGLOCK(current->domain);
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-04-03 07:03:05 -04:00
+++ b/xen/arch/x86/x86_64/entry.S 2005-04-03 07:03:05 -04:00
@@ -30,6 +30,7 @@
popq %r11 # CS
cmpw $__GUEST_CS32,%r11
popq %r11 # RFLAGS
+ cli # No interrupts after stack switch
popq %rsp # RSP
je 1f
sysretq
@@ -112,8 +113,8 @@
movq EDOMAIN_syscall_addr(%rbx),%rax
movq %rax,TRAPBOUNCE_eip(%rdx)
movw $0,TRAPBOUNCE_flags(%rdx)
- pushq restore_all_guest(%rip)
- jmp create_bounce_frame
+ call create_bounce_frame
+ jmp restore_all_guest
/* %rbx: struct exec_domain */
hypercall:
@@ -215,7 +216,7 @@
FLT12: movq %rax,(%rsi) # DS
2: subq $16,%rsi
movq XREGS_r11+8(%rsp),%rax
-FLT13: movq %rax,(%rsi) # R11
+FLT13: movq %rax,8(%rsi) # R11
movq XREGS_rcx+8(%rsp),%rax
FLT14: movq %rax,(%rsi) # RCX
/* Rewrite our stack frame and return to guest-OS mode. */
diff -Nru a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c
--- a/xen/arch/x86/x86_64/mm.c 2005-04-03 07:03:05 -04:00
+++ b/xen/arch/x86/x86_64/mm.c 2005-04-03 07:03:05 -04:00
@@ -249,6 +249,9 @@
{
struct exec_domain *ed = current;
+ /* Canonicalise the base address. */
+ base &= VADDR_MASK;
+
switch ( which )
{
case SEGBASE_FS:
@@ -266,6 +269,22 @@
wrmsr(MSR_GS_BASE, base, base>>32);
break;
+ case SEGBASE_GS_USER_SEL:
+ __asm__ __volatile__ (
+ " swapgs \n"
+ "1: movl %k0,%%gs \n"
+ " mfence; swapgs \n" /* AMD erratum #88 */
+ ".section .fixup,\"ax\" \n"
+ "2: xorl %k0,%k0 \n"
+ " jmp 1b \n"
+ ".previous \n"
+ ".section __ex_table,\"a\"\n"
+ " .align 8 \n"
+ " .quad 1b,2b \n"
+ ".previous "
+ : : "r" (base&0xffff) );
+ break;
+
default:
return -EINVAL;
}
@@ -284,7 +303,7 @@
goto good;
/* The guest can only safely be executed in ring 3. */
- if ( (b & _SEGMENT_DPL) != 3 )
+ if ( (b & _SEGMENT_DPL) != _SEGMENT_DPL )
goto bad;
/* All code and data segments are okay. No base/limit checking. */
diff -Nru a/xen/common/schedule.c b/xen/common/schedule.c
--- a/xen/common/schedule.c 2005-04-03 07:03:05 -04:00
+++ b/xen/common/schedule.c 2005-04-03 07:03:05 -04:00
@@ -294,20 +294,14 @@
}
/* Per-domain one-shot-timer hypercall. */
-long do_set_timer_op(unsigned long timeout_hi, unsigned long timeout_lo)
+long do_set_timer_op(s_time_t timeout)
{
- struct exec_domain *p = current;
+ struct exec_domain *ed = current;
- rem_ac_timer(&p->timer);
+ rem_ac_timer(&ed->timer);
- if ( (timeout_hi != 0) || (timeout_lo != 0) )
- {
- p->timer.expires = ((s_time_t)timeout_hi<<32) | ((s_time_t)timeout_lo);
- add_ac_timer(&p->timer);
- }
-
- TRACE_5D(TRC_SCHED_SET_TIMER, p->domain->id, p->eid, p, timeout_hi,
- timeout_lo);
+ if ( (ed->timer.expires = timeout) != 0 )
+ add_ac_timer(&ed->timer);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|