Subversion Repositories shark

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
42 pj 1
/* Project:     OSLib
2
 * Description: The OS Construction Kit
3
 * Date:                1.6.2000
4
 * Idea by:             Luca Abeni & Gerardo Lamastra
5
 *
6
 * OSLib is an SO project aimed at developing a common, easy-to-use
7
 * low-level infrastructure for developing OS kernels and Embedded
8
 * Applications; it partially derives from the HARTIK project but it
9
 * currently is independently developed.
10
 *
11
 * OSLib is distributed under GPL License, and some of its code has
12
 * been derived from the Linux kernel source; also some important
13
 * ideas come from studying the DJGPP go32 extender.
14
 *
15
 * We acknowledge the Linux Community, Free Software Foundation,
16
 * D.J. Delorie and all the other developers who believe in the
17
 * freedom of software and ideas.
18
 *
19
 * For legalese, check out the included GPL license.
20
 */
21
 
22
/*      As the name says... All the hardware-dependent data structures... */
23
 
24
#ifndef __LL_I386_HW_DATA_H__
25
#define __LL_I386_HW_DATA_H__
26
 
27
#include <ll/i386/defs.h>
28
BEGIN_DEF
29
 
30
/* DO WE NEED A SEPARATE INCL FILE FOR THIS? */
31
#if defined(__GNU__)
32
#define __LL_ARCH__ "32/DJGPP C/COFF"
33
#elif defined(__LINUX__)
34
#define __LL_ARCH__ "32/LINUX CrossCompiled/ELF"
35
#else
36
#error Architecture Undefined!
37
#endif
38
 
39
#include <ll/i386/sel.h>
40
 
41
/* Useful basic types */
42
 
43
#ifndef __BASIC_DATA__
44
    #define __BASIC_DATA__
45
    typedef void *LIN_ADDR;
46
    typedef unsigned long long  QWORD;
47
    typedef unsigned long  DWORD;
48
    typedef unsigned short WORD;
49
    typedef unsigned char  BYTE;
50
    typedef unsigned long  TIME;
51
    typedef unsigned long  SYS_FLAGS;
52
    #define TRUE        1
53
    #define FALSE       0
54
    #define MAX_DWORD   0xFFFFFFFF
55
    #define MAX_WORD    0xFFFF
56
    #define MAX_BYTE    0xFF
57
    #define MAX_TIME    MAX_DWORD
58
#endif
59
 
60
typedef short CONTEXT;
61
 
62
/* Hardware based types (Self explanatory) */
63
 
64
typedef struct gate {
65
    WORD offset_lo __attribute__ ((packed));
66
    WORD sel __attribute__ ((packed));
67
    BYTE dword_cnt __attribute__ ((packed));
68
    BYTE access __attribute__ ((packed));
69
    WORD offset_hi __attribute__ ((packed));
70
} GATE;
71
 
72
typedef struct descriptor {
73
    WORD lim_lo __attribute__ ((packed));
74
    WORD base_lo __attribute__ ((packed));
75
    BYTE base_med __attribute__ ((packed));
76
    BYTE access __attribute__ ((packed));
77
    BYTE gran __attribute__ ((packed));
78
    BYTE base_hi __attribute__ ((packed));
79
} DESCRIPTOR;
80
 
81
/* A LDT/GDT entry could be a gate or a selector */
82
/* An IDT entry could be a gate only             */
83
 
84
union gdt_entry {
85
    DESCRIPTOR d __attribute__ ((packed));
86
    GATE g __attribute__ ((packed));
87
};
88
 
89
struct registers {
90
    DWORD dummy1;
91
    DWORD dummy2;
92
    DWORD egs;
93
    DWORD efs;
94
    DWORD ees;
95
    DWORD ess;
96
    DWORD eds;
97
    DWORD edi;
98
    DWORD esi;
99
    DWORD ebp;
100
    DWORD esp;
101
    DWORD ebx;
102
    DWORD edx;
103
    DWORD ecx;
104
    DWORD eax;
105
    DWORD eip;
106
    DWORD ecs;
107
    DWORD flags;
108
};
109
 
110
#define STACK_ACCESS    0x92    /* Basic Access bytes */
111
#define DATA_ACCESS     0x92
112
#define CODE_ACCESS     0x9A
113
 
114
/* At this level we just need to set up 2 gates to enter/exit PM */
115
/* The entry gate is a 386 32 bit call gate                      */
116
/* The exit (Back To Real Mode) gate is a 286 16 bit gate        */
117
 
118
#define CALL_GATE286    0x84    /* Call & Int Gate Access bytes */
119
#define CALL_GATE386    0x8C    
120
#define TASK_GATE       0x85
121
#define INT_GATE286     0x86
122
#define INT_GATE386     0x8E
123
#define TRAP_GATE286    0x87
124
#define TRAP_GATE386    0x8F
125
 
