2 * Copyright (C) 2001-2004 Jakub Jermar
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 #ifndef __amd64_PM_H__
30 #define __amd64_PM_H__
33 # include <arch/types.h>
34 # include <typedefs.h>
35 # include <arch/context.h>
42 /* Warning: Do not reorder next items, unless you look into syscall.c!!! */
51 #define gdtselector(des) ((des)<<3)
52 #define idtselector(des) ((des)<<4)
57 #define AR_PRESENT (1<<7)
58 #define AR_DATA (2<<3)
59 #define AR_CODE (3<<3)
60 #define AR_WRITABLE (1<<1)
61 #define AR_READABLE (1<<1)
63 #define AR_INTERRUPT (0xe)
66 #define DPL_KERNEL (PL_KERNEL<<5)
67 #define DPL_USER (PL_USER<<5)
69 #define TSS_BASIC_SIZE 104
70 #define TSS_IOMAP_SIZE (16*1024+1) /* 16K for bitmap + 1 terminating byte for convenience */
75 unsigned limit_0_15
: 16;
76 unsigned base_0_15
: 16;
77 unsigned base_16_23
: 8;
79 unsigned limit_16_19
: 4;
80 unsigned available
: 1;
83 unsigned granularity
: 1;
84 unsigned base_24_31
: 8;
85 } __attribute__ ((packed
));
86 typedef struct descriptor descriptor_t
;
88 struct tss_descriptor
{
89 unsigned limit_0_15
: 16;
90 unsigned base_0_15
: 16;
91 unsigned base_16_23
: 8;
96 unsigned limit_16_19
: 4;
97 unsigned available
: 1;
99 unsigned granularity
: 1;
100 unsigned base_24_31
: 8;
101 unsigned base_32_63
: 32;
103 } __attribute__ ((packed
));
104 typedef struct tss_descriptor tss_descriptor_t
;
107 unsigned offset_0_15
: 16;
108 unsigned selector
: 16;
113 unsigned present
: 1;
114 unsigned offset_16_31
: 16;
115 unsigned offset_32_63
: 32;
117 } __attribute__ ((packed
));
118 typedef struct idescriptor idescriptor_t
;
123 } __attribute__ ((packed
));
124 typedef struct ptr_16_64 ptr_16_64_t
;
129 } __attribute__ ((packed
));
130 typedef struct ptr_16_32 ptr_16_32_t
;
148 __u8 iomap
[TSS_IOMAP_SIZE
];
149 } __attribute__ ((packed
));
150 typedef struct tss tss_t
;
154 extern descriptor_t gdt
[];
155 extern idescriptor_t idt
[];
157 extern ptr_16_64_t gdtr
;
158 extern ptr_16_32_t bootstrap_gdtr
;
159 extern ptr_16_32_t protected_ap_gdtr
;
161 extern void pm_init(void);
163 extern void gdt_tss_setbase(descriptor_t
*d
, __address base
);
164 extern void gdt_tss_setlimit(descriptor_t
*d
, __u32 limit
);
166 extern void idt_init(void);
167 extern void idt_setoffset(idescriptor_t
*d
, __address offset
);
169 extern void tss_initialize(tss_t
*t
);