Merge into main the new state of the operating system/kernel #1
12
Makefile
12
Makefile
@ -5,7 +5,7 @@ CC = ${HOME}/opt/cross/bin/i686-elf-gcc
|
|||||||
CPP = ${HOME}/opt/cross/bin/i686-elf-g++
|
CPP = ${HOME}/opt/cross/bin/i686-elf-g++
|
||||||
CFLAGS = -ffreestanding -Og -ggdb -Wall -Wextra
|
CFLAGS = -ffreestanding -Og -ggdb -Wall -Wextra
|
||||||
|
|
||||||
OFILES =$(BUILD_DIR)/boot.o $(BUILD_DIR)/kterm.o $(BUILD_DIR)/kernel.o $(BUILD_DIR)/memory.o $(BUILD_DIR)/paging.o $(BUILD_DIR)/pit.o $(BUILD_DIR)/time.o $(BUILD_DIR)/keyboard.o $(BUILD_DIR)/io.o $(BUILD_DIR)/gdtc.o $(BUILD_DIR)/idt.o $(BUILD_DIR)/pic.o $(BUILD_DIR)/sv-terminal.o $(BUILD_DIR)/string.o $(BUILD_DIR)/prekernel.o $(BUILD_DIR)/cpu.o $(BUILD_DIR)/KHeap.o $(BUILD_DIR)/pci.o $(BUILD_DIR)/pcidevice.o $(BUILD_DIR)/atapiDevice.o $(BUILD_DIR)/ataDevice.o $(BUILD_DIR)/rsdp.o
|
OFILES =$(BUILD_DIR)/boot.o $(BUILD_DIR)/kterm.o $(BUILD_DIR)/kernel.o $(BUILD_DIR)/memory.o $(BUILD_DIR)/paging.o $(BUILD_DIR)/pit.o $(BUILD_DIR)/time.o $(BUILD_DIR)/keyboard.o $(BUILD_DIR)/io.o $(BUILD_DIR)/gdtc.o $(BUILD_DIR)/idt.o $(BUILD_DIR)/pic.o $(BUILD_DIR)/sv-terminal.o $(BUILD_DIR)/string.o $(BUILD_DIR)/prekernel.o $(BUILD_DIR)/cpu.o $(BUILD_DIR)/KHeap.o $(BUILD_DIR)/pci.o $(BUILD_DIR)/pcidevice.o $(BUILD_DIR)/atapiDevice.o $(BUILD_DIR)/ataDevice.o $(BUILD_DIR)/rsdp.o $(BUILD_DIR)/acpi.o
|
||||||
|
|
||||||
SRC_DIR = source
|
SRC_DIR = source
|
||||||
BUILD_DIR = build
|
BUILD_DIR = build
|
||||||
@ -36,12 +36,12 @@ run: all
|
|||||||
virtualboxvm --startvm "BarinkOS_test"
|
virtualboxvm --startvm "BarinkOS_test"
|
||||||
debug: all
|
debug: all
|
||||||
objcopy --only-keep-debug build/myos.bin kernel.sym
|
objcopy --only-keep-debug build/myos.bin kernel.sym
|
||||||
$(EMULATOR) -cdrom build/barinkOS.iso -serial stdio -vga std -display gtk -m 2G -cpu core2duo -s -d int
|
$(EMULATOR) -cdrom build/barinkOS.iso -serial stdio -vga std -display gtk -m 2G -cpu core2duo -s -d int -no-shutdown -no-reboot
|
||||||
test:
|
test:
|
||||||
$(EMULATOR) -kernel $(BUILD_DIR)/myos.bin -serial stdio -vga std -display gtk -m 2G -cpu core2duo
|
$(EMULATOR) -kernel $(BUILD_DIR)/myos.bin -serial stdio -vga std -display gtk -m 2G -cpu core2duo -d int -no-shutdown -no-reboot
|
||||||
|
|
||||||
test_iso:
|
test_iso:
|
||||||
$(EMULATOR) -boot d -cdrom $(BUILD_DIR)/barinkOS.iso -serial stdio -vga std -display gtk -m 2G -cpu core2duo
|
$(EMULATOR) -boot d -cdrom $(BUILD_DIR)/barinkOS.iso -serial stdio -vga std -display gtk -m 2G -cpu core2duo -d int -no-reboot -no-shutdown
|
||||||
test_disk:
|
test_disk:
|
||||||
$(EMULATOR) -boot d -drive format=raw,file=build/disk.img -serial stdio -vga std -display gtk -m 2G -cpu core2duo
|
$(EMULATOR) -boot d -drive format=raw,file=build/disk.img -serial stdio -vga std -display gtk -m 2G -cpu core2duo
|
||||||
|
|
||||||
@ -97,6 +97,9 @@ $(BUILD_DIR)/ataDevice.o:
|
|||||||
$(BUILD_DIR)/rsdp.o:
|
$(BUILD_DIR)/rsdp.o:
|
||||||
$(CPP) -c $(SRC_DIR)/kernel/drivers/acpi/rsdp.cpp -o $(BUILD_DIR)/rsdp.o $(CFLAGS) -fno-exceptions -fno-rtti
|
$(CPP) -c $(SRC_DIR)/kernel/drivers/acpi/rsdp.cpp -o $(BUILD_DIR)/rsdp.o $(CFLAGS) -fno-exceptions -fno-rtti
|
||||||
|
|
||||||
|
$(BUILD_DIR)/acpi.o:
|
||||||
|
$(CPP) -c $(SRC_DIR)/kernel/drivers/acpi/acpi.cpp -o $(BUILD_DIR)/acpi.o $(CFLAGS) -fno-exceptions -fno-rtti
|
||||||
|
|
||||||
$(BUILD_DIR)/pit.o:
|
$(BUILD_DIR)/pit.o:
|
||||||
$(CPP) -c $(SRC_DIR)/kernel/drivers/pit/pit.cpp -o $(BUILD_DIR)/pit.o $(CFLAGS) -fno-exceptions -fno-rtti
|
$(CPP) -c $(SRC_DIR)/kernel/drivers/pit/pit.cpp -o $(BUILD_DIR)/pit.o $(CFLAGS) -fno-exceptions -fno-rtti
|
||||||
|
|
||||||
@ -126,6 +129,7 @@ $(BUILD_DIR)/cpu.o:
|
|||||||
$(CPP) -c $(SRC_DIR)/kernel/cpu.cpp -o $(BUILD_DIR)/cpu.o $(CFLAGS) -fno-exceptions -fno-rtti
|
$(CPP) -c $(SRC_DIR)/kernel/cpu.cpp -o $(BUILD_DIR)/cpu.o $(CFLAGS) -fno-exceptions -fno-rtti
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Assembly -> Object files
|
# Assembly -> Object files
|
||||||
$(BUILD_DIR)/boot.o:
|
$(BUILD_DIR)/boot.o:
|
||||||
$(AS) $(SRC_DIR)/kernel/boot/boot.s -o $(BUILD_DIR)/boot.o
|
$(AS) $(SRC_DIR)/kernel/boot/boot.s -o $(BUILD_DIR)/boot.o
|
||||||
|
@ -29,7 +29,6 @@
|
|||||||
<input type="checkbox" /> USTAR Filesystem ( For its simplicity this is very likely the first filesystem the OS is going to support) \
|
<input type="checkbox" /> USTAR Filesystem ( For its simplicity this is very likely the first filesystem the OS is going to support) \
|
||||||
<input type="checkbox" /> ACPI support ( Or some other basic way to support shutdown, reboot and possibly hibernation ) \
|
<input type="checkbox" /> ACPI support ( Or some other basic way to support shutdown, reboot and possibly hibernation ) \
|
||||||
<input type="checkbox" /> ATAPI support \
|
<input type="checkbox" /> ATAPI support \
|
||||||
<input type="checkbox" /> Keyboard support ( P/S2 Keyboard) \
|
|
||||||
<input type="checkbox" checked/> Memory Management (MMU)
|
<input type="checkbox" checked/> Memory Management (MMU)
|
||||||
<input type="checkbox" /> Hardware Management system
|
<input type="checkbox" /> Hardware Management system
|
||||||
|
|
||||||
@ -49,3 +48,4 @@
|
|||||||
<input type="checkbox" /> Basic Window server/client \
|
<input type="checkbox" /> Basic Window server/client \
|
||||||
<input type="checkbox" /> EXT2 Filesystem
|
<input type="checkbox" /> EXT2 Filesystem
|
||||||
<input type="checkbox" /> USTAR Filesystem \
|
<input type="checkbox" /> USTAR Filesystem \
|
||||||
|
<input type="checkbox" /> FAT16 Filesystem \
|
||||||
|
@ -83,7 +83,7 @@ isPaging:
|
|||||||
call prekernelSetup
|
call prekernelSetup
|
||||||
|
|
||||||
# Unmap the identity mapping as it is now unnecessary
|
# Unmap the identity mapping as it is now unnecessary
|
||||||
movl $0, boot_page_directory + 0
|
# movl $0, boot_page_directory + 0
|
||||||
|
|
||||||
# Reload cr3 to force tlb flush
|
# Reload cr3 to force tlb flush
|
||||||
movl %cr3, %ecx
|
movl %cr3, %ecx
|
||||||
|
14
source/kernel/drivers/acpi/acpi.cpp
Normal file
14
source/kernel/drivers/acpi/acpi.cpp
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#include "acpi.h"
|
||||||
|
RSDPTR* ACPI::rsd_ptr;
|
||||||
|
RSDT* ACPI::rsd_table;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void ACPI::initialize(){
|
||||||
|
|
||||||
|
// Find the Root System Description Pointer
|
||||||
|
ACPI::rsd_ptr = FindRSD();
|
||||||
|
printRSD(rsd_ptr);
|
||||||
|
// Get the Root System Description Table
|
||||||
|
ACPI::rsd_table = getRSDT(rsd_ptr);
|
||||||
|
}
|
13
source/kernel/drivers/acpi/acpi.h
Normal file
13
source/kernel/drivers/acpi/acpi.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "rsdp.h"
|
||||||
|
class ACPI {
|
||||||
|
public:
|
||||||
|
static void initialize();
|
||||||
|
|
||||||
|
// In the future ACPI might start
|
||||||
|
// doing more systems initialization
|
||||||
|
|
||||||
|
private:
|
||||||
|
static RSDPTR* rsd_ptr;
|
||||||
|
static RSDT* rsd_table;
|
||||||
|
};
|
@ -27,8 +27,6 @@ struct RSDT{
|
|||||||
uint32_t PointerToSDT[]; // Length of array : (header.Length - sizeof(header))/ 4
|
uint32_t PointerToSDT[]; // Length of array : (header.Length - sizeof(header))/ 4
|
||||||
}__attribute__((packed));
|
}__attribute__((packed));
|
||||||
|
|
||||||
|
|
||||||
//NOTE: only scans EBDA enough to find RSD PTR in QEMU
|
|
||||||
RSDPTR* FindRSD();
|
RSDPTR* FindRSD();
|
||||||
|
|
||||||
void printRSD(RSDPTR* rsd);
|
void printRSD(RSDPTR* rsd);
|
||||||
|
@ -155,7 +155,7 @@ inline void init_IDE( uint32_t BAR0, uint32_t BAR1,uint32_t BAR2, uint32_t BAR3,
|
|||||||
|
|
||||||
|
|
||||||
// 3- Detect ATA-ATAPI Devices:
|
// 3- Detect ATA-ATAPI Devices:
|
||||||
void DetectDevices(){
|
inline void DetectDevices(){
|
||||||
int i, j, k, count = 0;
|
int i, j, k, count = 0;
|
||||||
|
|
||||||
for (i = 0; i < 2; i++)
|
for (i = 0; i < 2; i++)
|
||||||
@ -228,7 +228,7 @@ void DetectDevices(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Detect_IO_Ports(uint32_t BAR0, uint32_t BAR1,uint32_t BAR2, uint32_t BAR3, uint32_t BAR4){
|
inline void Detect_IO_Ports(uint32_t BAR0, uint32_t BAR1,uint32_t BAR2, uint32_t BAR3, uint32_t BAR4){
|
||||||
// 1 Detect I/O Ports which interface an IDE Controller
|
// 1 Detect I/O Ports which interface an IDE Controller
|
||||||
|
|
||||||
// Based on the implementation within serenity
|
// Based on the implementation within serenity
|
||||||
|
@ -185,7 +185,11 @@ void PrintPCIDeviceInfo (PCIBusAddress& PCIDeviceAddress)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PCI_Enumerate(){
|
void PCI_Enumerate(){
|
||||||
int devicesFound = 0;
|
|
||||||
|
|
||||||
|
int devicesFound = 0;
|
||||||
|
|
||||||
|
printf("Start finding devices, Found: %d devices");
|
||||||
// loop through all possible busses, devices and their functions;
|
// loop through all possible busses, devices and their functions;
|
||||||
for( int bus = 0 ; bus < 256 ; bus++)
|
for( int bus = 0 ; bus < 256 ; bus++)
|
||||||
{
|
{
|
||||||
|
@ -10,8 +10,6 @@
|
|||||||
|
|
||||||
extern const char* ClassCodeTable [0x13];
|
extern const char* ClassCodeTable [0x13];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Note: this could be used to make the api for receiving PCI class codes a bit
|
// Note: this could be used to make the api for receiving PCI class codes a bit
|
||||||
// nicer.
|
// nicer.
|
||||||
struct ClassCodes {
|
struct ClassCodes {
|
||||||
|
@ -1,19 +0,0 @@
|
|||||||
.global LoadGlobalDescriptorTable
|
|
||||||
|
|
||||||
LoadGlobalDescriptorTable:
|
|
||||||
lgdt gdtDescriptor
|
|
||||||
|
|
||||||
movw $16, %ax
|
|
||||||
movw %ax, %ds
|
|
||||||
movw %ax, %es
|
|
||||||
movw %ax, %fs
|
|
||||||
movw %ax, %gs
|
|
||||||
movw %ax, %ss
|
|
||||||
|
|
||||||
jmp $8,$flush
|
|
||||||
|
|
||||||
flush:
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
|||||||
#include "gdtc.h"
|
|
||||||
#include "../terminal/kterm.h"
|
|
||||||
|
|
||||||
#define NULL_SEGMENT 0
|
|
||||||
#define KERNEL_CODE_SEGMENT 1
|
|
||||||
#define KERNEL_DATA_SEGMENT 2
|
|
||||||
#define USER_CODE_SEGMENT 3
|
|
||||||
#define USER_DATA_SEGMENT 4
|
|
||||||
|
|
||||||
SegmentDescriptor GlobalDescriptorTable[5];
|
|
||||||
GlobalDescriptorTableDescriptor gdtDescriptor;
|
|
||||||
|
|
||||||
void add_descriptor(int which , unsigned long base, unsigned long limit, unsigned char access, unsigned char granularity ){
|
|
||||||
GlobalDescriptorTable[which].base_low = (base & 0xFFFF );
|
|
||||||
GlobalDescriptorTable[which].base_middle = (base >> 6) & 0xFF;
|
|
||||||
GlobalDescriptorTable[which].base_high = (base >> 24) & 0xFF;
|
|
||||||
|
|
||||||
GlobalDescriptorTable[which].limit_low = (limit & 0xFFFF);
|
|
||||||
GlobalDescriptorTable[which].granularity = ((limit >> 16) & 0x0F);
|
|
||||||
|
|
||||||
GlobalDescriptorTable[which].granularity |= (granularity & 0xF0);
|
|
||||||
GlobalDescriptorTable[which].access = access;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void initGDT(){
|
|
||||||
|
|
||||||
#ifdef __VERBOSE__
|
|
||||||
printf("Init GDT!\n");
|
|
||||||
#endif
|
|
||||||
// NULL segment
|
|
||||||
add_descriptor(NULL_SEGMENT, 0,0,0,0);
|
|
||||||
|
|
||||||
// Kernel Code Segment
|
|
||||||
add_descriptor(KERNEL_CODE_SEGMENT, 0, 0xFFFFFFFF, 0x9A, 0xCF);
|
|
||||||
|
|
||||||
// Kernel Data Segment
|
|
||||||
add_descriptor(KERNEL_DATA_SEGMENT, 0, 0xFFFFFFFF, 0x92, 0xCF);
|
|
||||||
|
|
||||||
// User Code Segment
|
|
||||||
// TODO:
|
|
||||||
|
|
||||||
// User Data Segement
|
|
||||||
// TODO:
|
|
||||||
|
|
||||||
// init Gdt Descriptor
|
|
||||||
gdtDescriptor.limit = ((sizeof(SegmentDescriptor ) * 5 ) - 1);
|
|
||||||
gdtDescriptor.base = (unsigned int) &GlobalDescriptorTable;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
LoadGlobalDescriptorTable();
|
|
||||||
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
|
|
||||||
struct SegmentDescriptor {
|
|
||||||
unsigned short limit_low;
|
|
||||||
unsigned short base_low;
|
|
||||||
unsigned char base_middle;
|
|
||||||
unsigned char access;
|
|
||||||
unsigned char granularity;
|
|
||||||
unsigned char base_high;
|
|
||||||
}__attribute__((packed));
|
|
||||||
|
|
||||||
|
|
||||||
struct GlobalDescriptorTableDescriptor{
|
|
||||||
unsigned short limit;
|
|
||||||
unsigned int base;
|
|
||||||
}__attribute__((packed));
|
|
||||||
|
|
||||||
extern SegmentDescriptor GlobalDescriptorTable[];
|
|
||||||
extern GlobalDescriptorTableDescriptor gdtDescriptor;
|
|
||||||
|
|
||||||
|
|
||||||
void add_descriptor(int which , unsigned long base, unsigned long limit, unsigned char access, unsigned char granularity );
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" void LoadGlobalDescriptorTable();
|
|
||||||
void initGDT();
|
|
@ -2,8 +2,7 @@
|
|||||||
#include "../../drivers/pit/pit.h"
|
#include "../../drivers/pit/pit.h"
|
||||||
#include "../../drivers/ps-2/keyboard.h"
|
#include "../../drivers/ps-2/keyboard.h"
|
||||||
#include "../../cpu.h"
|
#include "../../cpu.h"
|
||||||
#include "../../drivers/ps-2/keyboard.h"
|
#include "../../memory/VirtualMemoryManager.h"
|
||||||
|
|
||||||
IDT_entry idt_table[256];
|
IDT_entry idt_table[256];
|
||||||
IDT_ptr idt_ptr;
|
IDT_ptr idt_ptr;
|
||||||
|
|
||||||
@ -17,25 +16,25 @@ void set_id_entry (uint8_t num , uint32_t base, uint16_t sel, uint8_t flags){
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void irs_handler (registers regs) {
|
void irs_handler (registers* regs) {
|
||||||
uint32_t FaultingAddress;
|
uint32_t FaultingAddress;
|
||||||
//printf("(IRS) Interrupt number: %d \r", regs.int_no);
|
//printf("(IRS) Interrupt number: %d \r", regs.int_no);
|
||||||
switch (regs.int_no)
|
switch (regs->int_no)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
// Divide Error #DE
|
// Divide Error #DE
|
||||||
printf("#DE\n");
|
printf("#DE\n");
|
||||||
printf("EIP: 0x%x\n", regs.eip);
|
printf("EIP: 0x%x\n", regs->eip);
|
||||||
printf("EAX: 0x%x\n", regs.eax);
|
printf("EAX: 0x%x\n", regs->eax);
|
||||||
printf("EBP: 0x%x\n", regs.ebp);
|
printf("EBP: 0x%x\n", regs->ebp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
// Debug Exception #DB
|
// Debug Exception #DB
|
||||||
printf("#DB\n");
|
printf("#DB\n");
|
||||||
printf("EIP: 0x%x\n", regs.eip);
|
printf("EIP: 0x%x\n", regs->eip);
|
||||||
printf("EAX: 0x%x\n", regs.eax);
|
printf("EAX: 0x%x\n", regs->eax);
|
||||||
printf("EBP: 0x%x\n", regs.ebp);
|
printf("EBP: 0x%x\n", regs->ebp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
@ -46,49 +45,50 @@ void irs_handler (registers regs) {
|
|||||||
case 3:
|
case 3:
|
||||||
// Breakpoint Exception #BP
|
// Breakpoint Exception #BP
|
||||||
printf("#BP\n");
|
printf("#BP\n");
|
||||||
printf("EIP: 0x%x\n", regs.eip);
|
printf("EIP: 0x%x\n", regs->eip);
|
||||||
printf("EAX: 0x%x\n", regs.eax);
|
printf("EAX: 0x%x\n", regs->eax);
|
||||||
printf("EBP: 0x%x\n", regs.ebp);
|
printf("EBP: 0x%x\n", regs->ebp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
// Overflow Exception #OF
|
// Overflow Exception #OF
|
||||||
printf("#OF\n");
|
printf("#OF\n");
|
||||||
printf("EIP: 0x%x\n", regs.eip);
|
printf("EIP: 0x%x\n", regs->eip);
|
||||||
printf("EAX: 0x%x\n", regs.eax);
|
printf("EAX: 0x%x\n", regs->eax);
|
||||||
printf("EBP: 0x%x\n", regs.ebp);
|
printf("EBP: 0x%x\n", regs->ebp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
// BOUND Range Exceeded Exception #BR
|
// BOUND Range Exceeded Exception #BR
|
||||||
printf("#BR\n");
|
printf("#BR\n");
|
||||||
printf("EIP: 0x%x\n", regs.eip);
|
printf("EIP: 0x%x\n", regs->eip);
|
||||||
printf("EAX: 0x%x\n", regs.eax);
|
printf("EAX: 0x%x\n", regs->eax);
|
||||||
printf("EBP: 0x%x\n", regs.ebp);
|
printf("EBP: 0x%x\n", regs->ebp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 6:
|
case 6:
|
||||||
// Invalid OpCode Exception #UD
|
// Invalid OpCode Exception #UD
|
||||||
printf("#UD\n");
|
printf("#UD\n");
|
||||||
printf("EIP: 0x%x\n", regs.eip);
|
printf("EIP: 0x%x\n", regs->eip);
|
||||||
printf("EAX: 0x%x\n", regs.eax);
|
printf("EAX: 0x%x\n", regs->eax);
|
||||||
printf("EBP: 0x%x\n", regs.ebp);
|
printf("EBP: 0x%x\n", regs->ebp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 7:
|
case 7:
|
||||||
// Device Not Available Exception #NM
|
// Device Not Available Exception #NM
|
||||||
printf("#NM\n");
|
printf("#NM\n");
|
||||||
printf("EIP: 0x%x\n", regs.eip);
|
printf("EIP: 0x%x\n", regs->eip);
|
||||||
printf("EAX: 0x%x\n", regs.eax);
|
printf("EAX: 0x%x\n", regs->eax);
|
||||||
printf("EBP: 0x%x\n", regs.ebp);
|
printf("EBP: 0x%x\n", regs->ebp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 8:
|
case 8:
|
||||||
// Double Fault Exception #DF
|
// Double Fault Exception #DF
|
||||||
printf("#DF\n");
|
printf("#DF\n");
|
||||||
printf("EIP: 0x%x\n", regs.eip);
|
printf("EIP: 0x%x\n", regs->eip);
|
||||||
printf("EAX: 0x%x\n", regs.eax);
|
printf("EAX: 0x%x\n", regs->eax);
|
||||||
printf("EBP: 0x%x\n", regs.ebp);
|
printf("EBP: 0x%x\n", regs->ebp);
|
||||||
|
while(true);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 9:
|
case 9:
|
||||||
@ -99,64 +99,74 @@ void irs_handler (registers regs) {
|
|||||||
case 10:
|
case 10:
|
||||||
// Invalid TSS Exception #TS
|
// Invalid TSS Exception #TS
|
||||||
printf("#TS\n");
|
printf("#TS\n");
|
||||||
printf("EIP: 0x%x\n", regs.eip);
|
printf("EIP: 0x%x\n", regs->eip);
|
||||||
printf("EAX: 0x%x\n", regs.eax);
|
printf("EAX: 0x%x\n", regs->eax);
|
||||||
printf("EBP: 0x%x\n", regs.ebp);
|
printf("EBP: 0x%x\n", regs->ebp);
|
||||||
|
__asm__("cli;" "1: hlt;" "jmp 1b;");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 11:
|
case 11:
|
||||||
// Segment Not Present #NP
|
// Segment Not Present #NP
|
||||||
printf("#NP\n");
|
printf("#NP\n");
|
||||||
printf("EIP: 0x%x\n", regs.eip);
|
printf("EIP: 0x%x\n", regs->eip);
|
||||||
printf("EAX: 0x%x\n", regs.eax);
|
printf("EAX: 0x%x\n", regs->eax);
|
||||||
printf("EBP: 0x%x\n", regs.ebp);
|
printf("EBP: 0x%x\n", regs->ebp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 12:
|
case 12:
|
||||||
// Stack Fault Exception #SS
|
// Stack Fault Exception #SS
|
||||||
printf("#SS\n");
|
printf("#SS\n");
|
||||||
printf("EIP: 0x%x\n", regs.eip);
|
printf("EIP: 0x%x\n", regs->eip);
|
||||||
printf("EAX: 0x%x\n", regs.eax);
|
printf("EAX: 0x%x\n", regs->eax);
|
||||||
printf("EBP: 0x%x\n", regs.ebp);
|
printf("EBP: 0x%x\n", regs->ebp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 13:
|
case 13:{
|
||||||
// General Protection Exception #GP
|
// General Protection Exception #GP
|
||||||
printf("#GP\n");
|
printf("#GP\n");
|
||||||
|
|
||||||
printf("Accessing memory caused a general protectuion exception.\n");
|
printf("Accessing memory caused a general protection exception.\n");
|
||||||
|
printf("Faulting instruction at addres: 0x%x\n", regs->eip );
|
||||||
printf("Fault due to entry at index: %d", (regs.err_code >> 3 & 0xFFF ) );
|
printf("Error code: 0x%x\n", regs->err_code);
|
||||||
|
|
||||||
if(regs.err_code & 0x3 >> 1 == 0 ){
|
if (regs->err_code != 0){
|
||||||
printf("* Index references GDT");
|
printf("Fault due to entry at index: 0x%x (%d)\n", (regs->err_code >> 3 & 0xFFF ) , regs->err_code);
|
||||||
}
|
|
||||||
if(regs.err_code & 0x3 >> 1 == 1 ){
|
|
||||||
printf("* Index references IDT");
|
|
||||||
}
|
|
||||||
|
|
||||||
if(regs.err_code & 0x3 >> 1 == 2 ){
|
|
||||||
printf("* Index references LDT");
|
|
||||||
}
|
|
||||||
|
|
||||||
if(regs.err_code & 0x3 >> 1 == 4 ){
|
uint8_t table = regs->err_code >> 1 & 0x3 ;
|
||||||
printf("* Index references IDT");
|
|
||||||
}
|
if(table == 0 ){
|
||||||
|
printf("* Index references GDT\n");
|
||||||
|
}
|
||||||
|
if(table == 1 ){
|
||||||
|
printf("* Index references IDT\n");
|
||||||
|
}
|
||||||
|
|
||||||
if( regs.err_code & 0x1)
|
if(table == 2 ){
|
||||||
{
|
printf("* Index references LDT\n");
|
||||||
printf("* Originated externally!");
|
}
|
||||||
|
|
||||||
|
if(table == 3 ){
|
||||||
|
printf("* Index references IDT\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if( regs->err_code & 0x1)
|
||||||
|
{
|
||||||
|
printf("* Originated externally!\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
__asm__("cli;" "1: hlt;" "jmp 1b;");
|
__asm__("cli;" "1: hlt;" "jmp 1b;");
|
||||||
|
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 14:
|
case 14:
|
||||||
// Page Fault Exception #PF
|
// Page Fault Exception #PF
|
||||||
printf("#PF\n");
|
printf("#PF\n");
|
||||||
|
#define ALIGN(addr, align) (((addr) & ~((align) - 1)) + (align))
|
||||||
FaultingAddress = GetCR2();
|
FaultingAddress = GetCR2();
|
||||||
|
|
||||||
printf("Accessing the linear address 0x%x resulted in a page fault!\n\n", FaultingAddress);
|
printf("Accessing the linear address 0x%x resulted in a page fault!\n\n", FaultingAddress);
|
||||||
|
|
||||||
// Error code of 32 bits are on the stack
|
// Error code of 32 bits are on the stack
|
||||||
@ -174,89 +184,86 @@ void irs_handler (registers regs) {
|
|||||||
printf("REASON: \n\n");
|
printf("REASON: \n\n");
|
||||||
|
|
||||||
|
|
||||||
if (regs.err_code & PF_ERR_PRESENT_BIT ){
|
if (regs->err_code & PF_ERR_PRESENT_BIT ){
|
||||||
printf("* Page protection violation!\n");
|
printf("* Page protection violation!\n");
|
||||||
} else{
|
} else{
|
||||||
printf("* Page not-present!\n");
|
printf("* Page not-present!\n");
|
||||||
|
Immediate_Map(FaultingAddress, FaultingAddress - 0xC0000000);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(regs.err_code & PF_ERR_WRITE_BIT){
|
if(regs->err_code & PF_ERR_WRITE_BIT){
|
||||||
printf("* Write access violation!\n");
|
printf("* Write access violation!\n");
|
||||||
} else{
|
} else{
|
||||||
printf("* Read access violation!\n");
|
printf("* Read access violation!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(regs.err_code & PF_ERR_USER_BIT){
|
if(regs->err_code & PF_ERR_USER_BIT){
|
||||||
printf("* Violation from user-space (CPL=3)\n");
|
printf("* Violation from user-space (CPL=3)\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(regs.err_code & PF_ERR_INSTRUCTION_FETCH_BIT){
|
if(regs->err_code & PF_ERR_INSTRUCTION_FETCH_BIT){
|
||||||
printf("* Caused by an instruction fetch. \n");
|
printf("* Caused by an instruction fetch. \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
Check the error code to figure out what happened here
|
|
||||||
*/
|
|
||||||
__asm__("cli;" "1: hlt;" "jmp 1b;");
|
__asm__("cli;" "1: hlt;" "jmp 1b;");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 16:
|
case 16:
|
||||||
// x87 FPU Floating-point Error #MF
|
// x87 FPU Floating-point Error #MF
|
||||||
printf("#MF\n");
|
printf("#MF\n");
|
||||||
printf("EIP: 0x%x\n", regs.eip);
|
printf("EIP: 0x%x\n", regs->eip);
|
||||||
printf("EAX: 0x%x\n", regs.eax);
|
printf("EAX: 0x%x\n", regs->eax);
|
||||||
printf("EBP: 0x%x\n", regs.ebp);
|
printf("EBP: 0x%x\n", regs->ebp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 17:
|
case 17:
|
||||||
// Alignment Check Exception #AC
|
// Alignment Check Exception #AC
|
||||||
printf("#AC\n");
|
printf("#AC\n");
|
||||||
printf("EIP: 0x%x\n", regs.eip);
|
printf("EIP: 0x%x\n", regs->eip);
|
||||||
printf("EAX: 0x%x\n", regs.eax);
|
printf("EAX: 0x%x\n", regs->eax);
|
||||||
printf("EBP: 0x%x\n", regs.ebp);
|
printf("EBP: 0x%x\n", regs->ebp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 18:
|
case 18:
|
||||||
// Machine-Check Exception #MC
|
// Machine-Check Exception #MC
|
||||||
printf("#MC\n");
|
printf("#MC\n");
|
||||||
printf("EIP: 0x%x\n", regs.eip);
|
printf("EIP: 0x%x\n", regs->eip);
|
||||||
printf("EAX: 0x%x\n", regs.eax);
|
printf("EAX: 0x%x\n", regs->eax);
|
||||||
printf("EBP: 0x%x\n", regs.ebp);
|
printf("EBP: 0x%x\n", regs->ebp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 19:
|
case 19:
|
||||||
// SIMD Floating-point Exception #XM
|
// SIMD Floating-point Exception #XM
|
||||||
printf("#XM\n");
|
printf("#XM\n");
|
||||||
printf("EIP: 0x%x\n", regs.eip);
|
printf("EIP: 0x%x\n", regs->eip);
|
||||||
printf("EAX: 0x%x\n", regs.eax);
|
printf("EAX: 0x%x\n", regs->eax);
|
||||||
printf("EBP: 0x%x\n", regs.ebp);
|
printf("EBP: 0x%x\n", regs->ebp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 20:
|
case 20:
|
||||||
// Virtualization Exception #VE
|
// Virtualization Exception #VE
|
||||||
printf("#VE\n");
|
printf("#VE\n");
|
||||||
printf("EIP: 0x%x\n", regs.eip);
|
printf("EIP: 0x%x\n", regs->eip);
|
||||||
printf("EAX: 0x%x\n", regs.eax);
|
printf("EAX: 0x%x\n", regs->eax);
|
||||||
printf("EBP: 0x%x\n", regs.ebp);
|
printf("EBP: 0x%x\n", regs->ebp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 21:
|
case 21:
|
||||||
// Control Protection Exception #CP
|
// Control Protection Exception #CP
|
||||||
printf("#CP\n");
|
printf("#CP\n");
|
||||||
printf("EIP: 0x%x\n", regs.eip);
|
printf("EIP: 0x%x\n", regs->eip);
|
||||||
printf("EAX: 0x%x\n", regs.eax);
|
printf("EAX: 0x%x\n", regs->eax);
|
||||||
printf("EBP: 0x%x\n", regs.ebp);
|
printf("EBP: 0x%x\n", regs->ebp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// PANIC!!!
|
// PANIC!!!
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,7 @@ extern "C" {
|
|||||||
|
|
||||||
void irq_handler (registers regs);
|
void irq_handler (registers regs);
|
||||||
|
|
||||||
void irs_handler (registers regs);
|
void irs_handler (registers* regs);
|
||||||
|
|
||||||
extern void irs0 ();
|
extern void irs0 ();
|
||||||
extern void irs1 ();
|
extern void irs1 ();
|
||||||
|
@ -1,234 +1,63 @@
|
|||||||
|
.code32
|
||||||
/*
|
/*
|
||||||
* Interupt handlers
|
* Interupt handlers
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl irs0
|
.macro ISR_NOERRORCODE NAME, VECTOR
|
||||||
irs0:
|
.globl irs\NAME
|
||||||
cli
|
irs\NAME:
|
||||||
push $0
|
cli
|
||||||
push $0
|
push $0
|
||||||
jmp irs_common
|
push \VECTOR
|
||||||
|
jmp irs_common
|
||||||
|
.endm
|
||||||
|
|
||||||
.globl irs1
|
.macro ISR_ERROCODE NAME, VECTOR
|
||||||
irs1:
|
.globl irs\NAME
|
||||||
cli
|
irs\NAME:
|
||||||
push $0
|
cli
|
||||||
push $1
|
push \VECTOR
|
||||||
jmp irs_common
|
jmp irs_common
|
||||||
|
.endm
|
||||||
|
|
||||||
.globl irs2
|
|
||||||
irs2:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $2
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs3
|
ISR_NOERRORCODE 0 $0
|
||||||
irs3:
|
ISR_NOERRORCODE 1 $1
|
||||||
cli
|
ISR_NOERRORCODE 2 $2
|
||||||
push $0
|
ISR_NOERRORCODE 3 $3
|
||||||
push $3
|
ISR_NOERRORCODE 4 $4
|
||||||
jmp irs_common
|
ISR_NOERRORCODE 5 $5
|
||||||
|
ISR_NOERRORCODE 6 $6
|
||||||
|
ISR_NOERRORCODE 7 $7
|
||||||
|
ISR_NOERRORCODE 8 $8
|
||||||
|
ISR_NOERRORCODE 9 $9
|
||||||
|
ISR_NOERRORCODE 10 $10
|
||||||
|
ISR_NOERRORCODE 11 $11
|
||||||
|
ISR_NOERRORCODE 12 $12
|
||||||
|
ISR_NOERRORCODE 13 $13
|
||||||
|
ISR_NOERRORCODE 14 $14
|
||||||
|
ISR_NOERRORCODE 15 $15
|
||||||
|
ISR_NOERRORCODE 16 $16
|
||||||
|
ISR_NOERRORCODE 17 $17
|
||||||
|
ISR_NOERRORCODE 18 $18
|
||||||
|
ISR_NOERRORCODE 19 $19
|
||||||
|
ISR_NOERRORCODE 20 $20
|
||||||
|
ISR_NOERRORCODE 21 $21
|
||||||
|
ISR_NOERRORCODE 22 $22
|
||||||
|
ISR_NOERRORCODE 23 $23
|
||||||
|
ISR_NOERRORCODE 24 $24
|
||||||
|
ISR_NOERRORCODE 25 $25
|
||||||
|
ISR_NOERRORCODE 26 $26
|
||||||
|
ISR_NOERRORCODE 27 $27
|
||||||
|
ISR_NOERRORCODE 28 $28
|
||||||
|
ISR_NOERRORCODE 29 $29
|
||||||
|
ISR_NOERRORCODE 30 $30
|
||||||
|
ISR_NOERRORCODE 31 $31
|
||||||
|
|
||||||
.globl irs4
|
|
||||||
irs4:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $4
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs5
|
|
||||||
irs5:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $5
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs6
|
|
||||||
irs6:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $6
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs7
|
|
||||||
irs7:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $7
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs8
|
|
||||||
irs8:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $8
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs9
|
|
||||||
irs9:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $9
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs10
|
|
||||||
irs10:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $10
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs11
|
|
||||||
irs11:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $11
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs12
|
|
||||||
irs12:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $12
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs13
|
|
||||||
irs13:
|
|
||||||
cli
|
|
||||||
push $13
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs14
|
|
||||||
irs14:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $14
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs15
|
|
||||||
irs15:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $15
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs16
|
|
||||||
irs16:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $16
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs17
|
|
||||||
irs17:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $17
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs18
|
|
||||||
irs18:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $18
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs19
|
|
||||||
irs19:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $19
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs20
|
|
||||||
irs20:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $20
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs21
|
|
||||||
irs21:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $21
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs22
|
|
||||||
irs22:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $22
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs23
|
|
||||||
irs23:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $23
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs24
|
|
||||||
irs24:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $24
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs25
|
|
||||||
irs25:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $25
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs26
|
|
||||||
irs26:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $26
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs27
|
|
||||||
irs27:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $27
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs28
|
|
||||||
irs28:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $28
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs29
|
|
||||||
irs29:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $29
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs30
|
|
||||||
irs30:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $30
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
.globl irs31
|
|
||||||
irs31:
|
|
||||||
cli
|
|
||||||
push $0
|
|
||||||
push $31
|
|
||||||
jmp irs_common
|
|
||||||
|
|
||||||
irs_common:
|
irs_common:
|
||||||
pusha # Pushes edi,esi,ebp,esp,ebx,edx,ecx,eax
|
pusha # Pushes edi,esi,ebp,esp,ebx,edx,ecx,eax
|
||||||
|
|
||||||
|
|
||||||
mov %ds, %ax
|
mov %ds, %ax
|
||||||
push %eax
|
push %eax
|
||||||
|
|
||||||
@ -239,17 +68,20 @@ irs_common:
|
|||||||
mov %ax, %es
|
mov %ax, %es
|
||||||
mov %ax, %fs
|
mov %ax, %fs
|
||||||
mov %ax, %gs
|
mov %ax, %gs
|
||||||
|
|
||||||
|
mov %esp, %eax
|
||||||
|
push %eax
|
||||||
|
|
||||||
call irs_handler
|
call irs_handler
|
||||||
|
|
||||||
pop %eax
|
pop %eax
|
||||||
|
pop %ebx // reload ther orignal data segment descriptor
|
||||||
mov %ax, %ds
|
mov %bx, %ds
|
||||||
mov %ax, %es
|
mov %bx, %es
|
||||||
mov %ax, %fs
|
mov %bx, %fs
|
||||||
mov %ax, %gs
|
mov %bx, %gs
|
||||||
|
|
||||||
popa
|
popa
|
||||||
add $8, %esp # cleans push error and irs code
|
add $12, %esp # cleans push error and irs code
|
||||||
sti
|
|
||||||
iret # pops 5 things at once: CS, EIP, EFLAGS, SS, and ESP
|
iret # pops 5 things at once: CS, EIP, EFLAGS, SS, and ESP
|
||||||
|
@ -1,37 +1,46 @@
|
|||||||
extern "C"{
|
|
||||||
#include "../lib/include/string.h"
|
extern "C"
|
||||||
|
{
|
||||||
|
#include "../lib/include/string.h"
|
||||||
}
|
}
|
||||||
#include "definitions.h"
|
|
||||||
|
|
||||||
#include "prekernel/bootstructure.h"
|
#include "prekernel/bootstructure.h"
|
||||||
|
|
||||||
#include "drivers/vga/VBE.h"
|
#include "memory/memory.h"
|
||||||
#include "drivers/pit/pit.h"
|
#include "memory/memoryinfo.h"
|
||||||
|
|
||||||
#include "memory/memory.h"
|
#include "memory/memory.h"
|
||||||
#include "memory/VirtualMemoryManager.h"
|
#include "memory/VirtualMemoryManager.h"
|
||||||
#include "memory/KernelHeap.h"
|
#include "memory/KernelHeap.h"
|
||||||
#include "memory/gdt/gdtc.h"
|
#include "memory/gdt/gdtc.h"
|
||||||
|
|
||||||
#include "drivers/acpi/rsdp.h"
|
#include "supervisorterminal/superVisorTerminal.h"
|
||||||
#include "drivers/ide/ide.h"
|
|
||||||
#include "drivers/ata/ataDevice.h"
|
|
||||||
#include "PartitionTable/MBR/MasterBootRecord.h"
|
|
||||||
#include "interrupts/idt/idt.h"
|
|
||||||
#include "filesystem/FAT/BiosParameterBlock.h"
|
|
||||||
#include "filesystem/FAT/DirectoryEntry.h"
|
|
||||||
#include "drivers/io/io.h"
|
#include "drivers/io/io.h"
|
||||||
|
#include "drivers/vga/VBE.h"
|
||||||
#include "drivers/pci/pci.h"
|
#include "drivers/pci/pci.h"
|
||||||
#include "cpu.h"
|
#include "drivers/pit/pit.h"
|
||||||
#include "serial.h"
|
|
||||||
#include "time.h"
|
|
||||||
|
|
||||||
#include "terminal/kterm.h"
|
#include "terminal/kterm.h"
|
||||||
|
|
||||||
#include "supervisorterminal/superVisorTerminal.h"
|
#include "prekernel/multiboot.h"
|
||||||
|
#include "bootinfo.h"
|
||||||
|
|
||||||
extern "C" void kernel_main ();
|
#include "bootcheck.h"
|
||||||
void ProcessBootInfo();
|
|
||||||
|
#include "interrupts/idt/idt.h"
|
||||||
|
#include "time.h"
|
||||||
|
#include "cpu.h"
|
||||||
|
#include "serial.h"
|
||||||
|
#include "time.h"
|
||||||
|
#include "definitions.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright © Nigel Barink 2023
|
||||||
|
*/
|
||||||
|
|
||||||
extern "C" void kernel_main ()
|
extern "C" void kernel_main ()
|
||||||
{
|
{
|
||||||
@ -40,152 +49,6 @@ extern "C" void kernel_main ()
|
|||||||
*/
|
*/
|
||||||
printf("|=== BarinkOS ===|\n");
|
printf("|=== BarinkOS ===|\n");
|
||||||
startSuperVisorTerminal();
|
startSuperVisorTerminal();
|
||||||
|
|
||||||
RSDPTR* rsd = FindRSD();
|
|
||||||
RSDT* rsd_table = getRSDT(rsd);
|
|
||||||
|
|
||||||
|
|
||||||
// Enumerate the PCI bus
|
|
||||||
PCI_Enumerate();
|
|
||||||
TestIDEController();
|
|
||||||
|
|
||||||
int devNumber = 0 ;
|
|
||||||
for ( auto device : ide_devices){
|
|
||||||
if (!device.Reserved)
|
|
||||||
continue;
|
|
||||||
printf("Device %d\n" , devNumber);
|
|
||||||
printf (" Device on Channel: (0x%x) %s\n" ,device.Channel, device.Channel == 0 ? "Primary" : "Secondary");
|
|
||||||
printf (" Device drive:(0x%x) %s\n" , device.Drive, device.Drive? "Slave" : "Master");
|
|
||||||
printf (" Device Type:(0x%x) %s\n" , device.Type, device.Type ? "ATAPI" : "ATA");
|
|
||||||
devNumber ++;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
enum BUS_PORT {
|
|
||||||
Primary= 0x1f0,
|
|
||||||
Secondary = 0x170
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ATA_DEVICE::Identify((uint16_t) BUS_PORT::Primary, DEVICE_DRIVE::MASTER);
|
|
||||||
|
|
||||||
const int C = 0;
|
|
||||||
const int H = 0;
|
|
||||||
const int HPC = 16;
|
|
||||||
const int SPT = 63;
|
|
||||||
|
|
||||||
int S = 1;
|
|
||||||
uint32_t LBA = (C*HPC+H) * SPT + (S-1);
|
|
||||||
printf("LBA: %d\n" , LBA);
|
|
||||||
uint16_t buffer [256];
|
|
||||||
|
|
||||||
|
|
||||||
ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, LBA, buffer);
|
|
||||||
|
|
||||||
MBR* mbr = (MBR*) buffer;
|
|
||||||
|
|
||||||
printf("BootSector: 0x%x\n", mbr->ValidBootsector );
|
|
||||||
for( int i = 0 ; i < 4 ; i ++){
|
|
||||||
PartitionTableEntry PT = mbr->TableEntries[i];
|
|
||||||
|
|
||||||
printf("Partition %d [ %d sectors, PartitionType: %x, 0x%x, \nLBA Start: 0x%x ]\n" ,
|
|
||||||
i, PT.Number_sectors_inPartition, PT.PartitionType, mbr->uniqueID, PT.LBA_partition_start );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find the BiosParameter block
|
|
||||||
uint16_t biosparameterblock[256];
|
|
||||||
ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, mbr->TableEntries[0].LBA_partition_start, biosparameterblock);
|
|
||||||
|
|
||||||
BiosParameterBlock* bpb = (BiosParameterBlock*) biosparameterblock;
|
|
||||||
|
|
||||||
|
|
||||||
printf("\nBPB: Bytes per Sector %d\n", bpb->BytesPerSector );
|
|
||||||
printf("OEM ID: %s\n", bpb->OEM_id);
|
|
||||||
printf("Bytes per sector: %d\n", bpb->BytesPerSector);
|
|
||||||
printf("Sectors per cluster: %d\n", bpb->SectorsPerCluster);
|
|
||||||
printf("Reserved sectors: %d\n", bpb->ReservedSectors);
|
|
||||||
printf("Number of FAT: %d\n", bpb->NumberOfFileAllocationTables);
|
|
||||||
printf("Number of Dir entries: %d\n", bpb->NumberOfDirectoryEntries);
|
|
||||||
printf("Total Sectors in volume: %d\n", bpb->TotalSectorsInLogicalVolume);
|
|
||||||
printf("Sectors per FAT: %d\n", bpb->NumberOfSectorsPerFAT);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief File Allocation Table
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t FATAddress = mbr->TableEntries[0].LBA_partition_start + bpb->ReservedSectors ;
|
|
||||||
uint16_t FAT[256];
|
|
||||||
ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, FATAddress, FAT );
|
|
||||||
|
|
||||||
// Show data in terminal
|
|
||||||
for(int i = 0; i < 256; i++ ) {
|
|
||||||
printf("%x ", FAT[i]);
|
|
||||||
}
|
|
||||||
kterm_put('\n');
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t RootDirectoryRegion = FATAddress + ( bpb->NumberOfFileAllocationTables * bpb->NumberOfSectorsPerFAT );
|
|
||||||
uint32_t DataRegion = RootDirectoryRegion + ((bpb->NumberOfDirectoryEntries * 32) / bpb->BytesPerSector );
|
|
||||||
|
|
||||||
uint16_t data2 [256];
|
|
||||||
ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, RootDirectoryRegion, data2 );
|
|
||||||
DirectoryEntry* RootDirectory = (DirectoryEntry*) data2;
|
|
||||||
// List files in root
|
|
||||||
for(int i= 0; i < bpb->NumberOfDirectoryEntries ; i++ )
|
|
||||||
{
|
|
||||||
DirectoryEntry* entry = (DirectoryEntry*)((uint32_t) RootDirectory + (i * sizeof(DirectoryEntry)));
|
|
||||||
|
|
||||||
if( entry->filename[0] == (uint8_t) 0x00 )
|
|
||||||
break; // There are no more entries in this directory or the entry is free
|
|
||||||
|
|
||||||
if( entry->attribute & 0x01 == 0x01 || entry->attribute & 0x20 == 0x20)
|
|
||||||
continue; // Skip listing if hidden or Achieve flag is set
|
|
||||||
|
|
||||||
// Print the filename;
|
|
||||||
for( int n = 0; n < 8; n++ ){
|
|
||||||
if(entry->filename[n] == 0x20)
|
|
||||||
break;
|
|
||||||
kterm_put(entry->filename[n]);
|
|
||||||
}kterm_put('\n');
|
|
||||||
|
|
||||||
for( int n = 0; n < 3; n++){
|
|
||||||
kterm_put(entry->Extension[n]);
|
|
||||||
}kterm_put('\n');
|
|
||||||
|
|
||||||
printf("Attribute: %x \n" , entry->attribute);
|
|
||||||
printf("FileSize: %d Bytes\n", entry->FilesizeInBytes);
|
|
||||||
|
|
||||||
if( entry->FilesizeInBytes != 0x0 || entry->attribute & 0x8 == 0x0){
|
|
||||||
printf("Show contents");
|
|
||||||
|
|
||||||
printf( "Start cluster of the file: 0x%x\n" , entry->StartingCluster);
|
|
||||||
|
|
||||||
printf("IS it only 1 cluster? %s\n" , FAT[i] == 0xFFFF? "Yes": "No" );
|
|
||||||
|
|
||||||
uint32_t sector = DataRegion + ((entry->StartingCluster - 0x02 ) * bpb->SectorsPerCluster);
|
|
||||||
|
|
||||||
|
|
||||||
uint16_t dataBlob [256];
|
|
||||||
ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, sector, dataBlob );
|
|
||||||
for( int n = 0; n < 256; n++)
|
|
||||||
{
|
|
||||||
kterm_put(dataBlob[n] & 0x00ff);
|
|
||||||
|
|
||||||
kterm_put(dataBlob[n] >> 8);
|
|
||||||
}kterm_put('\n');
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("======================\n");
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -198,38 +61,26 @@ extern "C" void early_main()
|
|||||||
|
|
||||||
initGDT();
|
initGDT();
|
||||||
init_idt();
|
init_idt();
|
||||||
|
|
||||||
// Enable interrupts
|
// Enable interrupts
|
||||||
asm volatile("STI");
|
asm volatile("STI");
|
||||||
|
|
||||||
|
|
||||||
initHeap();
|
|
||||||
|
|
||||||
printf("TRY ALLOCATING 4 BYTES\n");
|
|
||||||
uint32_t* MyVariable = (uint32_t*) malloc(4); // allocate 4 bytes using my heap
|
|
||||||
free(MyVariable);
|
|
||||||
|
|
||||||
// test heap allocation
|
|
||||||
|
|
||||||
struct KernelInfo {
|
initHeap();
|
||||||
int bar;
|
|
||||||
bool foo;
|
|
||||||
};
|
|
||||||
|
|
||||||
KernelInfo* MyInfo = (KernelInfo*) malloc(sizeof(KernelInfo));
|
|
||||||
|
|
||||||
MyInfo->bar = 6;
|
|
||||||
MyInfo->foo = false;
|
|
||||||
printf("bar contains %d\n", MyInfo->bar);
|
|
||||||
free(MyInfo);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
printf("Enable Protected mode and jump to kernel main\n");
|
printf("Enable Protected mode and jump to kernel main\n");
|
||||||
|
|
||||||
|
|
||||||
|
// Set the protected bit of control register 0
|
||||||
|
// this will put the CPU into protected mode
|
||||||
|
// NOTE: This should really be a assembly procedure
|
||||||
|
// We cant directly write to control register 0
|
||||||
|
// therefor we copy the value of control register 0 into eax
|
||||||
|
// once we are done manipulating the value we write the value in
|
||||||
|
// eax back to control register 0
|
||||||
|
|
||||||
asm volatile("mov %cr0, %eax ");
|
asm volatile("mov %cr0, %eax ");
|
||||||
asm volatile("or $1, %eax");
|
asm volatile("or $1, %eax");
|
||||||
asm volatile("mov %eax, %cr0"); // re-enable protected mode ?
|
asm volatile("mov %eax, %cr0");
|
||||||
|
|
||||||
pit_initialise();
|
pit_initialise();
|
||||||
|
|
||||||
|
@ -1,43 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
#include "../lib/include/string.h"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#include "drivers/VGA/VBE.h"
|
|
||||||
#include "terminal/kterm.h"
|
|
||||||
|
|
||||||
#include "./boot/multiboot.h"
|
|
||||||
#include "bootinfo.h"
|
|
||||||
|
|
||||||
#include "memory/memory.h"
|
|
||||||
#include "memory/memoryinfo.h"
|
|
||||||
#include "bootcheck.h"
|
|
||||||
|
|
||||||
#include "gdt/gdtc.h"
|
|
||||||
#include "interrupts/idt/idt.h"
|
|
||||||
|
|
||||||
#include "drivers/IO/io.h"
|
|
||||||
#include "time.h"
|
|
||||||
#include "drivers/pit/pit.h"
|
|
||||||
|
|
||||||
#include "cpu.h"
|
|
||||||
#include "serial.h"
|
|
||||||
#include "drivers/IO/PCI/pci.h"
|
|
||||||
#include "drivers/ide/ide.h"
|
|
||||||
#include "./drivers/IO/ata/ataDevice.h"
|
|
||||||
#include "./PartitionTable/MBR/MasterBootRecord.h"
|
|
||||||
#include "./filesystem/FAT/BiosParameterBlock.h"
|
|
||||||
#include "./filesystem/FAT/ExtendBootRecord.h"
|
|
||||||
#include "./filesystem/FAT/DirectoryEntry.h"
|
|
||||||
#include "drivers/ACPI/rsdp.h"
|
|
||||||
|
|
||||||
|
|
||||||
#include "time.h"
|
|
||||||
#include "supervisorterminal/superVisorTerminal.h"
|
|
||||||
|
|
||||||
#define CHECK_FLAG(flags, bit) ((flags) & (1 <<(bit)))
|
#define CHECK_FLAG(flags, bit) ((flags) & (1 <<(bit)))
|
||||||
#define PANIC(message) {return;}
|
#define PANIC(message) {return;}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -63,26 +63,24 @@ void free(void* addr)
|
|||||||
|
|
||||||
void initHeap()
|
void initHeap()
|
||||||
{
|
{
|
||||||
// put the start of our kernel heap 1 page after the kernel_end address
|
void* HEAP_ADDRESS = allocate_block();
|
||||||
// Lets calculate the address
|
printf("0x%x HEAP Paddr\n", HEAP_ADDRESS);
|
||||||
printf("FIND SUITABLE HEAP_ADDRESS\n");
|
|
||||||
uint32_t alligned_k_end = (uint32_t) &kernel_end + ((uint32_t)&kernel_end % BLOCK_SIZE == 0 ? 4096 : 0);
|
Immediate_Map((uint32_t)HEAP_ADDRESS + 0xC0000000, (uint32_t)HEAP_ADDRESS );
|
||||||
uint32_t HEAP_ADDRESS = (uint32_t) alligned_k_end + 4096;
|
start = (heap_block*) ((uint32_t)HEAP_ADDRESS + 0xC0000000);
|
||||||
printf("HEAP_ADDRESS: 0x%x\n", HEAP_ADDRESS);
|
|
||||||
|
|
||||||
// NOTE: we can't check if the mapping has failed or not here!
|
|
||||||
AllocatePage(HEAP_ADDRESS);
|
|
||||||
start = (heap_block*) HEAP_ADDRESS;
|
|
||||||
heap_size = 4096;
|
heap_size = 4096;
|
||||||
|
|
||||||
printf("Clear heap\n");
|
printf("Clear heap\n");
|
||||||
// Clear the heap
|
// Clear the heap
|
||||||
printf("set at 0x%x %d bytes to zero\n", start , heap_size);
|
printf("set at 0x%x %d bytes to zero\n", start , heap_size);
|
||||||
|
|
||||||
memset((void*)start, 0x00, heap_size /4);
|
memset((void*)start, 0x00, heap_size /4);
|
||||||
|
|
||||||
|
|
||||||
printf("Init first heap block\n");
|
printf("Init first heap block\n");
|
||||||
// initialzie
|
// initialzie
|
||||||
start->Size = heap_size - sizeof(heap_block);
|
start->Size = heap_size - sizeof(heap_block);
|
||||||
|
|
||||||
start->Used = false;
|
start->Used = false;
|
||||||
|
|
||||||
}
|
}
|
@ -1,7 +1,8 @@
|
|||||||
#include "VirtualMemoryManager.h"
|
#include "VirtualMemoryManager.h"
|
||||||
#define ALIGN(addr, align) (((addr) & ~((align) - 1 )) + (align))
|
#define ALIGN(addr, align) (((addr) & ~((align) - 1 )) + (align))
|
||||||
|
|
||||||
extern uint32_t boot_page_directory[1024] ;
|
extern uint32_t boot_page_directory[1024] ; // points to the wrong location
|
||||||
|
|
||||||
extern uint32_t boot_page_table[1024];
|
extern uint32_t boot_page_table[1024];
|
||||||
|
|
||||||
|
|
||||||
@ -26,29 +27,28 @@ void AllocatePage(uint32_t vaddr)
|
|||||||
{
|
{
|
||||||
printf("Directory entry is marked as present\n");
|
printf("Directory entry is marked as present\n");
|
||||||
uint32_t* page_table = (uint32_t*)((boot_page_directory[PageDirectoryEntryIndex]) & 0xFFFFE000) ;
|
uint32_t* page_table = (uint32_t*)((boot_page_directory[PageDirectoryEntryIndex]) & 0xFFFFE000) ;
|
||||||
page_table = (uint32_t*) ((uint32_t)page_table + 0xC0000000); // Add kernel offset
|
//page_table = (uint32_t*) ((uint32_t)page_table + 0xC0000000); // Add kernel offset
|
||||||
printf("Page table address: 0x%x\n", (uint32_t)page_table);
|
printf("Page table address: 0x%x\n", (uint32_t)&page_table);
|
||||||
|
|
||||||
// check if the page table entry is marked as present
|
// check if the page table entry is marked as present
|
||||||
if ( page_table[PageTableEntryIndex] & 0x1 )
|
if ( page_table[PageTableEntryIndex] & 0x1 )
|
||||||
{
|
{
|
||||||
printf("page already present!\n");
|
printf("page already present!\n");
|
||||||
return;
|
|
||||||
} else{
|
} else{
|
||||||
printf("Mapping a physical page.\n");
|
printf("Mapping a physical page.\n");
|
||||||
// Map the entry to a physical page
|
// Map the entry to a physical page
|
||||||
page_table[PageTableEntryIndex] = (uint32_t)(allocate_block() + 0x3);
|
page_table[PageTableEntryIndex] = (uint32_t)allocate_block() | 0x3;
|
||||||
flush_cr3();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
printf("Mapping a new page directory entry with a page table\n");
|
printf("Mapping a new page directory entry with a page table\n");
|
||||||
// mark the page table as present and allocate a physical block for it
|
// mark the page table as present and allocate a physical block for it
|
||||||
boot_page_directory[PageDirectoryEntryIndex] = (uint32_t)(allocate_block() + 0x3);
|
boot_page_directory[PageDirectoryEntryIndex] = (uint32_t)allocate_block() | 0x3;
|
||||||
flush_cr3();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
asm ("cli; invlpg (%0); sti" :: "r" (vaddr) : "memory" );
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,12 +74,45 @@ void FreePage(uint32_t vaddr )
|
|||||||
|
|
||||||
void Immediate_Map ( uint32_t vaddr, uint32_t paddr)
|
void Immediate_Map ( uint32_t vaddr, uint32_t paddr)
|
||||||
{
|
{
|
||||||
uint32_t page_aligned_address = ALIGN(vaddr, 4096);
|
printf("map 0x%x to 0x%x\n", paddr, vaddr);
|
||||||
|
|
||||||
// allocate a page at virtual address
|
// allocate a page at virtual address
|
||||||
int PageDirectoryEntryIndex = vaddr >> 22;
|
int PageDirectoryEntryIndex = vaddr >> 22;
|
||||||
int PageTableEntryIndex = (vaddr >> 12) & 0x1FFF;
|
int PageTableEntryIndex = (vaddr >> 12) & 0x1FFF;
|
||||||
|
|
||||||
|
printf("Map address at PDE 0x%x PTE 0x%x\n", PageDirectoryEntryIndex, PageTableEntryIndex);
|
||||||
|
|
||||||
|
if ((boot_page_directory - 0xC0000000)[PageDirectoryEntryIndex] & 0x1 )
|
||||||
|
{
|
||||||
|
printf("Directory entry is marked as present\n");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
printf("Mapping a new page directory entry with a page table\n");
|
||||||
|
// mark the page table as present and allocate a physical block for it
|
||||||
|
|
||||||
|
void* new_page_dir = allocate_block();
|
||||||
|
printf("New page directory address 0x%x\n", new_page_dir);
|
||||||
|
boot_page_directory[PageDirectoryEntryIndex] = (uint32_t)new_page_dir | 0x3;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("PDE found at : 0x%x\n", (uint32_t) &boot_page_directory[PageDirectoryEntryIndex]);
|
||||||
|
uint32_t* page_table = (uint32_t*)(boot_page_directory[PageDirectoryEntryIndex] & 0xFFFFE000) ;
|
||||||
|
//page_table = (uint32_t*) ((uint32_t)page_table - 0xC0000000); // remove kernel offset
|
||||||
|
printf("Page table address: 0x%x\n", (uint32_t)page_table);
|
||||||
|
|
||||||
|
// check if the page table entry is marked as present
|
||||||
|
if ( page_table[PageTableEntryIndex] & 0x1 )
|
||||||
|
{
|
||||||
|
printf("page already present!\n");
|
||||||
|
printf("Entry found at addr: 0x%x\n", &(page_table[PageTableEntryIndex]));
|
||||||
|
} else{
|
||||||
|
printf("Mapping a physical page.\n");
|
||||||
|
// Map the entry to a physical page
|
||||||
|
page_table[PageTableEntryIndex] = (uint32_t)(paddr | 0x3);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
asm ("cli; invlpg (%0); sti" :: "r" (vaddr) : "memory" );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Immediate_Unmap(uint32_t vaddr)
|
void Immediate_Unmap(uint32_t vaddr)
|
||||||
|
@ -9,7 +9,7 @@ void SetupVMM();
|
|||||||
void AllocatePage(uint32_t v_addr );
|
void AllocatePage(uint32_t v_addr );
|
||||||
void FreePage(uint32_t v_addr);
|
void FreePage(uint32_t v_addr);
|
||||||
|
|
||||||
void Immediate_Map(uint32_t p_addr, uint32_t v_addr);
|
void Immediate_Map(uint32_t vaddr, uint32_t paddr);
|
||||||
void Immediate_Unmap (uint32_t v_addr);
|
void Immediate_Unmap (uint32_t v_addr);
|
||||||
|
|
||||||
// void Demand_map(uint32_t p_addr, uint32_t v_addr);
|
// void Demand_map(uint32_t p_addr, uint32_t v_addr);
|
||||||
|
@ -6,9 +6,13 @@
|
|||||||
#define KERNEL_DATA_SEGMENT 2
|
#define KERNEL_DATA_SEGMENT 2
|
||||||
#define USER_CODE_SEGMENT 3
|
#define USER_CODE_SEGMENT 3
|
||||||
#define USER_DATA_SEGMENT 4
|
#define USER_DATA_SEGMENT 4
|
||||||
|
#define TASK_STATE_SEGMENT 5
|
||||||
|
|
||||||
SegmentDescriptor GlobalDescriptorTable[5];
|
SegmentDescriptor GlobalDescriptorTable[6];
|
||||||
GlobalDescriptorTableDescriptor gdtDescriptor;
|
GlobalDescriptorTableDescriptor gdtDescriptor;
|
||||||
|
tss32 TaskStateSegment = {};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void add_descriptor(int which , unsigned long base, unsigned long limit, unsigned char access, unsigned char granularity ){
|
void add_descriptor(int which , unsigned long base, unsigned long limit, unsigned char access, unsigned char granularity ){
|
||||||
GlobalDescriptorTable[which].base_low = (base & 0xFFFF );
|
GlobalDescriptorTable[which].base_low = (base & 0xFFFF );
|
||||||
@ -21,7 +25,6 @@ void add_descriptor(int which , unsigned long base, unsigned long limit, unsigne
|
|||||||
GlobalDescriptorTable[which].granularity |= (granularity & 0xF0);
|
GlobalDescriptorTable[which].granularity |= (granularity & 0xF0);
|
||||||
GlobalDescriptorTable[which].access = access;
|
GlobalDescriptorTable[which].access = access;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -29,9 +32,9 @@ void add_descriptor(int which , unsigned long base, unsigned long limit, unsigne
|
|||||||
|
|
||||||
void initGDT(){
|
void initGDT(){
|
||||||
|
|
||||||
#ifdef __VERBOSE__
|
|
||||||
printf("Init GDT!\n");
|
printf("Init GDT!\n");
|
||||||
#endif
|
|
||||||
// NULL segment
|
// NULL segment
|
||||||
add_descriptor(NULL_SEGMENT, 0,0,0,0);
|
add_descriptor(NULL_SEGMENT, 0,0,0,0);
|
||||||
|
|
||||||
@ -42,16 +45,18 @@ void initGDT(){
|
|||||||
add_descriptor(KERNEL_DATA_SEGMENT, 0, 0xFFFFFFFF, 0x92, 0xCF);
|
add_descriptor(KERNEL_DATA_SEGMENT, 0, 0xFFFFFFFF, 0x92, 0xCF);
|
||||||
|
|
||||||
// User Code Segment
|
// User Code Segment
|
||||||
// TODO:
|
add_descriptor(USER_CODE_SEGMENT, 0, 0xFFFFFFFF, 0xFA, 0xCF);
|
||||||
|
|
||||||
// User Data Segement
|
// User Data Segement
|
||||||
// TODO:
|
add_descriptor(USER_DATA_SEGMENT, 0, 0xFFFFFFFF, 0xF2, 0xCF);
|
||||||
|
|
||||||
|
// Task Segment Descriptor
|
||||||
|
add_descriptor(TASK_STATE_SEGMENT, (unsigned long)&TaskStateSegment, sizeof(TaskStateSegment), 0x89, 0x0);
|
||||||
|
|
||||||
// init Gdt Descriptor
|
// init Gdt Descriptor
|
||||||
gdtDescriptor.limit = ((sizeof(SegmentDescriptor ) * 5 ) - 1);
|
gdtDescriptor.limit = ((sizeof(SegmentDescriptor ) * 5 ) - 1);
|
||||||
gdtDescriptor.base = (unsigned int) &GlobalDescriptorTable;
|
gdtDescriptor.base = (unsigned int) (&GlobalDescriptorTable);
|
||||||
|
|
||||||
printf("GDT at address 0x%x, with an size of 0x%x bytes\n" , (unsigned int)GlobalDescriptorTable, sizeof(GlobalDescriptorTable));
|
|
||||||
|
|
||||||
LoadGlobalDescriptorTable();
|
LoadGlobalDescriptorTable();
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
|
#pragma once
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
struct SegmentDescriptor {
|
struct SegmentDescriptor {
|
||||||
unsigned short limit_low;
|
unsigned short limit_low;
|
||||||
unsigned short base_low;
|
unsigned short base_low;
|
||||||
@ -10,14 +9,16 @@ struct SegmentDescriptor {
|
|||||||
unsigned char base_high;
|
unsigned char base_high;
|
||||||
}__attribute__((packed));
|
}__attribute__((packed));
|
||||||
|
|
||||||
|
struct tss32 {
|
||||||
|
uint64_t bits;
|
||||||
|
uint8_t other_bits :5;
|
||||||
|
}__attribute__((packed));
|
||||||
|
|
||||||
struct GlobalDescriptorTableDescriptor{
|
struct GlobalDescriptorTableDescriptor{
|
||||||
unsigned short limit;
|
unsigned short limit;
|
||||||
unsigned int base;
|
unsigned int base;
|
||||||
}__attribute__((packed));
|
}__attribute__((packed)) ;
|
||||||
|
|
||||||
extern SegmentDescriptor GlobalDescriptorTable[];
|
|
||||||
extern GlobalDescriptorTableDescriptor gdtDescriptor;
|
|
||||||
|
|
||||||
|
|
||||||
void add_descriptor(int which , unsigned long base, unsigned long limit, unsigned char access, unsigned char granularity );
|
void add_descriptor(int which , unsigned long base, unsigned long limit, unsigned char access, unsigned char granularity );
|
||||||
|
@ -1,4 +1,10 @@
|
|||||||
#include "superVisorTerminal.h"
|
#include "superVisorTerminal.h"
|
||||||
|
#include "../drivers/ata/ataDevice.h"
|
||||||
|
#include "../drivers/acpi/acpi.h"
|
||||||
|
#include "../drivers/ide/ide.h"
|
||||||
|
#include "../PartitionTable/MBR/MasterBootRecord.h"
|
||||||
|
#include "../filesystem/FAT/BiosParameterBlock.h"
|
||||||
|
#include "../filesystem/FAT/DirectoryEntry.h"
|
||||||
bool isRunning = true;
|
bool isRunning = true;
|
||||||
void startSuperVisorTerminal(){
|
void startSuperVisorTerminal(){
|
||||||
while (isRunning){
|
while (isRunning){
|
||||||
@ -24,7 +30,7 @@ void startSuperVisorTerminal(){
|
|||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
KeyHandled();
|
KeyHandled();
|
||||||
|
|
||||||
|
|
||||||
if ( strncmp("DATE", command , characterCount ) == 0 )
|
if ( strncmp("DATE", command , characterCount ) == 0 )
|
||||||
{
|
{
|
||||||
@ -34,7 +40,7 @@ void startSuperVisorTerminal(){
|
|||||||
printf(" - Time: %02d:%02d:%02d\n" , hour, minute, second);
|
printf(" - Time: %02d:%02d:%02d\n" , hour, minute, second);
|
||||||
printf(" - Ticks: %09d\n", pit_tick);
|
printf(" - Ticks: %09d\n", pit_tick);
|
||||||
}
|
}
|
||||||
else if( strncmp ("MEMORY" , command , characterCount) == 0 )
|
if( strncmp ("MEMORY" , command , characterCount) == 0 )
|
||||||
{
|
{
|
||||||
// Show memory layout
|
// Show memory layout
|
||||||
printf("========= Memory ==========\n");
|
printf("========= Memory ==========\n");
|
||||||
@ -51,33 +57,181 @@ void startSuperVisorTerminal(){
|
|||||||
//printf("Reserved Memory: %d bytes\n", bootinfo->memory->ReservedMemory);
|
//printf("Reserved Memory: %d bytes\n", bootinfo->memory->ReservedMemory);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if(strncmp("TEST", command, characterCount) == 0)
|
if(strncmp("TEST", command, characterCount) == 0)
|
||||||
{
|
{
|
||||||
// TEST #DE exception
|
// TEST #DE exception
|
||||||
asm volatile ("MOV $4, %AX ; MOV $0, %BX ; DIV %BX"); // IRS 0
|
asm volatile ("MOV $4, %AX ; MOV $0, %BX ; DIV %BX"); // IRS 0
|
||||||
}
|
}
|
||||||
else if (strncmp("VERSION", command , characterCount) == 0)
|
if (strncmp("VERSION", command , characterCount) == 0)
|
||||||
{
|
{
|
||||||
// Show version information
|
// Show version information
|
||||||
printf("========= Version ========\n");
|
printf("========= Version ========\n");
|
||||||
printf("Kernel v%d\n", 0);
|
printf("Kernel v%d\n", 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if(strncmp("CLEAR", command, characterCount) == 0)
|
if(strncmp("CLEAR", command, characterCount) == 0)
|
||||||
{
|
{
|
||||||
kterm_init();
|
kterm_init();
|
||||||
printf("|=== BarinkOS ===|\n");
|
printf("|=== BarinkOS ===|\n");
|
||||||
}
|
}
|
||||||
else if(strncmp("FAT", command, characterCount) == 0){
|
if(strncmp("FAT", command, characterCount) == 0)
|
||||||
isRunning = false;
|
{
|
||||||
|
printf("ACPI initialize!\n");
|
||||||
|
///ACPI::initialize();
|
||||||
|
|
||||||
|
// Enumerate the PCI bus
|
||||||
|
printf("PCI Enumeration\n");
|
||||||
|
PCI_Enumerate();
|
||||||
|
printf("TEST IDE Controller");
|
||||||
|
TestIDEController();
|
||||||
|
|
||||||
|
int devNumber = 0 ;
|
||||||
|
for ( auto device : ide_devices){
|
||||||
|
if (!device.Reserved)
|
||||||
|
continue;
|
||||||
|
printf("Device %d\n" , devNumber);
|
||||||
|
printf (" Device on Channel: (0x%x) %s\n" ,device.Channel, device.Channel == 0 ? "Primary" : "Secondary");
|
||||||
|
printf (" Device drive:(0x%x) %s\n" , device.Drive, device.Drive? "Slave" : "Master");
|
||||||
|
printf (" Device Type:(0x%x) %s\n" , device.Type, device.Type ? "ATAPI" : "ATA");
|
||||||
|
devNumber ++;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
enum BUS_PORT {
|
||||||
|
Primary= 0x1f0,
|
||||||
|
Secondary = 0x170
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ATA_DEVICE::Identify((uint16_t) BUS_PORT::Primary, DEVICE_DRIVE::MASTER);
|
||||||
|
|
||||||
|
const int C = 0;
|
||||||
|
const int H = 0;
|
||||||
|
const int HPC = 16;
|
||||||
|
const int SPT = 63;
|
||||||
|
|
||||||
|
int S = 1;
|
||||||
|
uint32_t LBA = (C*HPC+H) * SPT + (S-1);
|
||||||
|
printf("LBA: %d\n" , LBA);
|
||||||
|
uint16_t buffer [256];
|
||||||
|
|
||||||
|
|
||||||
|
ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, LBA, buffer);
|
||||||
|
|
||||||
|
MBR* mbr = (MBR*) buffer;
|
||||||
|
|
||||||
|
printf("BootSector: 0x%x\n", mbr->ValidBootsector );
|
||||||
|
for( int i = 0 ; i < 4 ; i ++){
|
||||||
|
PartitionTableEntry PT = mbr->TableEntries[i];
|
||||||
|
|
||||||
|
printf("Partition %d [ %d sectors, PartitionType: %x, 0x%x, \nLBA Start: 0x%x ]\n" ,
|
||||||
|
i, PT.Number_sectors_inPartition, PT.PartitionType, mbr->uniqueID, PT.LBA_partition_start );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the BiosParameter block
|
||||||
|
uint16_t biosparameterblock[256];
|
||||||
|
ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, mbr->TableEntries[0].LBA_partition_start, biosparameterblock);
|
||||||
|
|
||||||
|
BiosParameterBlock* bpb = (BiosParameterBlock*) biosparameterblock;
|
||||||
|
|
||||||
|
|
||||||
|
printf("\nBPB: Bytes per Sector %d\n", bpb->BytesPerSector );
|
||||||
|
printf("OEM ID: %s\n", bpb->OEM_id);
|
||||||
|
printf("Bytes per sector: %d\n", bpb->BytesPerSector);
|
||||||
|
printf("Sectors per cluster: %d\n", bpb->SectorsPerCluster);
|
||||||
|
printf("Reserved sectors: %d\n", bpb->ReservedSectors);
|
||||||
|
printf("Number of FAT: %d\n", bpb->NumberOfFileAllocationTables);
|
||||||
|
printf("Number of Dir entries: %d\n", bpb->NumberOfDirectoryEntries);
|
||||||
|
printf("Total Sectors in volume: %d\n", bpb->TotalSectorsInLogicalVolume);
|
||||||
|
printf("Sectors per FAT: %d\n", bpb->NumberOfSectorsPerFAT);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief File Allocation Table
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
uint32_t FATAddress = mbr->TableEntries[0].LBA_partition_start + bpb->ReservedSectors ;
|
||||||
|
uint16_t FAT[256];
|
||||||
|
ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, FATAddress, FAT );
|
||||||
|
|
||||||
|
// Show data in terminal
|
||||||
|
for(int i = 0; i < 256; i++ ) {
|
||||||
|
printf("%x ", FAT[i]);
|
||||||
|
}
|
||||||
|
kterm_put('\n');
|
||||||
|
|
||||||
|
|
||||||
|
uint32_t RootDirectoryRegion = FATAddress + ( bpb->NumberOfFileAllocationTables * bpb->NumberOfSectorsPerFAT );
|
||||||
|
uint32_t DataRegion = RootDirectoryRegion + ((bpb->NumberOfDirectoryEntries * 32) / bpb->BytesPerSector );
|
||||||
|
|
||||||
|
uint16_t data2 [256];
|
||||||
|
ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, RootDirectoryRegion, data2 );
|
||||||
|
DirectoryEntry* RootDirectory = (DirectoryEntry*) data2;
|
||||||
|
// List files in root
|
||||||
|
for(int i= 0; i < bpb->NumberOfDirectoryEntries ; i++ )
|
||||||
|
{
|
||||||
|
DirectoryEntry* entry = (DirectoryEntry*)((uint32_t) RootDirectory + (i * sizeof(DirectoryEntry)));
|
||||||
|
|
||||||
|
if( entry->filename[0] == (uint8_t) 0x00 )
|
||||||
|
break; // There are no more entries in this directory or the entry is free
|
||||||
|
|
||||||
|
if( entry->attribute & 0x01 == 0x01 || entry->attribute & 0x20 == 0x20)
|
||||||
|
continue; // Skip listing if hidden or Achieve flag is set
|
||||||
|
|
||||||
|
// Print the filename;
|
||||||
|
for( int n = 0; n < 8; n++ ){
|
||||||
|
if(entry->filename[n] == 0x20)
|
||||||
|
break;
|
||||||
|
kterm_put(entry->filename[n]);
|
||||||
|
}kterm_put('\n');
|
||||||
|
|
||||||
|
for( int n = 0; n < 3; n++){
|
||||||
|
kterm_put(entry->Extension[n]);
|
||||||
|
}kterm_put('\n');
|
||||||
|
|
||||||
|
printf("Attribute: %x \n" , entry->attribute);
|
||||||
|
printf("FileSize: %d Bytes\n", entry->FilesizeInBytes);
|
||||||
|
|
||||||
|
if( entry->FilesizeInBytes != 0x0 || entry->attribute & 0x8 == 0x0){
|
||||||
|
printf("Show contents");
|
||||||
|
|
||||||
|
printf( "Start cluster of the file: 0x%x\n" , entry->StartingCluster);
|
||||||
|
|
||||||
|
printf("IS it only 1 cluster? %s\n" , FAT[i] == 0xFFFF? "Yes": "No" );
|
||||||
|
|
||||||
|
uint32_t sector = DataRegion + ((entry->StartingCluster - 0x02 ) * bpb->SectorsPerCluster);
|
||||||
|
|
||||||
|
|
||||||
|
uint16_t dataBlob [256];
|
||||||
|
ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, sector, dataBlob );
|
||||||
|
for( int n = 0; n < 256; n++)
|
||||||
|
{
|
||||||
|
kterm_put(dataBlob[n] & 0x00ff);
|
||||||
|
|
||||||
|
kterm_put(dataBlob[n] >> 8);
|
||||||
|
}kterm_put('\n');
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("======================\n");
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("Unknown command\n");
|
|
||||||
|
if(strncmp("glg", command, characterCount) == 0){
|
||||||
|
printf("Why???");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
printf("executed command: %s\n", command);
|
||||||
|
|
||||||
|
|
||||||
delay(1000);
|
delay(1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user