126
/* TSS selectors */
127
 
128
#define FREE_TSS386     0x89
129
#define BUSY_TSS386     0x8B
130
#define FREE_TSS286     0x81
131
#define BUSY_TSS286     0x83
132
 
133
#define GRAN_32B        0xC0    /* Granularity settings */
134
#define GRAN_32         0x40
135
#define GRAN_16         0x00
136
 
137
/* This is the TSS image for a 386 hardware task                        */
138
/* I added two other fields to the basic structure:                     */
139
/* 1) The CONTROL field which is used by system software to detect      */
140
/*    particular conditions; in this the first phase it is mainly used  */
141
/*    to mark the unused TSS & TSS which use math, altough thanks to    */
142
/*    the automatic FPU preemption supported in 386 this would be not   */
143
/*    necessary.                                                        */
144
/* 2) The ctx_FPU field used to store the FPU context if necessaary     */
145
 
146
#define TSS_USED                0x8000
147
#define FPU_USED                0x4000
148
 
149
#define FPU_CONTEXT_SIZE        108
150
 
151
/* CPU flags definitions */
152
#define CPU_FLAG_TF     0x00000100
153
#define CPU_FLAG_IF     0x00000200
154
#define CPU_FLAG_IOPL   0x00003000
155
#define CPU_FLAG_NT     0x00004000
156
#define CPU_FLAG_VM     0x00020000
157
#define CPU_FLAG_AC     0x00040000
158
#define CPU_FLAG_VIF    0x00080000
159
#define CPU_FLAG_VIP    0x00100000
160
#define CPU_FLAG_ID     0x00200000
161
 
162
 
163
typedef struct tss {
164
    WORD back_link __attribute__ ((packed));
165
    WORD _fill0 __attribute__ ((packed));
166
    DWORD esp0 __attribute__ ((packed));
167
    WORD ss0 __attribute__ ((packed));
168
    WORD _fill1 __attribute__ ((packed));
169
    DWORD esp1 __attribute__ ((packed));
170
    WORD ss1 __attribute__ ((packed));
171
    WORD _fill2 __attribute__ ((packed));
172
    DWORD esp2 __attribute__ ((packed));
173
    WORD ss2 __attribute__ ((packed));
174
    WORD _fill3 __attribute__ ((packed));
175
    DWORD cr3 __attribute__ ((packed));
176
    DWORD eip __attribute__ ((packed));
177
    DWORD eflags __attribute__ ((packed));
178
    DWORD eax __attribute__ ((packed));
179
    DWORD ecx __attribute__ ((packed));
180
    DWORD edx __attribute__ ((packed));
181
    DWORD ebx __attribute__ ((packed));
182
    DWORD esp __attribute__ ((packed));
183
    DWORD ebp __attribute__ ((packed));
184
    DWORD esi __attribute__ ((packed));
185
    DWORD edi __attribute__ ((packed));
186
    WORD es __attribute__ ((packed));
187
    WORD _fill5 __attribute__ ((packed));
188
    WORD cs __attribute__ ((packed));
189
    WORD _fill6 __attribute__ ((packed));
190
    WORD ss __attribute__ ((packed));
191
    WORD _fill7 __attribute__ ((packed));
192
    WORD ds __attribute__ ((packed));
193
    WORD _fill8 __attribute__ ((packed));
194
    WORD fs __attribute__ ((packed));
195
    WORD _fill9 __attribute__ ((packed));
196
    WORD gs __attribute__ ((packed));
197
    WORD _fill10 __attribute__ ((packed));
198
    WORD ldt __attribute__ ((packed));
199
    WORD _fill11 __attribute__ ((packed));
200
    WORD trap __attribute__ ((packed));
201
    WORD io_base __attribute__ ((packed));
202
    DWORD control __attribute__ ((packed));
203
    BYTE ctx_FPU[FPU_CONTEXT_SIZE] __attribute__ ((packed));
204
} TSS;
205
 
206
/* Irq services specifications */
207
 
208
#define TIMER_IRQ       0
209
#define KEYB_IRQ        1
210
#define COM2_IRQ        3
211
#define COM1_IRQ        4
212
#define COM4_IRQ        3
213
#define COM3_IRQ        4
214
#define SB_IRQ          5
215
#define FDC_IRQ         6
216
#define SB2_IRQ         7
217
#define RTC_IRQ         8
218
#define PS2MOUSE_IRQ    12
219
#define COPROC_IRQ      13
220
#define IDE0_IRQ        14
221
#define IDE1_IRQ        15
222
 
223
typedef void (*INTERRUPT)(void);
224
 
225
/* Any Kernel primitive is declared with the SYSCALL() modifier         */
226
/* This is useful to add special purposes meaning to the function       */
227
/* defclaration                                                         */
228
 
229
#define SYSCALL(x)      x
230
 
231
END_DEF
232
 
233
#endif