Fix amd64 and ia32 management of I/O bitmap in before_task_runs_arch()
[helenos.git] / arch / amd64 / include / pm.h
blob508aeeaa9296b693948fcee137deeeae80c82789
1 /*
2 * Copyright (C) 2001-2004 Jakub Jermar
3 * All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
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__
32 #ifndef __ASM__
33 # include <arch/types.h>
34 # include <typedefs.h>
35 # include <arch/context.h>
36 #endif
38 #define IDT_ITEMS 64
39 #define GDT_ITEMS 8
41 #define NULL_DES 0
42 /* Warning: Do not reorder next items, unless you look into syscall.c!!! */
43 #define KTEXT_DES 1
44 #define KDATA_DES 2
45 #define UDATA_DES 3
46 #define UTEXT_DES 4
47 #define KTEXT32_DES 5
48 /* EndOfWarning */
49 #define TSS_DES 6
51 #define gdtselector(des) ((des)<<3)
52 #define idtselector(des) ((des)<<4)
54 #define PL_KERNEL 0
55 #define PL_USER 3
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)
62 #define AR_TSS (0x9)
63 #define AR_INTERRUPT (0xe)
64 #define AR_TRAP (0xf)
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 */
72 #ifndef __ASM__
74 struct descriptor {
75 unsigned limit_0_15: 16;
76 unsigned base_0_15: 16;
77 unsigned base_16_23: 8;
78 unsigned access: 8;
79 unsigned limit_16_19: 4;
80 unsigned available: 1;
81 unsigned longmode: 1;
82 unsigned special: 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;
92 unsigned type: 4;
93 unsigned : 1;
94 unsigned dpl : 2;
95 unsigned present : 1;
96 unsigned limit_16_19: 4;
97 unsigned available: 1;
98 unsigned : 2;
99 unsigned granularity : 1;
100 unsigned base_24_31: 8;
101 unsigned base_32_63 : 32;
102 unsigned : 32;
103 } __attribute__ ((packed));
104 typedef struct tss_descriptor tss_descriptor_t;
106 struct idescriptor {
107 unsigned offset_0_15: 16;
108 unsigned selector: 16;
109 unsigned ist:3;
110 unsigned unused: 5;
111 unsigned type: 5;
112 unsigned dpl: 2;
113 unsigned present : 1;
114 unsigned offset_16_31: 16;
115 unsigned offset_32_63: 32;
116 unsigned : 32;
117 } __attribute__ ((packed));
118 typedef struct idescriptor idescriptor_t;
120 struct ptr_16_64 {
121 __u16 limit;
122 __u64 base;
123 } __attribute__ ((packed));
124 typedef struct ptr_16_64 ptr_16_64_t;
126 struct ptr_16_32 {
127 __u16 limit;
128 __u32 base;
129 } __attribute__ ((packed));
130 typedef struct ptr_16_32 ptr_16_32_t;
132 struct tss {
133 __u32 reserve1;
134 __u64 rsp0;
135 __u64 rsp1;
136 __u64 rsp2;
137 __u64 reserve2;
138 __u64 ist1;
139 __u64 ist2;
140 __u64 ist3;
141 __u64 ist4;
142 __u64 ist5;
143 __u64 ist6;
144 __u64 ist7;
145 __u64 reserve3;
146 __u16 reserve4;
147 __u16 iomap_base;
148 __u8 iomap[TSS_IOMAP_SIZE];
149 } __attribute__ ((packed));
150 typedef struct tss tss_t;
152 extern tss_t *tss_p;
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);
171 #endif /* __ASM__ */
173 #endif