1 static char RCSId
[] = "$Id: ldtlib.c,v 1.2 1993/07/04 04:04:21 root Exp root $";
2 static char Copyright
[] = "Copyright Robert J. Amstadt, 1993";
8 #include <linux/unistd.h>
9 #include <linux/head.h>
10 #include <linux/ldt.h>
12 _syscall3(int, modify_ldt
, int, func
, void *, ptr
, unsigned long, bytecount
)
14 #if defined(__NetBSD__) || defined(__FreeBSD__)
15 #include <machine/segments.h>
17 extern int i386_get_ldt(int, union descriptor
*, int);
18 extern int i386_set_ldt(int, union descriptor
*, int);
20 struct segment_descriptor
*
21 make_sd(unsigned base
, unsigned limit
, int contents
, int read_exec_only
, int seg32
, int inpgs
)
25 d
[0] = ((base
& 0x0000ffff) << 16) |
27 d
[1] = (base
& 0xff000000) |
28 ((base
& 0x00ff0000)>>16) |
31 ((read_exec_only
^ 1) << 9) |
36 return ((struct segment_descriptor
*)d
);
44 return modify_ldt(0, buffer
, 32 * sizeof(struct modify_ldt_ldt_s
));
46 #if defined(__NetBSD__) || defined(__FreeBSD__)
47 return i386_get_ldt(0, (union descriptor
*)buffer
, 32);
52 set_ldt_entry(int entry
, unsigned long base
, unsigned int limit
,
53 int seg_32bit_flag
, int contents
, int read_only_flag
,
54 int limit_in_pages_flag
)
57 struct modify_ldt_ldt_s ldt_info
;
59 ldt_info
.entry_number
= entry
;
60 ldt_info
.base_addr
= base
;
61 ldt_info
.limit
= limit
;
62 ldt_info
.seg_32bit
= seg_32bit_flag
;
63 ldt_info
.contents
= contents
;
64 ldt_info
.read_exec_only
= read_only_flag
;
65 ldt_info
.limit_in_pages
= limit_in_pages_flag
;
67 return modify_ldt(1, &ldt_info
, sizeof(ldt_info
));
69 #if defined(__NetBSD__) || defined(__FreeBSD__)
70 struct segment_descriptor
*sd
;
74 printf("set_ldt_entry: entry=%x base=%x limit=%x%s %s-bit contents=%d %s\n",
75 entry
, base
, limit
, limit_in_pages_flag
?"-pages":"",
76 seg_32bit_flag
?"32":"16",
77 contents
, read_only_flag
?"read-only":"");
80 sd
= make_sd(base
, limit
, contents
, read_only_flag
, seg_32bit_flag
, limit_in_pages_flag
);
81 ret
= i386_set_ldt(entry
, (union descriptor
*)sd
, 1);
83 perror("i386_set_ldt");