forked from PoliEcho-holding-org/kern
Minor changes
* Added CPUID thing * Reworked some kernel.h macros and definitions
This commit is contained in:
+23
-4
@@ -29,22 +29,37 @@ typedef __builtin_va_list va_list;
|
|||||||
/*
|
/*
|
||||||
* Utility macros
|
* Utility macros
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// Assertions
|
||||||
#define STATIC_ASSERT(_cond, _msg)\
|
#define STATIC_ASSERT(_cond, _msg)\
|
||||||
typedef int static_assert_##_msg[(_cond) ? 1 : -1]
|
typedef int static_assert_##_msg[(_cond) ? 1 : -1]
|
||||||
|
|
||||||
|
// Array
|
||||||
#define ARRAY_SIZE(_a) (sizeof((_a)) / sizeof((_a)[0]))
|
#define ARRAY_SIZE(_a) (sizeof((_a)) / sizeof((_a)[0]))
|
||||||
#define BIT(_n) (1UL << (_n))
|
#define array_sizeof ARRAY_SIZE
|
||||||
#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 container_of(_p, _t, _m) \
|
#define container_of(_p, _t, _m) \
|
||||||
((_t*)((char*)(_p) - offsetof(_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 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 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 max(_x, _y) ({ typeof(_x) __x = (_x); typeof(_y) __y = (_y); __x > __y ? __x : __y; })
|
||||||
#define ceil(_x, _y) ((((_x) + (_y)) (_y)) * (_y))
|
#define ceil(_x, _y) ((((_x) + (_y)) (_y)) * (_y))
|
||||||
#define floor(_x, _y) ((_x) - ((_x) % (_y)))
|
#define floor(_x, _y) ((_x) - ((_x) % (_y)))
|
||||||
#define dceil(_x, _y) (((_x) + (_y) - 1) / (_y))
|
#define dceil(_x, _y) (((_x) + (_y) - 1) / (_y))
|
||||||
|
|
||||||
|
// Misc
|
||||||
#define fence() __asm__ volatile ("":::"memory")
|
#define fence() __asm__ volatile ("":::"memory")
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -74,11 +89,15 @@ typedef signed char int8_t;
|
|||||||
typedef signed short int16_t;
|
typedef signed short int16_t;
|
||||||
typedef signed int int32_t;
|
typedef signed int int32_t;
|
||||||
typedef signed long int64_t;
|
typedef signed long int64_t;
|
||||||
|
|
||||||
typedef uint64_t size_t;
|
typedef uint64_t size_t;
|
||||||
typedef int64_t ssize_t;
|
typedef int64_t ssize_t;
|
||||||
|
|
||||||
typedef uint64_t uintptr_t;
|
typedef uint64_t uintptr_t;
|
||||||
typedef int64_t intptr_t;
|
typedef int64_t intptr_t;
|
||||||
|
|
||||||
|
typedef uint64_t offset_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Boolean
|
* Boolean
|
||||||
*/
|
*/
|
||||||
|
|||||||
+67
-1
@@ -5,7 +5,73 @@
|
|||||||
#include <gdt.h>
|
#include <gdt.h>
|
||||||
#include <idt.h>
|
#include <idt.h>
|
||||||
|
|
||||||
// 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);
|
void cpuid(uint32_t* eax, uint32_t* ebx, uint32_t* ecx, uint32_t* edx);
|
||||||
|
|
||||||
// Ports
|
// Ports
|
||||||
|
|||||||
+11
-7
@@ -4,36 +4,40 @@
|
|||||||
#include <paging.h>
|
#include <paging.h>
|
||||||
#include <serial.h>
|
#include <serial.h>
|
||||||
#include <splash.h>
|
#include <splash.h>
|
||||||
|
#include <system.h>
|
||||||
#include <timer.h>
|
#include <timer.h>
|
||||||
#include <gdt.h>
|
#include <gdt.h>
|
||||||
#include <idt.h>
|
#include <idt.h>
|
||||||
#include <isr.h>
|
#include <isr.h>
|
||||||
#include <pmm.h>
|
#include <pmm.h>
|
||||||
|
|
||||||
static volatile LIMINE_BASE_REVISION(4);
|
|
||||||
|
|
||||||
__noreturn
|
__noreturn
|
||||||
void _start(void) {
|
void _start(void) {
|
||||||
// Serial console for debugging
|
// Serial console for debugging
|
||||||
if (serial_init(COM1) != 0) panic("Failed to initialize Serial driver.");
|
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
|
// Load structures from bootloader
|
||||||
if (boot_init() != 0) panic("Failed to parse bootloader structures.");
|
if (boot_init() != 0) panic("Failed to parse bootloader structures.");
|
||||||
|
|
||||||
// The most important function in the world.
|
// The most important function in the world.
|
||||||
splash();
|
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
|
// System init
|
||||||
if (gdt_init() != 0) panic("Failed to initalize GDT.");
|
if (gdt_init() != 0) panic("Failed to initalize GDT.");
|
||||||
if (isr_init() != 0) panic("Failed to initalize ISRs.");
|
if (isr_init() != 0) panic("Failed to initalize ISRs.");
|
||||||
if (pag_init() != 0) panic("Failed to initalize Paging.");
|
|
||||||
|
|
||||||
// Memory manager init
|
// Memory management
|
||||||
//if (pmm_init() != 0) panic("Failed to initalize Physical Memory Manager.");
|
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.");
|
//if (kmalloc_init() != 0) panic("Failed to initialize kernel heap.");
|
||||||
|
|
||||||
|
// Tasking
|
||||||
//if (timer_init() != 0) panic("Failed to initialize timer.");
|
//if (timer_init() != 0) panic("Failed to initialize timer.");
|
||||||
//if (syscall_init() != 0) panic("Failed to initialize syscalls.");
|
//if (syscall_init() != 0) panic("Failed to initialize syscalls.");
|
||||||
//if (task_init() != 0) panic("Failed to initialize tasking.");
|
//if (task_init() != 0) panic("Failed to initialize tasking.");
|
||||||
|
|||||||
Reference in New Issue
Block a user