#ifndef HAZEL_KERNEL_H_ #define HAZEL_KERNEL_H_ #include #include #define cpu_relax asm volatile ("pause" ::) #define CHECK_FLAG(x, n) (x & (1<> 22) & 0x3FF) #define PAGE_TAB_INDEX(x) (((x) >> 12) & 0x3FF) #define PAGE_OFFSET(x) ((x) & 0xFFF) struct tss_entry { uint32_t prev_tss; // The previous TSS - with hardware task switching this is used uint32_t esp0; // The stack pointer to load when we change to kernel mode uint32_t ss0; // The stack segment to load when we change to kernel mode uint32_t esp1; // Unused... uint32_t ss1; uint32_t esp2; uint32_t ss2; uint32_t cr3; uint32_t eip; uint32_t eflags; uint32_t eax; uint32_t ecx; uint32_t edx; uint32_t ebx; uint32_t esp; uint32_t ebp; uint32_t esi; uint32_t edi; uint32_t es; // The value to load into ES when we change to kernel mode uint32_t cs; // The value to load into CS when we change to kernel mode uint32_t ss; // The value to load into SS when we change to kernel mode uint32_t ds; // The value to load into DS when we change to kernel mode uint32_t fs; // The value to load into FS when we change to kernel mode uint32_t gs; // The value to load into GS when we change to kernel mode uint32_t ldt; // Unused... uint16_t trap; uint16_t iomap_base; } __attribute__((packed)); typedef struct tss_entry tss_t; #define EI_NIDENT 16 typedef uint16_t Elf32_Half; typedef uint32_t Elf32_Addr; typedef uint32_t Elf32_Off; typedef uint32_t Elf32_Word; typedef int32_t Elf32_Sword; typedef struct { uint8_t e_ident[EI_NIDENT]; Elf32_Half e_type; Elf32_Half e_machine; Elf32_Word e_version; Elf32_Addr e_entry; Elf32_Off e_phoff; Elf32_Off e_shoff; Elf32_Word e_flags; Elf32_Half e_ehsize; Elf32_Half e_phentsize; Elf32_Half e_phnum; Elf32_Half e_shentsize; Elf32_Half e_shnum; Elf32_Half e_shstrndx; } elf_t; typedef struct { Elf32_Word sh_name; Elf32_Word sh_type; Elf32_Word sh_flags; Elf32_Addr sh_addr; Elf32_Off sh_offset; Elf32_Word sh_size; Elf32_Word sh_link; Elf32_Word sh_info; Elf32_Word sh_addralign; Elf32_Word sh_entsize; } section_t; #endif