Subversion Repositories shark

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 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  DWORD;
47
    typedef unsigned short WORD;
48
    typedef unsigned char  BYTE;
49
    typedef unsigned long  TIME;
50
    typedef unsigned long  SYS_FLAGS;
51
    #define TRUE        1
52
    #define FALSE       0
53
    #define MAX_DWORD   0xFFFFFFFF
54
    #define MAX_WORD    0xFFFF
55
    #define MAX_BYTE    0xFF
56
    #define MAX_TIME    MAX_DWORD
57
#endif
58
 
59
typedef short CONTEXT;
60
 
61
/* Hardware based types (Self explanatory) */
62
 
63
typedef struct gate {
64
    WORD offset_lo __attribute__ ((packed));
65
    WORD sel __attribute__ ((packed));
66
    BYTE dword_cnt __attribute__ ((packed));
67
    BYTE access __attribute__ ((packed));
68
    WORD offset_hi __attribute__ ((packed));
69
} GATE;
70
 
71
typedef struct descriptor {
72
    WORD lim_lo __attribute__ ((packed));
73
    WORD base_lo __attribute__ ((packed));
74
    BYTE base_med __attribute__ ((packed));
75
    BYTE access __attribute__ ((packed));
76
    BYTE gran __attribute__ ((packed));
77
    BYTE base_hi __attribute__ ((packed));
78
} DESCRIPTOR;
79
 
80
/* A LDT/GDT entry could be a gate or a selector */
81
/* An IDT entry could be a gate only             */
82
 
83
union gdt_entry {
84
    DESCRIPTOR d __attribute__ ((packed));
85
    GATE g __attribute__ ((packed));
86
};
87
 
88
#define STACK_ACCESS    0x92    /* Basic Access bytes */
89
#define DATA_ACCESS     0x92
90
#define CODE_ACCESS     0x9A
91
 
92
/* At this level we just need to set up 2 gates to enter/exit PM */
93
/* The entry gate is a 386 32 bit call gate                      */
94
/* The exit (Back To Real Mode) gate is a 286 16 bit gate        */
95
 
96
#define CALL_GATE286    0x84    /* Call & Int Gate Access bytes */
97
#define CALL_GATE386    0x8C    
98
#define TASK_GATE       0x85
99
#define INT_GATE286     0x86
100
#define INT_GATE386     0x8E
101
#define TRAP_GATE286    0x87
102
#define TRAP_GATE386    0x8F
103
 
104
/* TSS selectors */
105
 
106
#define FREE_TSS386     0x89
107
#define BUSY_TSS386     0x8B
108
#define FREE_TSS286     0x81
109
#define BUSY_TSS286     0x83
110
 
111
#define GRAN_32B        0xC0    /* Granularity settings */
112
#define GRAN_32         0x40
113
#define GRAN_16         0x00
114
 
115
/* This is the TSS image for a 386 hardware task                        */
116
/* I added two other fields to the basic structure:                     */
117
/* 1) The CONTROL field which is used by system software to detect      */
118
/*    particular conditions; in this the first phase it is mainly used  */
119
/*    to mark the unused TSS & TSS which use math, altough thanks to    */
120
/*    the automatic FPU preemption supported in 386 this would be not   */
121
/*    necessary.                                                        */
122
/* 2) The ctx_FPU field used to store the FPU context if necessaary     */
123
 
124
#define TSS_USED                0x8000
125
#define FPU_USED                0x4000
126
 
127
#define FPU_CONTEXT_SIZE        108
128
 
129
/* CPU flags definitions */
130
#define CPU_FLAG_TF     0x00000100
131
#define CPU_FLAG_IF     0x00000200
132
#define CPU_FLAG_IOPL   0x00003000
133
#define CPU_FLAG_NT     0x00004000
134
#define CPU_FLAG_VM     0x00020000
135
#define CPU_FLAG_AC     0x00040000
136
#define CPU_FLAG_VIF    0x00080000
137
#define CPU_FLAG_VIP    0x00100000
138
#define CPU_FLAG_ID     0x00200000
139
 
140
 
141
typedef struct tss {
142
    WORD back_link __attribute__ ((packed));
143
    WORD _fill0 __attribute__ ((packed));
144
    DWORD esp0 __attribute__ ((packed));
145
    WORD ss0 __attribute__ ((packed));
146
    WORD _fill1 __attribute__ ((packed));
147
    DWORD esp1 __attribute__ ((packed));
148
    WORD ss1 __attribute__ ((packed));
149
    WORD _fill2 __attribute__ ((packed));
150
    DWORD esp2 __attribute__ ((packed));
151
    WORD ss2 __attribute__ ((packed));
152
    WORD _fill3 __attribute__ ((packed));
153
    DWORD cr3 __attribute__ ((packed));
154
    DWORD eip __attribute__ ((packed));
155
    DWORD eflags __attribute__ ((packed));
156
    DWORD eax __attribute__ ((packed));
157
    DWORD ecx __attribute__ ((packed));
158
    DWORD edx __attribute__ ((packed));
159
    DWORD ebx __attribute__ ((packed));
160
    DWORD esp __attribute__ ((packed));
161
    DWORD ebp __attribute__ ((packed));
162
    DWORD esi __attribute__ ((packed));
163
    DWORD edi __attribute__ ((packed));
164
    WORD es __attribute__ ((packed));
165
    WORD _fill5 __attribute__ ((packed));
166
    WORD cs __attribute__ ((packed));
167
    WORD _fill6 __attribute__ ((packed));
168
    WORD ss __attribute__ ((packed));
169
    WORD _fill7 __attribute__ ((packed));
170
    WORD ds __attribute__ ((packed));
171
    WORD _fill8 __attribute__ ((packed));
172
    WORD fs __attribute__ ((packed));
173
    WORD _fill9 __attribute__ ((packed));
174
    WORD gs __attribute__ ((packed));
175
    WORD _fill10 __attribute__ ((packed));
176
    WORD ldt __attribute__ ((packed));
177
    WORD _fill11 __attribute__ ((packed));
178
    WORD trap __attribute__ ((packed));
179
    WORD io_base __attribute__ ((packed));
180
    DWORD control __attribute__ ((packed));
181
    BYTE ctx_FPU[FPU_CONTEXT_SIZE] __attribute__ ((packed));
182
} TSS;
183
 
184
/* Irq services specifications */
185
 
186
#define TIMER_IRQ       0
187
#define KEYB_IRQ        1
188
#define COM2_IRQ        3
189
#define COM1_IRQ        4
190
#define COM4_IRQ        3
191
#define COM3_IRQ        4
192
#define SB_IRQ          5
193
#define FDC_IRQ         6
194
#define SB2_IRQ         7
195
#define RTC_IRQ         8
196
#define PS2MOUSE_IRQ    12
197
#define COPROC_IRQ      13
198
#define IDE0_IRQ        14
199
#define IDE1_IRQ        15
200
 
201
typedef void (*INTERRUPT)(void);
202
 
203
/* Any Kernel primitive is declared with the SYSCALL() modifier         */
204
/* This is useful to add special purposes meaning to the function       */
205
/* defclaration                                                         */
206
 
207
#define SYSCALL(x)      x
208
 
209
END_DEF
210
 
211
#endif