VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / arch / i386 / kernel / vm86.c
index a5af5ec..4484e47 100644 (file)
@@ -44,7 +44,6 @@
 #include <linux/ptrace.h>
 
 #include <asm/uaccess.h>
-#include <asm/pgalloc.h>
 #include <asm/io.h>
 #include <asm/tlbflush.h>
 #include <asm/irq.h>
@@ -178,8 +177,9 @@ out:
 static int do_vm86_irq_handling(int subfunction, int irqnumber);
 static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk);
 
-asmlinkage int sys_vm86old(struct vm86_struct __user * v86)
+asmlinkage int sys_vm86old(struct pt_regs regs)
 {
+       struct vm86_struct __user *v86 = (struct vm86_struct __user *)regs.ebx;
        struct kernel_vm86_struct info; /* declare this _on top_,
                                         * this avoids wasting of stack space.
                                         * This remains on the stack until we
@@ -198,7 +198,7 @@ asmlinkage int sys_vm86old(struct vm86_struct __user * v86)
        if (tmp)
                goto out;
        memset(&info.vm86plus, 0, (int)&info.regs32 - (int)&info.vm86plus);
-       info.regs32 = (struct pt_regs *) &v86;
+       info.regs32 = &regs;
        tsk->thread.vm86_info = v86;
        do_sys_vm86(&info, tsk);
        ret = 0;        /* we never return here */
@@ -207,7 +207,7 @@ out:
 }
 
 
-asmlinkage int sys_vm86(unsigned long subfunction, struct vm86plus_struct __user * v86)
+asmlinkage int sys_vm86(struct pt_regs regs)
 {
        struct kernel_vm86_struct info; /* declare this _on top_,
                                         * this avoids wasting of stack space.
@@ -216,14 +216,15 @@ asmlinkage int sys_vm86(unsigned long subfunction, struct vm86plus_struct __user
                                         */
        struct task_struct *tsk;
        int tmp, ret;
+       struct vm86plus_struct __user *v86;
 
        tsk = current;
-       switch (subfunction) {
+       switch (regs.ebx) {
                case VM86_REQUEST_IRQ:
                case VM86_FREE_IRQ:
                case VM86_GET_IRQ_BITS:
                case VM86_GET_AND_RESET_IRQ:
-                       ret = do_vm86_irq_handling(subfunction,(int)v86);
+                       ret = do_vm86_irq_handling(regs.ebx, (int)regs.ecx);
                        goto out;
                case VM86_PLUS_INSTALL_CHECK:
                        /* NOTE: on old vm86 stuff this will return the error
@@ -239,13 +240,14 @@ asmlinkage int sys_vm86(unsigned long subfunction, struct vm86plus_struct __user
        ret = -EPERM;
        if (tsk->thread.saved_esp0)
                goto out;
+       v86 = (struct vm86plus_struct __user *)regs.ecx;
        tmp  = copy_from_user(&info, v86, VM86_REGS_SIZE1);
        tmp += copy_from_user(&info.regs.VM86_REGS_PART2, &v86->regs.VM86_REGS_PART2,
                (long)&info.regs32 - (long)&info.regs.VM86_REGS_PART2);
        ret = -EFAULT;
        if (tmp)
                goto out;
-       info.regs32 = (struct pt_regs *) &subfunction;
+       info.regs32 = &regs;
        info.vm86plus.is_vm86pus = 1;
        tsk->thread.vm86_info = (struct vm86_struct __user *)v86;
        do_sys_vm86(&info, tsk);
@@ -392,6 +394,7 @@ static inline unsigned long get_vflags(struct kernel_vm86_regs * regs)
 
        if (VEFLAGS & VIF_MASK)
                flags |= IF_MASK;
+       flags |= IOPL_MASK;
        return flags | (VEFLAGS & current->thread.v86mask);
 }
 
@@ -486,9 +489,10 @@ static inline int is_revectored(int nr, struct revectored_struct * bitmap)
  * in userspace is always better than an Oops anyway.) [KD]
  */
 static void do_int(struct kernel_vm86_regs *regs, int i,
-    unsigned char * ssp, unsigned short sp)
+    unsigned char __user * ssp, unsigned short sp)
 {
-       unsigned long *intr_ptr, segoffs;
+       unsigned long __user *intr_ptr;
+       unsigned long segoffs;
 
        if (regs->cs == BIOSSEG)
                goto cannot_handle;
@@ -496,7 +500,7 @@ static void do_int(struct kernel_vm86_regs *regs, int i,
                goto cannot_handle;
        if (i==0x21 && is_revectored(AH(regs),&KVM86->int21_revectored))
                goto cannot_handle;
-       intr_ptr = (unsigned long *) (i << 2);
+       intr_ptr = (unsigned long __user *) (i << 2);
        if (get_user(segoffs, intr_ptr))
                goto cannot_handle;
        if ((segoffs >> 16) == BIOSSEG)
@@ -521,7 +525,7 @@ int handle_vm86_trap(struct kernel_vm86_regs * regs, long error_code, int trapno
        if (VMPI.is_vm86pus) {
                if ( (trapno==3) || (trapno==1) )
                        return_to_32bit(regs, VM86_TRAP + (trapno << 8));
-               do_int(regs, trapno, (unsigned char *) (regs->ss << 4), SP(regs));
+               do_int(regs, trapno, (unsigned char __user *) (regs->ss << 4), SP(regs));
                return 0;
        }
        if (trapno !=1)
@@ -541,7 +545,9 @@ int handle_vm86_trap(struct kernel_vm86_regs * regs, long error_code, int trapno
 
 void handle_vm86_fault(struct kernel_vm86_regs * regs, long error_code)
 {
-       unsigned char *csp, *ssp, opcode;
+       unsigned char opcode;
+       unsigned char __user *csp;
+       unsigned char __user *ssp;
        unsigned short ip, sp;
        int data32, pref_done;
 
@@ -553,8 +559,8 @@ void handle_vm86_fault(struct kernel_vm86_regs * regs, long error_code)
                return_to_32bit(regs, VM86_PICRETURN); \
        return; } while (0)
 
-       csp = (unsigned char *) (regs->cs << 4);
-       ssp = (unsigned char *) (regs->ss << 4);
+       csp = (unsigned char __user *) (regs->cs << 4);
+       ssp = (unsigned char __user *) (regs->ss << 4);
        sp = SP(regs);
        ip = IP(regs);
 
@@ -727,8 +733,8 @@ static inline void free_vm86_irq(int irqnumber)
 {
        unsigned long flags;
 
-       free_irq(irqnumber,0);
-       vm86_irqs[irqnumber].tsk = 0;
+       free_irq(irqnumber, NULL);
+       vm86_irqs[irqnumber].tsk = NULL;
 
        spin_lock_irqsave(&irqbits_lock, flags);        
        irqbits &= ~(1 << irqnumber);
@@ -778,7 +784,7 @@ static int do_vm86_irq_handling(int subfunction, int irqnumber)
                        if (!((1 << sig) & ALLOWED_SIGS)) return -EPERM;
                        if (invalid_vm86_irq(irq)) return -EPERM;
                        if (vm86_irqs[irq].tsk) return -EPERM;
-                       ret = request_irq(irq, &irq_handler, 0, VM86_IRQNAME, 0);
+                       ret = request_irq(irq, &irq_handler, 0, VM86_IRQNAME, NULL);
                        if (ret) return ret;
                        vm86_irqs[irq].sig = sig;
                        vm86_irqs[irq].tsk = current;