Merge into main the new state of the operating system/kernel #1
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
[submodule "mlibc"]
 | 
			
		||||
	path = mlibc
 | 
			
		||||
	url = https://github.com/managarm/mlibc.git
 | 
			
		||||
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							@ -68,7 +68,7 @@ $(BUILD_DIR)/io.o:
 | 
			
		||||
		$(CPP) -c $(SRC_DIR)/kernel/drivers/io/io.cpp  -o $(BUILD_DIR)/io.o $(CFLAGS) -fno-exceptions -fno-rtti
 | 
			
		||||
 | 
			
		||||
$(BUILD_DIR)/idt.o:
 | 
			
		||||
	$(CPP) -c $(SRC_DIR)/kernel/interrupts/idt/idt.cpp -o $(BUILD_DIR)/idt.o $(CFLAGS) -fno-exceptions -fno-rtti
 | 
			
		||||
	$(CPP) -c $(SRC_DIR)/kernel/interrupts/idt.cpp -o $(BUILD_DIR)/idt.o $(CFLAGS) -fno-exceptions -fno-rtti
 | 
			
		||||
 | 
			
		||||
$(BUILD_DIR)/gdtc.o:
 | 
			
		||||
	$(CPP) -c $(SRC_DIR)/kernel/memory/gdt/gdtc.cpp -o $(BUILD_DIR)/gdtc.o $(CFLAGS) -fno-exceptions -fno-rtti
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										1
									
								
								mlibc
									
									
									
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								mlibc
									
									
									
									
									
										Submodule
									
								
							 Submodule mlibc added at aad4e7f64b
									
								
							@ -108,6 +108,6 @@ isPaging:
 | 
			
		||||
.include "./source/kernel/memory/gdt/gdt.s"
 | 
			
		||||
.include "./source/kernel/irs_table.s"
 | 
			
		||||
.include "./source/kernel/irq_table.s"
 | 
			
		||||
.include "./source/kernel/interrupts/idt/idt.s"
 | 
			
		||||
