Deleted Added
full compact
_set_tp.c (145573) _set_tp.c (147673)
1/*-
2 * Copyright (c) 2004 Doug Rabson
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
1/*-
2 * Copyright (c) 2004 Doug Rabson
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: head/lib/libc/i386/gen/_set_tp.c 145573 2005-04-26 20:51:15Z peter $
26 * $FreeBSD: head/lib/libc/i386/gen/_set_tp.c 147673 2005-06-29 23:15:36Z peter $
27 */
28
29#include <string.h>
30#include <stdint.h>
27 */
28
29#include <string.h>
30#include <stdint.h>
31#include <machine/segments.h>
32#include <machine/sysarch.h>
33
34void
35_set_tp(void *tp)
36{
31#include <machine/sysarch.h>
32
33void
34_set_tp(void *tp)
35{
37 union descriptor ldt;
38 int error, sel;
39
36
40 error = i386_set_gsbase(tp);
41 if (error == 0)
42 return;
43 memset(&ldt, 0, sizeof(ldt));
44 ldt.sd.sd_lolimit = 0xffff; /* 4G limit */
45 ldt.sd.sd_lobase = ((uintptr_t)tp) & 0xffffff;
46 ldt.sd.sd_type = SDT_MEMRWA;
47 ldt.sd.sd_dpl = SEL_UPL;
48 ldt.sd.sd_p = 1; /* present */
49 ldt.sd.sd_hilimit = 0xf; /* 4G limit */
50 ldt.sd.sd_def32 = 1; /* 32 bit */
51 ldt.sd.sd_gran = 1; /* limit in pages */
52 ldt.sd.sd_hibase = (((uintptr_t)tp) >> 24) & 0xff;
53 sel = i386_set_ldt(LDT_AUTO_ALLOC, &ldt, 1);
54 __asm __volatile("movl %0,%%gs" : : "rm" ((sel << 3) | 7));
37 i386_set_gsbase(tp);
55}
38}