diff --git a/kernel/include/kernel.h b/kernel/include/kernel.h index 09421d3..9dda247 100644 --- a/kernel/include/kernel.h +++ b/kernel/include/kernel.h @@ -29,22 +29,37 @@ typedef __builtin_va_list va_list; /* * Utility macros */ + +// Assertions #define STATIC_ASSERT(_cond, _msg)\ typedef int static_assert_##_msg[(_cond) ? 1 : -1] +// Array #define ARRAY_SIZE(_a) (sizeof((_a)) / sizeof((_a)[0])) -#define BIT(_n) (1UL << (_n)) -#define BIT_MASK(_n) (BIT(_n) - 1) -#define ALIGN(_x, _a) __ALIGN_MASK((_x), (typeof(_x))(_a) - 1) -#define __ALIGN_MASK(_x, _m) (((_x) + (_m)) & ~(_m)) +#define array_sizeof ARRAY_SIZE #define container_of(_p, _t, _m) \ ((_t*)((char*)(_p) - offsetof(_t, _m))) + +// Align +#define ALIGN(x, a) __ALIGN_MASK((x), (typeof(x))(a) - 1) +#define ALIGN_DOWN(x, a) ((x) & ~((typeof(x))(a) - 1)) +#define __ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask)) +#define PTR_ALIGN(p, a) ((typeof(p))ALIGN((unsigned long)(p), (a))) +#define PTR_ALIGN_DOWN(p, a) ((typeof(p))ALIGN_DOWN((unsigned long)(p), (a))) + +// Bit +#define BIT(_n) (1UL << (_n)) +#define BIT_MASK(_n) (BIT(_n) - 1) + +// Math #define swap(_a, _b) ({ typeof(_a) _tmp = (_a); (_a) = (_b); (_b) = (_a); }) #define min(_x, _y) ({ typeof(_x) __x = (_x); typeof(_y) __y = (_y); __x < __y ? __x : __y; }) #define max(_x, _y) ({ typeof(_x) __x = (_x); typeof(_y) __y = (_y); __x > __y ? __x : __y; }) #define ceil(_x, _y) ((((_x) + (_y)) (_y)) * (_y)) #define floor(_x, _y) ((_x) - ((_x) % (_y))) #define dceil(_x, _y) (((_x) + (_y) - 1) / (_y)) + +// Misc #define fence() __asm__ volatile ("":::"memory") /* @@ -74,11 +89,15 @@ typedef signed char int8_t; typedef signed short int16_t; typedef signed int int32_t; typedef signed long int64_t; + typedef uint64_t size_t; typedef int64_t ssize_t; + typedef uint64_t uintptr_t; typedef int64_t intptr_t; +typedef uint64_t offset_t; + /* * Boolean */ diff --git a/kernel/include/system.h b/kernel/include/system.h index d90c649..344c0be 100644 --- a/kernel/include/system.h +++ b/kernel/include/system.h @@ -5,7 +5,73 @@ #include #include -// cpuid +/* + * CPUID + */ +enum { + CPUID_FEAT_ECX_SSE3 = 1 << 0, + CPUID_FEAT_ECX_PCLMUL = 1 << 1, + CPUID_FEAT_ECX_DTES64 = 1 << 2, + CPUID_FEAT_ECX_MONITOR = 1 << 3, + CPUID_FEAT_ECX_DS_CPL = 1 << 4, + CPUID_FEAT_ECX_VMX = 1 << 5, + CPUID_FEAT_ECX_SMX = 1 << 6, + CPUID_FEAT_ECX_EST = 1 << 7, + CPUID_FEAT_ECX_TM2 = 1 << 8, + CPUID_FEAT_ECX_SSSE3 = 1 << 9, + CPUID_FEAT_ECX_CID = 1 << 10, + CPUID_FEAT_ECX_SDBG = 1 << 11, + CPUID_FEAT_ECX_FMA = 1 << 12, + CPUID_FEAT_ECX_CX16 = 1 << 13, + CPUID_FEAT_ECX_XTPR = 1 << 14, + CPUID_FEAT_ECX_PDCM = 1 << 15, + CPUID_FEAT_ECX_PCID = 1 << 17, + CPUID_FEAT_ECX_DCA = 1 << 18, + CPUID_FEAT_ECX_SSE4_1 = 1 << 19, + CPUID_FEAT_ECX_SSE4_2 = 1 << 20, + CPUID_FEAT_ECX_X2APIC = 1 << 21, + CPUID_FEAT_ECX_MOVBE = 1 << 22, + CPUID_FEAT_ECX_POPCNT = 1 << 23, + CPUID_FEAT_ECX_TSC = 1 << 24, + CPUID_FEAT_ECX_AES = 1 << 25, + CPUID_FEAT_ECX_XSAVE = 1 << 26, + CPUID_FEAT_ECX_OSXSAVE = 1 << 27, + CPUID_FEAT_ECX_AVX = 1 << 28, + CPUID_FEAT_ECX_F16C = 1 << 29, + CPUID_FEAT_ECX_RDRAND = 1 << 30, + CPUID_FEAT_ECX_HYPERVISOR = 1 << 31, + + CPUID_FEAT_EDX_FPU = 1 << 0, + CPUID_FEAT_EDX_VME = 1 << 1, + CPUID_FEAT_EDX_DE = 1 << 2, + CPUID_FEAT_EDX_PSE = 1 << 3, + CPUID_FEAT_EDX_TSC = 1 << 4, + CPUID_FEAT_EDX_MSR = 1 << 5, + CPUID_FEAT_EDX_PAE = 1 << 6, + CPUID_FEAT_EDX_MCE = 1 << 7, + CPUID_FEAT_EDX_CX8 = 1 << 8, + CPUID_FEAT_EDX_APIC = 1 << 9, + CPUID_FEAT_EDX_SEP = 1 << 11, + CPUID_FEAT_EDX_MTRR = 1 << 12, + CPUID_FEAT_EDX_PGE = 1 << 13, + CPUID_FEAT_EDX_MCA = 1 << 14, + CPUID_FEAT_EDX_CMOV = 1 << 15, + CPUID_FEAT_EDX_PAT = 1 << 16, + CPUID_FEAT_EDX_PSE36 = 1 << 17, + CPUID_FEAT_EDX_PSN = 1 << 18, + CPUID_FEAT_EDX_CLFLUSH = 1 << 19, + CPUID_FEAT_EDX_DS = 1 << 21, + CPUID_FEAT_EDX_ACPI = 1 << 22, + CPUID_FEAT_EDX_MMX = 1 << 23, + CPUID_FEAT_EDX_FXSR = 1 << 24, + CPUID_FEAT_EDX_SSE = 1 << 25, + CPUID_FEAT_EDX_SSE2 = 1 << 26, + CPUID_FEAT_EDX_SS = 1 << 27, + CPUID_FEAT_EDX_HTT = 1 << 28, + CPUID_FEAT_EDX_TM = 1 << 29, + CPUID_FEAT_EDX_IA64 = 1 << 30, + CPUID_FEAT_EDX_PBE = 1 << 31 +}; void cpuid(uint32_t* eax, uint32_t* ebx, uint32_t* ecx, uint32_t* edx); // Ports diff --git a/kernel/src/kernel.c b/kernel/src/kernel.c index cca5092..b759d5f 100644 --- a/kernel/src/kernel.c +++ b/kernel/src/kernel.c @@ -4,36 +4,40 @@ #include #include #include +#include #include #include #include #include #include -static volatile LIMINE_BASE_REVISION(4); - __noreturn void _start(void) { // Serial console for debugging if (serial_init(COM1) != 0) panic("Failed to initialize Serial driver."); - if (LIMINE_BASE_REVISION_SUPPORTED == false) panic("Unsuported Limine version."); - // Load structures from bootloader if (boot_init() != 0) panic("Failed to parse bootloader structures."); // The most important function in the world. splash(); + // CPUID thingy :p + uint32_t eax = 0; + char s[12]; + cpuid(&eax, (void*)&s[0], (void*)&s[8], (void*)&s[4]); + debugf("[kernel] CPUID_GETVENDORID: %s\n", s); + // System init if (gdt_init() != 0) panic("Failed to initalize GDT."); if (isr_init() != 0) panic("Failed to initalize ISRs."); - if (pag_init() != 0) panic("Failed to initalize Paging."); - // Memory manager init - //if (pmm_init() != 0) panic("Failed to initalize Physical Memory Manager."); + // Memory management + if (pmm_init() != 0) panic("Failed to initalize Physical Memory Manager."); + if (pag_init() != 0) panic("Failed to initalize Paging."); //if (kmalloc_init() != 0) panic("Failed to initialize kernel heap."); + // Tasking //if (timer_init() != 0) panic("Failed to initialize timer."); //if (syscall_init() != 0) panic("Failed to initialize syscalls."); //if (task_init() != 0) panic("Failed to initialize tasking.");