]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/um/sys-i386/ldt.c
uml: style fixes pass 1
[linux-2.6-omap-h63xx.git] / arch / um / sys-i386 / ldt.c
index e299ee5a753d7b1adddad393e926a4609509cfdb..762a12aec7578c2a6f4d7f3c9a3076e09dae99c3 100644 (file)
@@ -3,11 +3,11 @@
  * Licensed under the GPL
  */
 
-#include "linux/stddef.h"
 #include "linux/sched.h"
 #include "linux/slab.h"
 #include "linux/types.h"
 #include "linux/errno.h"
+#include "linux/spinlock.h"
 #include "asm/uaccess.h"
 #include "asm/smp.h"
 #include "asm/ldt.h"
 
 extern int modify_ldt(int func, void *ptr, unsigned long bytecount);
 
-#ifdef CONFIG_MODE_TT
-
-static long do_modify_ldt_tt(int func, void __user *ptr,
-                             unsigned long bytecount)
-{
-       struct user_desc info;
-       int res = 0;
-       void *buf = NULL;
-       void *p = NULL; /* What we pass to host. */
-
-       switch(func){
-       case 1:
-       case 0x11: /* write_ldt */
-               /* Do this check now to avoid overflows. */
-               if (bytecount != sizeof(struct user_desc)) {
-                       res = -EINVAL;
-                       goto out;
-               }
-
-               if(copy_from_user(&info, ptr, sizeof(info))) {
-                       res = -EFAULT;
-                       goto out;
-               }
-
-               p = &info;
-               break;
-       case 0:
-       case 2: /* read_ldt */
-
-               /* The use of info avoids kmalloc on the write case, not on the
-                * read one. */
-               buf = kmalloc(bytecount, GFP_KERNEL);
-               if (!buf) {
-                       res = -ENOMEM;
-                       goto out;
-               }
-               p = buf;
-               break;
-       default:
-               res = -ENOSYS;
-               goto out;
-       }
-
-       res = modify_ldt(func, p, bytecount);
-       if(res < 0)
-               goto out;
-
-       switch(func){
-       case 0:
-       case 2:
-               /* Modify_ldt was for reading and returned the number of read
-                * bytes.*/
-               if(copy_to_user(ptr, p, res))
-                       res = -EFAULT;
-               break;
-       }
-
-out:
-       kfree(buf);
-       return res;
-}
-
-#endif
-
-#ifdef CONFIG_MODE_SKAS
-
 #include "skas.h"
 #include "skas_ptrace.h"
 #include "asm/mmu_context.h"
@@ -167,7 +101,7 @@ static long read_ldt_from_host(void __user * ptr, unsigned long bytecount)
        struct ptrace_ldt ptrace_ldt = (struct ptrace_ldt) {
                        .func = 0,
                        .bytecount = bytecount,
-                       .ptr = (void *)kmalloc(bytecount, GFP_KERNEL)};
+                       .ptr = kmalloc(bytecount, GFP_KERNEL)};
        u32 cpu;
 
        if(ptrace_ldt.ptr == NULL)
@@ -387,23 +321,34 @@ static long do_modify_ldt_skas(int func, void __user *ptr,
        return ret;
 }
 
-short dummy_list[9] = {0, -1};
-short * host_ldt_entries = NULL;
+static DEFINE_SPINLOCK(host_ldt_lock);
+static short dummy_list[9] = {0, -1};
+static short * host_ldt_entries = NULL;
 
-void ldt_get_host_info(void)
+static void ldt_get_host_info(void)
 {
        long ret;
        struct ldt_entry * ldt;
+       short *tmp;
        int i, size, k, order;
 
+       spin_lock(&host_ldt_lock);
+
+       if(host_ldt_entries != NULL){
+               spin_unlock(&host_ldt_lock);
+               return;
+       }
        host_ldt_entries = dummy_list+1;
 
+       spin_unlock(&host_ldt_lock);
+
        for(i = LDT_PAGES_MAX-1, order=0; i; i>>=1, order++);
 
        ldt = (struct ldt_entry *)
              __get_free_pages(GFP_KERNEL|__GFP_ZERO, order);
        if(ldt == NULL) {
-               printk("ldt_get_host_info: couldn't allocate buffer for host ldt\n");
+               printk("ldt_get_host_info: couldn't allocate buffer for host "
+                      "ldt\n");
                return;
        }
 
@@ -427,11 +372,13 @@ void ldt_get_host_info(void)
                host_ldt_entries = dummy_list;
        else {
                size = (size + 1) * sizeof(dummy_list[0]);
-               host_ldt_entries = (short *)kmalloc(size, GFP_KERNEL);
-               if(host_ldt_entries == NULL) {
-                       printk("ldt_get_host_info: couldn't allocate host ldt list\n");
+               tmp = kmalloc(size, GFP_KERNEL);
+               if(tmp == NULL) {
+                       printk("ldt_get_host_info: couldn't allocate host ldt "
+                              "list\n");
                        goto out_free;
                }
+               host_ldt_entries = tmp;
        }
 
        for(i=0, k=0; i<ret/LDT_ENTRY_SIZE; i++){
@@ -481,8 +428,7 @@ long init_new_ldt(struct mmu_context_skas * new_mm,
                         * inherited from the host. All ldt-entries found
                         * will be reset in the following loop
                         */
-                       if(host_ldt_entries == NULL)
-                               ldt_get_host_info();
+                       ldt_get_host_info();
                        for(num_p=host_ldt_entries; *num_p != -1; num_p++){
                                desc.entry_number = *num_p;
                                err = write_ldt_entry(&new_mm->id, 1, &desc,
@@ -557,10 +503,9 @@ void free_ldt(struct mmu_context_skas * mm)
        }
        mm->ldt.entry_count = 0;
 }
-#endif
 
 int sys_modify_ldt(int func, void __user *ptr, unsigned long bytecount)
 {
-       return(CHOOSE_MODE_PROC(do_modify_ldt_tt, do_modify_ldt_skas, func,
-                               ptr, bytecount));
+       return CHOOSE_MODE_PROC(do_modify_ldt_tt, do_modify_ldt_skas, func,
+                               ptr, bytecount);
 }