|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /*
26: * Copyright (c) 1992 NeXT Computer, Inc.
27: *
28: * Intel386 Family: Global descriptor table.
29: *
30: * HISTORY
31: *
32: * 3 April 1992 ? at NeXT
33: * Created.
34: */
35:
36: #import <mach/mach_types.h>
37:
38: #import <machdep/i386/seg.h>
39: #import <machdep/i386/table_inline.h>
40: #import <machdep/i386/desc_inline.h>
41:
42: void
43: locate_gdt(
44: vm_offset_t base
45: )
46: {
47: extern
48: unsigned int gdt_base;
49: extern
50: unsigned short gdt_limit;
51:
52: gdt_base = base;
53: gdt_limit = (GDTSZ * sizeof (gdt_entry_t)) - 1;
54:
55: asm volatile("lgdt %0"
56: :
57: : "m" (gdt_limit));
58: }
59:
60: void
61: gdt_init(
62: void
63: )
64: {
65: extern void unix_syscall_(void),
66: mach_kernel_trap_(void),
67: machdep_call_(void);
68:
69: map_code((code_desc_t *) sel_to_gdt_entry(KCS_SEL),
70: KERNEL_LINEAR_BASE,
71: (vm_size_t)(VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS),
72: KERN_PRIV,
73: FALSE
74: );
75:
76: map_data((data_desc_t *) sel_to_gdt_entry(KDS_SEL),
77: KERNEL_LINEAR_BASE,
78: (vm_size_t)(VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS),
79: KERN_PRIV,
80: FALSE
81: );
82:
83: map_code((code_desc_t *) sel_to_gdt_entry(LCODE_SEL),
84: (vm_offset_t) VM_MIN_ADDRESS,
85: (vm_size_t) (VM_MAX_ADDRESS - VM_MIN_ADDRESS),
86: KERN_PRIV,
87: FALSE
88: );
89:
90: map_data((data_desc_t *) sel_to_gdt_entry(LDATA_SEL),
91: (vm_offset_t) VM_MIN_ADDRESS,
92: (vm_size_t) (VM_MAX_ADDRESS - VM_MIN_ADDRESS),
93: KERN_PRIV,
94: FALSE
95: );
96:
97: map_code((code_desc_t *) sel_to_gdt_entry(UCODE_SEL),
98: (vm_offset_t) VM_MIN_ADDRESS,
99: (vm_size_t) (VM_MAX_ADDRESS - VM_MIN_ADDRESS),
100: USER_PRIV,
101: FALSE
102: );
103:
104: map_data((data_desc_t *) sel_to_gdt_entry(UDATA_SEL),
105: (vm_offset_t) VM_MIN_ADDRESS,
106: (vm_size_t) (VM_MAX_ADDRESS - VM_MIN_ADDRESS),
107: USER_PRIV,
108: FALSE
109: );
110:
111: /* XXX This is needed for protected mode WINDOWS support */
112: map_data((data_desc_t *) sel_to_gdt_entry(BIOSDATA_SEL),
113: (vm_offset_t) 0x400,
114: (vm_size_t) 0x300,
115: USER_PRIV,
116: FALSE
117: );
118: /* XXX */
119:
120: make_call_gate(sel_to_gdt_entry(SCALL_SEL),
121: KCS_SEL, unix_syscall_,
122: USER_PRIV,
123: 1 /* argcnt */
124: );
125:
126: make_call_gate(sel_to_gdt_entry(MACHCALL_SEL),
127: KCS_SEL, mach_kernel_trap_,
128: USER_PRIV,
129: 1 /* argcnt */
130: );
131:
132: make_call_gate(sel_to_gdt_entry(MDCALL_SEL),
133: KCS_SEL, machdep_call_,
134: USER_PRIV,
135: 1 /* argcnt */
136: );
137:
138: locate_gdt((vm_offset_t) gdt);
139: }
140:
141: static gdt_t gdt_store[GDTSZ] = { 0 };
142:
143: gdt_t *gdt = gdt_store;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.