This commit is contained in:
Ian.Campbell@xensource.com committed 2006-01-11 18:22:24 +00:00
commit 82862b4cce
5 files changed
+35 -26

No files matched your search

@@ -76,7 +76,7 @@ IF_MASK = 0x00000200
DF_MASK = 0x00000400
NT_MASK = 0x00004000
VM_MASK = 0x00020000
/* pseudo-eflags */
/* Pseudo-eflags. */
NMI_MASK = 0x80000000
/* Offsets into shared_info_t. */
+25 -17
View File
@@ -161,42 +161,50 @@ asmlinkage unsigned long do_iret(void)
{
struct cpu_user_regs *regs = guest_cpu_user_regs();
/* Restore EAX (clobbered by hypercall) */
if (copy_from_user(&regs->eax, (void __user *)regs->esp, 4))
/* Restore EAX (clobbered by hypercall). */
if ( copy_from_user(&regs->eax, (void __user *)regs->esp, 4) )
domain_crash_synchronous();
regs->esp += 4;
/* Restore EFLAGS, CS and EIP */
if (copy_from_user(&regs->eip, (void __user *)regs->esp, 12))
/* Restore EFLAGS, CS and EIP. */
if ( copy_from_user(&regs->eip, (void __user *)regs->esp, 12) )
domain_crash_synchronous();
if (VM86_MODE(regs)) {
/* return to VM86 mode: restore ESP,SS,ES,DS,FS and GS */
if ( VM86_MODE(regs) )
{
/* Return to VM86 mode: restore ESP,SS,ES,DS,FS and GS. */
if(copy_from_user(&regs->esp, (void __user *)(regs->esp+12), 24))
domain_crash_synchronous();
} else if (RING_0(regs)) {
}
else if ( RING_0(regs) )
{
domain_crash_synchronous();
} else if (RING_1(regs)) {
/* return to ring 1: pop EFLAGS,CS and EIP */
}
else if ( RING_1(regs) ) {
/* Return to ring 1: pop EFLAGS,CS and EIP. */
regs->esp += 12;
} else {
/* return to ring 2/3: restore ESP and SS */
if(copy_from_user(&regs->esp, (void __user *)(regs->esp+12), 8))
}
else
{
/* Return to ring 2/3: restore ESP and SS. */
if ( copy_from_user(&regs->esp, (void __user *)(regs->esp+12), 8) )
domain_crash_synchronous();
}
/* Fixup EFLAGS */
/* Fixup EFLAGS. */
regs->eflags &= ~X86_EFLAGS_IOPL;
regs->eflags |= X86_EFLAGS_IF;
/* No longer in NMI context */
/* No longer in NMI context. */
clear_bit(_VCPUF_nmi_masked, &current->vcpu_flags);
/* Restore upcall mask from saved value */
/* Restore upcall mask from saved value. */
current->vcpu_info->evtchn_upcall_mask = regs->saved_upcall_mask;
/* the hypercall exit path will overwrite eax
* with this return value */
/*
* The hypercall exit path will overwrite EAX with this return
* value.
*/
return regs->eax;
}
+5 -5
View File
@@ -118,16 +118,16 @@ extern void toggle_guest_mode(struct vcpu *);
long do_iret(void)
{
struct cpu_user_regs *regs = guest_cpu_user_regs();
struct cpu_user_regs *regs = guest_cpu_user_regs();
struct iret_context iret_saved;
struct vcpu *v = current;
struct vcpu *v = current;
if ( unlikely(copy_from_user(&iret_saved, (void *)regs->rsp, sizeof(iret_saved))) ||
unlikely(pagetable_get_paddr(v->arch.guest_table_user) == 0) )
return -EFAULT;
/* returning to user mode */
if ((iret_saved.cs & 0x03) == 3)
/* Returning to user mode. */
if ( (iret_saved.cs & 0x03) == 3 )
toggle_guest_mode(v);
regs->rip = iret_saved.rip;
@@ -143,7 +143,7 @@ long do_iret(void)
regs->rcx = iret_saved.rcx;
}
/* No longer in NMI context */
/* No longer in NMI context. */
clear_bit(_VCPUF_nmi_masked, &current->vcpu_flags);
/* Saved %rax gets written back to regs->rax in entry.S. */
-1
View File
@@ -160,7 +160,6 @@ long do_nmi_op(unsigned int cmd, void *arg)
rc = -EINVAL;
else
current->nmi_addr = (unsigned long)arg;
printk("***** NMI handler at 0x%lx\n", current->nmi_addr);
break;
case XENNMI_unregister_callback:
current->nmi_addr = 0;
+4 -2
View File
@@ -114,8 +114,10 @@ struct iret_context {
uint64_t rax, r11, rcx, flags, rip, cs, rflags, rsp, ss;
/* Bottom of iret stack frame. */
};
/* For compatibility with HYPERVISOR_switch_to_user which is the old
* name for HYPERVISOR_iret */
/*
* For compatibility with HYPERVISOR_switch_to_user which is the old
* name for HYPERVISOR_iret.
*/
struct switch_to_user {
/* Top of stack (%rsp at point of hypercall). */
uint64_t rax, r11, rcx, flags, rip, cs, rflags, rsp, ss;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.