.include "./source/kernel/interrupts/idt.s"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -114,6 +114,14 @@ const char* getVendor( uint32_t VendorID){
 | 
			
		||||
            return "Advanced Micor Devices, Inc.[AMD/ATI]";
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case 0xbeef:
 | 
			
		||||
            return "VirtualBox Graphics Adapter";
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case 0xcafe:
 | 
			
		||||
            return "VirtualBox Guest Service";
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        default:
 | 
			
		||||
            return "Vendor Unkown";
 | 
			
		||||
            break;
 | 
			
		||||
@ -126,6 +134,16 @@ uint32_t ConfigReadWord ( PCIBusAddress& PCIDeviceAddress , uint8_t offset){
 | 
			
		||||
    return inl(CONFIG_DATA);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t GetProgIF (PCIBusAddress& PCIDeviceAddress){
 | 
			
		||||
    uint32_t data = ConfigReadWord(PCIDeviceAddress, 0x8);
 | 
			
		||||
    return ((data >> 8) & 0xFF);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t ReadBAR ( PCIBusAddress& PCIDeviceAddress, int bar_number){
 | 
			
		||||
    int offsetToBar = 0x10 + (bar_number* 0x4);
 | 
			
		||||
    return ConfigReadWord(PCIDeviceAddress, offsetToBar); 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t ConfigReadWord (uint8_t bus, uint8_t device, uint8_t func, uint8_t offset){
 | 
			
		||||
    uint32_t address;
 | 
			
		||||
 | 
			
		||||
@ -186,7 +204,6 @@ void PrintPCIDeviceInfo (PCIBusAddress& PCIDeviceAddress)
 | 
			
		||||
 | 
			
		||||
void PCI_Enumerate(){
 | 
			
		||||
     
 | 
			
		||||
 | 
			
		||||
        int devicesFound = 0;
 | 
			
		||||
 | 
			
		||||
        printf("Start finding devices, Found: %d devices");
 | 
			
		||||
@ -196,18 +213,14 @@ void PCI_Enumerate(){
 | 
			
		||||
            
 | 
			
		||||
            for(int device = 0; device < 32 ; device ++)
 | 
			
		||||
            {
 | 
			
		||||
                 
 | 
			
		||||
                
 | 
			
		||||
                int function = 0;
 | 
			
		||||
 | 
			
		||||
                //uint64_t DeviceIdentify = ConfigReadWord(bus, device, function,0x0);
 | 
			
		||||
                uint64_t DeviceIdentify = ConfigReadWord(bus, device, function,0x0);
 | 
			
		||||
                uint32_t DeviceID = GetDevice(bus, device, function) >> 16;
 | 
			
		||||
 | 
			
		||||
                
 | 
			
		||||
 | 
			
		||||
                if( DeviceID != 0xFFFF){
 | 
			
		||||
                    PCIBusAddress busAddress =
 | 
			
		||||
                        PCIBusAddress{bus, device, function };
 | 
			
		||||
                    PCIBusAddress{bus, device, function };
 | 
			
		||||
 | 
			
		||||
                    PrintPCIDeviceInfo(busAddress);
 | 
			
		||||
 | 
			
		||||
@ -229,8 +242,6 @@ void PCI_Enumerate(){
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                    devicesFound++;            
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@ -240,12 +251,3 @@ void PCI_Enumerate(){
 | 
			
		||||
        printf("Found %d PCI devices!\n", devicesFound);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t GetProgIF (PCIBusAddress& PCIDeviceAddress){
 | 
			
		||||
    uint32_t data = ConfigReadWord(PCIDeviceAddress, 0x8);
 | 
			
		||||
    return ((data >> 8) & 0xFF);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t ReadBAR ( PCIBusAddress& PCIDeviceAddress, int bar_number){
 | 
			
		||||
    int offsetToBar = 0x10 + (bar_number* 0x4);
 | 
			
		||||
    return ConfigReadWord(PCIDeviceAddress, offsetToBar); 
 | 
			
		||||
}
 | 
			
		||||
@ -1,8 +1,8 @@
 | 
			
		||||
#include "idt.h"
 | 
			
		||||
#include "../../drivers/pit/pit.h"
 | 
			
		||||
#include "../../drivers/ps-2/keyboard.h"
 | 
			
		||||
#include "../../cpu.h"
 | 
			
		||||
#include "../../memory/VirtualMemoryManager.h"
 | 
			
		||||
#include "../drivers/pit/pit.h"
 | 
			
		||||
#include "../drivers/ps-2/keyboard.h"
 | 
			
		||||
#include "../cpu.h"
 | 
			
		||||
#include "../memory/VirtualMemoryManager.h"
 | 
			
		||||
IDT_entry idt_table[256];
 | 
			
		||||
IDT_ptr idt_ptr;
 | 
			
		||||
 | 
			
		||||
@ -327,7 +327,7 @@ void irq_handler (registers regs) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void init_idt(){
 | 
			
		||||
void initidt(){
 | 
			
		||||
    // Initialise the IDT pointer
 | 
			
		||||
    idt_ptr.length = sizeof(IDT_entry) * 255;
 | 
			
		||||
    idt_ptr.base = (uint32_t)&idt_table;
 | 
			
		||||
@ -2,10 +2,10 @@
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
#include "../../drivers/vga/colors.h"
 | 
			
		||||
#include "../../drivers/pic/pic.h"
 | 
			
		||||
#include "../drivers/vga/colors.h"
 | 
			
		||||
#include "../drivers/pic/pic.h"
 | 
			
		||||
 | 
			
		||||
#include "../../terminal/kterm.h"
 | 
			
		||||
#include "../terminal/kterm.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
extern "C" {
 | 
			
		||||
@ -32,7 +32,7 @@ extern "C" {
 | 
			
		||||
 | 
			
		||||
    extern void idt_flush(uint32_t); 
 | 
			
		||||
    void set_id_entry (uint8_t num , uint32_t base, uint16_t sel,  uint8_t flags);
 | 
			
		||||
    void init_idt();
 | 
			
		||||
    void initidt();
 | 
			
		||||
 | 
			
		||||
    void irq_handler (registers regs);
 | 
			
		||||
 | 
			
		||||
@ -12,6 +12,7 @@ extern "C"
 | 
			
		||||
#include "memory/VirtualMemoryManager.h"
 | 
			
		||||
#include "memory/KernelHeap.h"
 | 
			
		||||
#include "memory/gdt/gdtc.h"
 | 
			
		||||
#include "memory/TaskStateSegment.h"
 | 
			
		||||
 | 
			
		||||
#include "supervisorterminal/superVisorTerminal.h"
 | 
			
		||||
 | 
			
		||||
@ -19,7 +20,8 @@ extern "C"
 | 
			
		||||
#include "drivers/vga/VBE.h"
 | 
			
		||||
#include "drivers/pci/pci.h"
 | 
			
		||||
#include "drivers/pit/pit.h"
 | 
			
		||||
 | 
			
		||||
#include "drivers/acpi/acpi.h"
 | 
			
		||||
#include "drivers/ide/ide.h"
 | 
			
		||||
 | 
			
		||||
#include "terminal/kterm.h"
 | 
			
		||||
 | 
			
		||||
@ -28,16 +30,13 @@ extern "C"
 | 
			
		||||
 | 
			
		||||
#include "bootcheck.h"
 | 
			
		||||
 | 
			
		||||
#include "interrupts/idt/idt.h"
 | 
			
		||||
#include "interrupts/idt.h"
 | 
			
		||||
#include "time.h"
 | 
			
		||||
#include "cpu.h"
 | 
			
		||||
#include "serial.h"
 | 
			
		||||
#include "time.h"
 | 
			
		||||
#include "definitions.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
    Copyright © Nigel Barink 2023
 | 
			
		||||
*/
 | 
			
		||||
@ -55,16 +54,22 @@ extern "C" void kernel_main ()
 | 
			
		||||
extern "C" void early_main()
 | 
			
		||||
{
 | 
			
		||||
    init_serial();
 | 
			
		||||
 | 
			
		||||
    kterm_init();
 | 
			
		||||
    printf("Allocated blocks: 0x%x \n", GetUsedBlocks());
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    initGDT();
 | 
			
		||||
    init_idt();
 | 
			
		||||
    //setup_tss();
 | 
			
		||||
    initidt();
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Enable interrupts
 | 
			
		||||
    asm volatile("STI");
 | 
			
		||||
 | 
			
		||||
    ACPI::initialize();
 | 
			
		||||
    PCI_Enumerate();  
 | 
			
		||||
 | 
			
		||||
    TestIDEController();      
 | 
			
		||||
 | 
			
		||||
    initHeap(); 
 | 
			
		||||
 | 
			
		||||
    printf("Enable Protected mode and jump to kernel main\n");
 | 
			
		||||
@ -84,7 +89,6 @@ extern "C" void early_main()
 | 
			
		||||
 | 
			
		||||
    pit_initialise();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    kernel_main();
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										59
									
								
								source/kernel/memory/TaskStateSegment.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								source/kernel/memory/TaskStateSegment.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,59 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include "gdt/gdtc.h"
 | 
			
		||||
#include "../../lib/include/string.h"
 | 
			
		||||
 | 
			
		||||
struct TaskStateSegment {
 | 
			
		||||
    uint32_t prev_tss;
 | 
			
		||||
    uint32_t esp0;
 | 
			
		||||
    uint32_t ss0;
 | 
			
		||||
    // everythinge else is unused 
 | 
			
		||||
    uint32_t esp1;
 | 
			
		||||
    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;
 | 
			
		||||
	uint32_t cs;
 | 
			
		||||
	uint32_t ss;
 | 
			
		||||
	uint32_t ds;
 | 
			
		||||
	uint32_t fs;
 | 
			
		||||
	uint32_t gs;
 | 
			
		||||
	uint32_t ldt;
 | 
			
		||||
	uint16_t trap;
 | 
			
		||||
	uint16_t iomap_base;
 | 
			
		||||
}__attribute__((packed));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
TaskStateSegment tss0 = {};
 | 
			
		||||
 | 
			
		||||
inline void flush_tss(){
 | 
			
		||||
     asm volatile("mov (5 * 8) |0 , %eax; ltr %ax");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void setup_tss(){
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // ensure the tss is zero'd
 | 
			
		||||
    //memset((void*)&tss0, 0, sizeof(tss0));
 | 
			
		||||
    tss0.ss0 = (uint32_t) &(GlobalDescriptorTable[KERNEL_DATA_SEGMENT]);
 | 
			
		||||
    uint32_t esp_addr =0 ; 
 | 
			
		||||
    asm volatile ("movl %%esp, %0" : "=a"(esp_addr));
 | 
			
		||||
    tss0.esp0 = esp_addr;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // Task Segment Descriptor
 | 
			
		||||
    add_descriptor(TASK_STATE_SEGMENT, (unsigned long)&tss0, sizeof(tss0), 0x89, 0x0);
 | 
			
		||||
    flush_tss();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,17 +1,9 @@
 | 
			
		||||
#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
 | 
			
		||||
#define TASK_STATE_SEGMENT    5
 | 
			
		||||
 | 
			
		||||
SegmentDescriptor GlobalDescriptorTable[6];
 | 
			
		||||
GlobalDescriptorTableDescriptor gdtDescriptor;
 | 
			
		||||
tss32 TaskStateSegment = {};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void add_descriptor(int which , unsigned long base, unsigned long limit, unsigned char access, unsigned char granularity ){
 | 
			
		||||
@ -32,9 +24,6 @@ void add_descriptor(int which , unsigned long base, unsigned long limit, unsigne
 | 
			
		||||
 | 
			
		||||
void initGDT(){
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      printf("Init GDT!\n");
 | 
			
		||||
 | 
			
		||||
      // NULL segment
 | 
			
		||||
      add_descriptor(NULL_SEGMENT, 0,0,0,0);
 | 
			
		||||
 | 
			
		||||
@ -50,14 +39,9 @@ void initGDT(){
 | 
			
		||||
      // User Data Segement
 | 
			
		||||
      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
 | 
			
		||||
      gdtDescriptor.limit = ((sizeof(SegmentDescriptor ) * 5 ) - 1);
 | 
			
		||||
      gdtDescriptor.base = (unsigned int) (&GlobalDescriptorTable);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      LoadGlobalDescriptorTable();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,16 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <stdint.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
 | 
			
		||||
#define TASK_STATE_SEGMENT    5
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct SegmentDescriptor {
 | 
			
		||||
   unsigned short limit_low;
 | 
			
		||||
   unsigned short base_low;
 | 
			
		||||
@ -9,10 +20,7 @@ struct SegmentDescriptor {
 | 
			
		||||
   unsigned char base_high;
 | 
			
		||||
}__attribute__((packed));
 | 
			
		||||
 | 
			
		||||
struct tss32 {
 | 
			
		||||
   uint64_t bits;
 | 
			
		||||
   uint8_t  other_bits :5;
 | 
			
		||||
}__attribute__((packed));
 | 
			
		||||
extern SegmentDescriptor GlobalDescriptorTable[6];
 | 
			
		||||
 | 
			
		||||
struct GlobalDescriptorTableDescriptor{
 | 
			
		||||
   unsigned short limit;
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,6 @@
 | 
			
		||||
#include "superVisorTerminal.h"
 | 
			
		||||
#include "../drivers/ata/ataDevice.h"
 | 
			
		||||
#include "../drivers/acpi/acpi.h"
 | 
			
		||||
#include "../drivers/ide/ide.h"
 | 
			
		||||
#include "../PartitionTable/MBR/MasterBootRecord.h"
 | 
			
		||||
#include "../partitiontable/mbr/MasterBootRecord.h"
 | 
			
		||||
#include "../filesystem/FAT/BiosParameterBlock.h"
 | 
			
		||||
#include "../filesystem/FAT/DirectoryEntry.h"
 | 
			
		||||
bool isRunning = true;
 | 
			
		||||
@ -43,18 +41,10 @@ void startSuperVisorTerminal(){
 | 
			
		||||
            if( strncmp ("MEMORY" , command , characterCount) == 0 )
 | 
			
		||||
            {
 | 
			
		||||
                // Show memory layout
 | 
			
		||||
                printf("========= Memory ==========\n");
 | 
			
		||||
                printf("========= Memory (very inaccurate) ==========\n");
 | 
			
		||||
                printf("Kernel MemoryMap:\n");
 | 
			
		||||
                printf("kernel: 0x%x - 0x%x\n", &kernel_begin , &kernel_end);         
 | 
			
		||||
                printf("Frames used: 0x%x blocks of 4 KiB\n", 0);  
 | 
			
		||||
                const int bytesInGiB = 1073741824;
 | 
			
		||||
                //int64_t bytesLeft = (bootinfo->memory->TotalMemory % bytesInGiB) / bytesInGiB;
 | 
			
		||||
                //int64_t effectiveNumberOfGib = bootinfo->memory->TotalMemory / bytesInGiB;
 | 
			
		||||
 | 
			
		||||
                //int64_t GiBs = effectiveNumberOfGib + bytesLeft;  
 | 
			
		||||
 | 
			
		||||
                //printf("Available Memory: %d bytes, %d GiB\n",  bootinfo->memory->TotalMemory, GiBs );
 | 
			
		||||
                //printf("Reserved Memory: %d bytes\n",  bootinfo->memory->ReservedMemory);
 | 
			
		||||
                printf("Frames used: %d blocks of 4 KiB\n", GetUsedBlocks());  
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
            if(strncmp("TEST", command, characterCount) == 0)
 | 
			
		||||
@ -76,14 +66,6 @@ void startSuperVisorTerminal(){
 | 
			
		||||
            }
 | 
			
		||||
            if(strncmp("FAT", command, characterCount) == 0)
 | 
			
		||||
            {
 | 
			
		||||
                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){
 | 
			
		||||
@ -129,7 +111,7 @@ void startSuperVisorTerminal(){
 | 
			
		||||
                        i, PT.Number_sectors_inPartition, PT.PartitionType, mbr->uniqueID,  PT.LBA_partition_start );
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    // Find the BiosParameter block
 | 
			
		||||
                // Find the BiosParameter block
 | 
			
		||||
                uint16_t biosparameterblock[256];
 | 
			
		||||
                ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, mbr->TableEntries[0].LBA_partition_start, biosparameterblock);
 | 
			
		||||
 | 
			
		||||
@ -224,8 +206,15 @@ void startSuperVisorTerminal(){
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            if(strncmp("glg", command, characterCount) == 0){
 | 
			
		||||
                printf("Why???");
 | 
			
		||||
            if(strncmp("DEVICES", command, characterCount) == 0){
 | 
			
		||||
                printf("================ CONNECTED DEVICES ===============\n");
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										73
									
								
								source/lib/include/stack.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								source/lib/include/stack.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,73 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include "../../kernel/memory/KernelHeap.h"
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
class Stack {
 | 
			
		||||
    public:
 | 
			
		||||
        inline Stack() {
 | 
			
		||||
                elements = (T[MAX_STACK_SIZE]) malloc(MAX_STACK_SIZE * sizeof(T));
 | 
			
		||||
                num = 0;
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        inline void  Push(T element){
 | 
			
		||||
            num++;
 | 
			
		||||
            if(num > MAX_STACK_SIZE)
 | 
			
		||||
                grow();
 | 
			
		||||
 | 
			
		||||
            element[num] = element;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
     
 | 
			
		||||
        inline T Pop()
 | 
			
		||||
        {
 | 
			
		||||
            T temp = elements[num];
 | 
			
		||||
            num --;
 | 
			
		||||
 | 
			
		||||
            return temp;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        inline bool isEmpty()
 | 
			
		||||
        {
 | 
			
		||||
            return num == 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        inline bool isFull()
 | 
			
		||||
        {
 | 
			
		||||
                return num == MAX_STACK_SIZE;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      
 | 
			
		||||
        inline int count()
 | 
			
		||||
        {
 | 
			
		||||
                return num;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        inline ~Stack()
 | 
			
		||||
        {
 | 
			
		||||
            free(elements);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private:
 | 
			
		||||
        unsigned int MAX_STACK_SIZE;
 | 
			
		||||
        T[MAX_STACK_SIZE] elements;
 | 
			
		||||
        unsigned int num;
 | 
			
		||||
 | 
			
		||||
        inline void grow (){
 | 
			
		||||
            MAX_STACK_SIZE = MAX_STACK_SIZE + (int)(MAX_STACK_SIZE / 4);
 | 
			
		||||
            T[] new_elements =(T[MAX_STACK_SIZE]) malloc(MAX_STACK_SIZE * sizeof(T));
 | 
			
		||||
 | 
			
		||||
            for ( int i = 0; i < num ; i++){
 | 
			
		||||
                new_elements[i] = elements[i];
 | 
			
		||||
            }
 | 
			
		||||
            free(elements);
 | 
			
		||||
            elements = new_elements;
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user