78 lines
2.0 KiB
C
78 lines
2.0 KiB
C
#pragma once
|
|
|
|
#define STA_X 0x8 // Executable segment
|
|
#define STA_W 0x2 // Writeable (non-executable segments)
|
|
#define STA_R 0x2 // Readable (executable segments)
|
|
|
|
// System segment type bits
|
|
#define STS_T32A 0x9 // Available 32-bit TSS
|
|
#define STS_IG32 0xE // 32-bit Interrupt Gate
|
|
#define STS_TG32 0xF // 32-bit Trap Gate
|
|
|
|
#define DPL_USER 3
|
|
|
|
#define FL_IF 0x00000200
|
|
|
|
#define SEG_KCODE 1
|
|
#define SEG_KDATA 2
|
|
#define SEG_UCODE 3
|
|
#define SEG_UDATA 4
|
|
#define SEG_TSS 5
|
|
|
|
#define SEG_ASM(type,base,lim) \
|
|
.word (((lim) >> 12) & 0xffff), ((base) & 0xffff); \
|
|
.byte (((base) >> 16) & 0xff), (0x90 | (type)), \
|
|
(0xC0 | (((lim) >> 28) & 0xf)), (((base) >> 24) & 0xff)
|
|
|
|
#define USER_BASE 0x400000 // 4 MB
|
|
#define USER_STACK_BASE 0xf00000 // 15 MB
|
|
#define KERN_STACK_BASE 0x90000
|
|
|
|
#ifndef __ASSEMBLER__
|
|
typedef unsigned uint;
|
|
typedef unsigned short ushort;
|
|
|
|
struct taskstate {
|
|
uint link; // Old ts selector
|
|
uint esp0; // Stack pointers and segment selectors
|
|
ushort ss0; // after an increase in privilege level
|
|
ushort padding1;
|
|
uint *esp1;
|
|
ushort ss1;
|
|
ushort padding2;
|
|
uint *esp2;
|
|
ushort ss2;
|
|
ushort padding3;
|
|
void *cr3; // Page directory base
|
|
uint *eip; // Saved state from last task switch
|
|
uint eflags;
|
|
uint eax; // More saved state (registers)
|
|
uint ecx;
|
|
uint edx;
|
|
uint ebx;
|
|
uint *esp;
|
|
uint *ebp;
|
|
uint esi;
|
|
uint edi;
|
|
ushort es; // Even more saved state (segment selectors)
|
|
ushort padding4;
|
|
ushort cs;
|
|
ushort padding5;
|
|
ushort ss;
|
|
ushort padding6;
|
|
ushort ds;
|
|
ushort padding7;
|
|
ushort fs;
|
|
ushort padding8;
|
|
ushort gs;
|
|
ushort padding9;
|
|
ushort ldt;
|
|
ushort padding10;
|
|
ushort t; // Trap on task switch
|
|
ushort iomb; // I/O map base address
|
|
};
|
|
|
|
void load_gdt();
|
|
void switchuvm(struct taskstate *tss, void* esp);
|
|
#endif
|