2 * Copyright (C) 2001, 2004 Hewlett-Packard Co
3 * David Mosberger-Tang <davidm@hpl.hp.com>
5 * Adapted from arch/i386/kernel/ldt.c
8 #include <linux/errno.h>
9 #include <linux/sched.h>
10 #include <linux/string.h>
12 #include <linux/smp.h>
13 #include <linux/smp_lock.h>
14 #include <linux/vmalloc.h>
16 #include <asm/uaccess.h>
21 * read_ldt() is not really atomic - this is not a problem since synchronization of reads
22 * and writes done to the LDT has to be assured by user-space anyway. Writes are atomic,
23 * to protect the security checks done on new descriptors.
26 read_ldt (void __user
*ptr
, unsigned long bytecount
)
28 unsigned long bytes_left
, n
;
29 char __user
*src
, *dst
;
30 char buf
[256]; /* temporary buffer (don't overflow kernel stack!) */
32 if (bytecount
> IA32_LDT_ENTRIES
*IA32_LDT_ENTRY_SIZE
)
33 bytecount
= IA32_LDT_ENTRIES
*IA32_LDT_ENTRY_SIZE
;
35 bytes_left
= bytecount
;
37 src
= (void __user
*) IA32_LDT_OFFSET
;
46 * We know we're reading valid memory, but we still must guard against
47 * running out of memory.
49 if (__copy_from_user(buf
, src
, n
))
52 if (copy_to_user(dst
, buf
, n
))
63 read_default_ldt (void __user
* ptr
, unsigned long bytecount
)
68 /* XXX fix me: should return equivalent of default_ldt[0] */
75 if (clear_user(ptr
, size
))
82 write_ldt (void __user
* ptr
, unsigned long bytecount
, int oldmode
)
84 struct ia32_user_desc ldt_info
;
88 if (bytecount
!= sizeof(ldt_info
))
90 if (copy_from_user(&ldt_info
, ptr
, sizeof(ldt_info
)))
93 if (ldt_info
.entry_number
>= IA32_LDT_ENTRIES
)
95 if (ldt_info
.contents
== 3) {
98 if (ldt_info
.seg_not_present
== 0)
102 if (ldt_info
.base_addr
== 0 && ldt_info
.limit
== 0
103 && (oldmode
|| (ldt_info
.contents
== 0 && ldt_info
.read_exec_only
== 1
104 && ldt_info
.seg_32bit
== 0 && ldt_info
.limit_in_pages
== 0
105 && ldt_info
.seg_not_present
== 1 && ldt_info
.useable
== 0)))
106 /* allow LDTs to be cleared by the user */
109 /* we must set the "Accessed" bit as IVE doesn't emulate it */
110 entry
= IA32_SEG_DESCRIPTOR(ldt_info
.base_addr
, ldt_info
.limit
,
111 (((ldt_info
.read_exec_only
^ 1) << 1)
112 | (ldt_info
.contents
<< 2)) | 1,
113 1, 3, ldt_info
.seg_not_present
^ 1,
114 (oldmode
? 0 : ldt_info
.useable
),
116 ldt_info
.limit_in_pages
);
118 * Install the new entry. We know we're accessing valid (mapped) user-level
119 * memory, but we still need to guard against out-of-memory, hence we must use
122 ret
= __put_user(entry
, (__u64 __user
*) IA32_LDT_OFFSET
+ ldt_info
.entry_number
);
123 ia32_load_segment_descriptors(current
);
128 sys32_modify_ldt (int func
, unsigned int ptr
, unsigned int bytecount
)
134 ret
= read_ldt(compat_ptr(ptr
), bytecount
);
137 ret
= write_ldt(compat_ptr(ptr
), bytecount
, 1);
140 ret
= read_default_ldt(compat_ptr(ptr
), bytecount
);
143 ret
= write_ldt(compat_ptr(ptr
), bytecount
, 0);