~galfy/helenos/bird-port-mainline

« back to all changes in this revision

Viewing changes to kernel/arch/ia32/include/pm.h

  • Committer: Martin Decky
  • Date: 2009-08-04 11:19:19 UTC
  • Revision ID: martin@uranus.dsrg.hide.ms.mff.cuni.cz-20090804111919-evyclddlr3v5lhmp
Initial import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 2001-2004 Jakub Jermar
 
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
 *
 
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.
 
16
 *
 
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.
 
27
 */
 
28
 
 
29
/** @addtogroup ia32
 
30
 * @{
 
31
 */
 
32
/** @file
 
33
 */
 
34
 
 
35
#ifndef KERN_ia32_PM_H_
 
36
#define KERN_ia32_PM_H_
 
37
 
 
38
#define IDT_ITEMS  64
 
39
#define GDT_ITEMS  7
 
40
 
 
41
#define NULL_DES   0
 
42
#define KTEXT_DES  1
 
43
#define KDATA_DES  2
 
44
#define UTEXT_DES  3
 
45
#define UDATA_DES  4
 
46
#define TSS_DES    5
 
47
#define TLS_DES    6  /* Pointer to Thread-Local-Storage data */
 
48
 
 
49
#ifdef CONFIG_FB
 
50
 
 
51
#define VESA_INIT_SEGMENT  0x8000
 
52
#define VESA_INIT_DES      7
 
53
#define KTEXT32_DES        KTEXT_DES
 
54
 
 
55
#undef GDT_ITEMS
 
56
#define GDT_ITEMS  8
 
57
 
 
58
#endif /* CONFIG_FB */
 
59
 
 
60
#define gdtselector(des)  ((des) << 3)
 
61
 
 
62
#define PL_KERNEL  0
 
63
#define PL_USER    3
 
64
 
 
65
#define AR_PRESENT    (1 << 7)
 
66
#define AR_DATA       (2 << 3)
 
67
#define AR_CODE       (3 << 3)
 
68
#define AR_WRITABLE   (1 << 1)
 
69
#define AR_INTERRUPT  (0x0e)
 
70
#define AR_TSS        (0x09)
 
71
 
 
72
#define DPL_KERNEL  (PL_KERNEL << 5)
 
73
#define DPL_USER    (PL_USER << 5)
 
74
 
 
75
#define TSS_BASIC_SIZE  104
 
76
#define TSS_IOMAP_SIZE  (16 * 1024 + 1)  /* 16K for bitmap + 1 terminating byte for convenience */
 
77
 
 
78
#define IO_PORTS  (64 * 1024)
 
79
 
 
80
#ifndef __ASM__
 
81
 
 
82
#include <arch/types.h>
 
83
#include <arch/context.h>
 
84
 
 
85
typedef struct {
 
86
        uint16_t limit;
 
87
        uint32_t base;
 
88
} __attribute__ ((packed)) ptr_16_32_t;
 
89
 
 
90
typedef struct {
 
91
        unsigned limit_0_15: 16;
 
92
        unsigned base_0_15: 16;
 
93
        unsigned base_16_23: 8;
 
94
        unsigned access: 8;
 
95
        unsigned limit_16_19: 4;
 
96
        unsigned available: 1;
 
97
        unsigned unused: 1;
 
98
        unsigned special: 1;
 
99
        unsigned granularity : 1;
 
100
        unsigned base_24_31: 8;
 
101
} __attribute__ ((packed)) descriptor_t;
 
102
 
 
103
typedef struct {
 
104
        unsigned offset_0_15: 16;
 
105
        unsigned selector: 16;
 
106
        unsigned unused: 8;
 
107
        unsigned access: 8;
 
108
        unsigned offset_16_31: 16;
 
109
} __attribute__ ((packed)) idescriptor_t;
 
110
 
 
111
typedef struct {
 
112
        uint16_t link;
 
113
        unsigned : 16;
 
114
        uint32_t esp0;
 
115
        uint16_t ss0;
 
116
        unsigned : 16;
 
117
        uint32_t esp1;
 
118
        uint16_t ss1;
 
119
        unsigned : 16;
 
120
        uint32_t esp2;
 
121
        uint16_t ss2;
 
122
        unsigned : 16;
 
123
        uint32_t cr3;
 
124
        uint32_t eip;
 
125
        uint32_t eflags;
 
126
        uint32_t eax;
 
127
        uint32_t ecx;
 
128
        uint32_t edx;
 
129
        uint32_t ebx;
 
130
        uint32_t esp;
 
131
        uint32_t ebp;
 
132
        uint32_t esi;
 
133
        uint32_t edi;
 
134
        uint16_t es;
 
135
        unsigned : 16;
 
136
        uint16_t cs;
 
137
        unsigned : 16;
 
138
        uint16_t ss;
 
139
        unsigned : 16;
 
140
        uint16_t ds;
 
141
        unsigned : 16;
 
142
        uint16_t fs;
 
143
        unsigned : 16;
 
144
        uint16_t gs;
 
145
        unsigned : 16;
 
146
        uint16_t ldtr;
 
147
        unsigned : 16;
 
148
        unsigned : 16;
 
149
        uint16_t iomap_base;
 
150
        uint8_t iomap[TSS_IOMAP_SIZE];
 
151
} __attribute__ ((packed)) tss_t;
 
152
 
 
153
extern ptr_16_32_t gdtr;
 
154
extern ptr_16_32_t bootstrap_gdtr;
 
155
extern ptr_16_32_t protected_ap_gdtr;
 
156
extern tss_t *tss_p;
 
157
 
 
158
extern descriptor_t gdt[];
 
159
 
 
160
extern void pm_init(void);
 
161
 
 
162
extern void gdt_setbase(descriptor_t *d, uintptr_t base);
 
163
extern void gdt_setlimit(descriptor_t *d, uint32_t limit);
 
164
 
 
165
extern void idt_init(void);
 
166
extern void idt_setoffset(idescriptor_t *d, uintptr_t offset);
 
167
 
 
168
extern void tss_initialize(tss_t *t);
 
169
extern void set_tls_desc(uintptr_t tls);
 
170
 
 
171
#endif /* __ASM__ */
 
172
 
 
173
#endif
 
174
 
 
175
/** @}
 
176
 */