]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - arch/um/sys-i386/ldt.c
Linux-2.6.12-rc2
[mirror_ubuntu-artful-kernel.git] / arch / um / sys-i386 / ldt.c
1 /*
2 * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
3 * Licensed under the GPL
4 */
5
6 #include "linux/config.h"
7 #include "linux/slab.h"
8 #include "asm/uaccess.h"
9 #include "asm/ptrace.h"
10 #include "choose-mode.h"
11 #include "kern.h"
12
13 #ifdef CONFIG_MODE_TT
14 extern int modify_ldt(int func, void *ptr, unsigned long bytecount);
15
16 /* XXX this needs copy_to_user and copy_from_user */
17
18 int sys_modify_ldt_tt(int func, void __user *ptr, unsigned long bytecount)
19 {
20 if (!access_ok(VERIFY_READ, ptr, bytecount))
21 return -EFAULT;
22
23 return modify_ldt(func, ptr, bytecount);
24 }
25 #endif
26
27 #ifdef CONFIG_MODE_SKAS
28 extern int userspace_pid;
29
30 #include "skas_ptrace.h"
31
32 int sys_modify_ldt_skas(int func, void __user *ptr, unsigned long bytecount)
33 {
34 struct ptrace_ldt ldt;
35 void *buf;
36 int res, n;
37
38 buf = kmalloc(bytecount, GFP_KERNEL);
39 if(buf == NULL)
40 return(-ENOMEM);
41
42 res = 0;
43
44 switch(func){
45 case 1:
46 case 0x11:
47 res = copy_from_user(buf, ptr, bytecount);
48 break;
49 }
50
51 if(res != 0){
52 res = -EFAULT;
53 goto out;
54 }
55
56 ldt = ((struct ptrace_ldt) { .func = func,
57 .ptr = buf,
58 .bytecount = bytecount });
59 res = ptrace(PTRACE_LDT, userspace_pid, 0, (unsigned long) &ldt);
60 if(res < 0)
61 goto out;
62
63 switch(func){
64 case 0:
65 case 2:
66 n = res;
67 res = copy_to_user(ptr, buf, n);
68 if(res != 0)
69 res = -EFAULT;
70 else
71 res = n;
72 break;
73 }
74
75 out:
76 kfree(buf);
77 return(res);
78 }
79 #endif
80
81 int sys_modify_ldt(int func, void __user *ptr, unsigned long bytecount)
82 {
83 return(CHOOSE_MODE_PROC(sys_modify_ldt_tt, sys_modify_ldt_skas, func,
84 ptr, bytecount));
85 }
86
87
88
89 /*
90 * Overrides for Emacs so that we follow Linus's tabbing style.
91 * Emacs will notice this stuff at the end of the file and automatically
92 * adjust the settings for this buffer only. This must remain at the end
93 * of the file.
94 * ---------------------------------------------------------------------------
95 * Local variables:
96 * c-file-style: "linux"
97 * End:
98 */