basekernel/kernel/x86.h

149 lines
2.5 KiB
C

/*
Copyright (C) 2015-2019 The University of Notre Dame
This software is distributed under the GNU General Public License.
See the file LICENSE for details.
*/
#ifndef X86_H
#define X86_H
#include "kernel/types.h"
#define X86_SEGMENT_SELECTOR( seg, rpl ) (((seg)<<3)+(rpl))
#define X86_SEGMENT_KERNEL_CODE X86_SEGMENT_SELECTOR(1,0)
#define X86_SEGMENT_KERNEL_DATA X86_SEGMENT_SELECTOR(2,0)
#define X86_SEGMENT_USER_CODE X86_SEGMENT_SELECTOR(3,3)
#define X86_SEGMENT_USER_DATA X86_SEGMENT_SELECTOR(4,3)
#define X86_SEGMENT_TSS X86_SEGMENT_SELECTOR(5,0)
struct x86_eflags {
unsigned carry:1;
unsigned reserved0:1;
unsigned parity:1;
unsigned reserved1:1;
unsigned auxcarry:1;
unsigned reserved2:1;
unsigned zero:1;
unsigned sign:1;
unsigned trap:1;
unsigned interrupt:1;
unsigned direction:1;
unsigned overflow:1;
unsigned iopl:2;
unsigned nested:1;
unsigned reserved3:1;
unsigned resume:1;
unsigned v86:1;
unsigned align:1;
unsigned vinterrupt:1;
unsigned vpending:1;
unsigned id:1;
};
struct x86_regs {
int32_t eax;
int32_t ebx;
int32_t ecx;
int32_t edx;
int32_t esi;
int32_t edi;
int32_t ebp;
};
struct x86_stack {
/* Registers saved by process_switch */
struct x86_regs regs2;
/* Stack frame of process_switch */
int32_t old_ebp;
int32_t old_eip;
/* Pushed by intr_handler in kernelcore */
struct x86_regs regs1;
int32_t gs;
int32_t fs;
int32_t es;
int32_t ds;
/* Pushed by intrXX in kernelcore. */
int32_t intr_num;
int32_t intr_code;
/* Pushed by X86 CPU Hardware. */
int32_t eip;
int32_t cs;
struct x86_eflags eflags;
int32_t esp;
int32_t ss;
};
struct x86_segment {
uint16_t limit0;
uint16_t base0;
uint8_t base1;
unsigned type:4;
unsigned stype:1;
unsigned dpl:2;
unsigned present:1;
unsigned limit1:4;
unsigned avail:1;
unsigned zero:1;
unsigned size:1;
unsigned granularity:1;
uint8_t base2;
};
struct x86_tss {
int16_t prev;
int16_t reserved;
int32_t esp0;
int16_t ss0;
int16_t reserved0;
int32_t esp1;
int16_t ss1;
int16_t reserved1;
int32_t esp2;
int16_t ss2;
int16_t reserved2;
int32_t cr3;
int32_t eip;
int32_t eflags;
int32_t eax;
int32_t ecx;
int32_t edx;
int32_t ebx;
int32_t esp;
int32_t ebp;
int32_t esi;
int32_t edi;
int16_t es;
int16_t reserved3;
int16_t cs;
int16_t reserved4;
int16_t ss;
int16_t reserved5;
int16_t ds;
int16_t reserved6;
int16_t fs;
int16_t reserved7;
int16_t gs;
int16_t reserved8;
int16_t ldt;
int16_t reserved9;
int16_t t;
int16_t iomap;
};
struct x86_gdt_init {
int16_t size;
struct x86_segment *base;
};
#endif