From a4eef728064cfc3f14396d0ad91f105f12ef32ea Mon Sep 17 00:00:00 2001 From: Jacob McDonnell Date: Sun, 8 Jun 2025 15:03:33 -0400 Subject: Initial Commit --- source/LimineRequests.c | 45 +++++++++++++++++++++++++++++++++++++++++++ source/LimineRequests.h | 15 +++++++++++++++ source/main.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++ source/memory.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++ source/memory.h | 12 ++++++++++++ 5 files changed, 171 insertions(+) create mode 100644 source/LimineRequests.c create mode 100644 source/LimineRequests.h create mode 100644 source/main.c create mode 100644 source/memory.c create mode 100644 source/memory.h (limited to 'source') diff --git a/source/LimineRequests.c b/source/LimineRequests.c new file mode 100644 index 0000000..a3b9bd5 --- /dev/null +++ b/source/LimineRequests.c @@ -0,0 +1,45 @@ +#include +#include +#include "LimineRequests.h" + +__attribute__((used, section(".limine_requests_start"))) +LIMINE_REQUESTS_START_MARKER + +__attribute__((used, section(".limine_requests"))) +static volatile LIMINE_BASE_REVISION(3) + +bool VerifyBaseRevision(void) { + return (limine_base_revision[2] == 0); +} + +__attribute__((used, section(".limine_requests"))) +struct limine_stack_size_request stackSizeRequest = { + LIMINE_STACK_SIZE_REQUEST, + 0, + nullptr, + //0xFFFF + 0x100000 +}; + +bool VerifyStackSizeRequest(void) { + return ((stackSizeRequest.response != nullptr) && + (stackSizeRequest.response->revision >= stackSizeRequest.revision)); +} + +__attribute__((used, section(".limine_requests"))) +struct limine_framebuffer_request framebufferRequest = { + LIMINE_FRAMEBUFFER_REQUEST, + 0, + nullptr +}; + +bool VerifyFramebufferRequest(void) { + return ((framebufferRequest.response != nullptr) && + (framebufferRequest.response->framebuffer_count > 0) && + (framebufferRequest.response->revision >= + framebufferRequest.revision)); +} + +__attribute__((used, section(".limine_requests_end"))) +LIMINE_REQUESTS_END_MARKER + diff --git a/source/LimineRequests.h b/source/LimineRequests.h new file mode 100644 index 0000000..45da613 --- /dev/null +++ b/source/LimineRequests.h @@ -0,0 +1,15 @@ +#ifndef LIMINEREQUESTS_H_ +#define LIMINEREQUESTS_H_ + +#include +#include + +extern struct limine_stack_size_request stackSizeRequest; +extern struct limine_framebuffer_request framebufferRequest; + +bool VerifyBaseRevision(void); +bool VerifyStackSizeRequest(void); +bool VerifyFramebufferRequest(void); + +#endif // LIMINEREQUESTS_H_ + diff --git a/source/main.c b/source/main.c new file mode 100644 index 0000000..316274f --- /dev/null +++ b/source/main.c @@ -0,0 +1,51 @@ +#include +#include +#include "LimineRequests.h" +#include "memory.h" + +static void HaltForever(void) { + while (true) { + asm("hlt"); + } +} + +void KernelMain(void) { + if (!VerifyBaseRevision()) { + HaltForever(); + } + + if (!VerifyStackSizeRequest()) { + HaltForever(); + } + + if (!VerifyFramebufferRequest()) { + HaltForever(); + } + + const uint64_t framebufferCount = + framebufferRequest.response->framebuffer_count; + + struct limine_framebuffer **framebuffers = + framebufferRequest.response->framebuffers; + + struct limine_framebuffer *framebuffer = nullptr; + + const uint32_t colors[] = {0xFF0000, 0x00FF00, 0x0000FF}; + uint8_t count = 0; + uint8_t color = 0; + + for (uint64_t i = 0; i < framebufferCount; i++) { + framebuffer = framebuffers[i]; + volatile uint32_t *fb_ptr = (volatile uint32_t *)framebuffer->address; + for (uint64_t j = 0; j < framebuffer->height && j < framebuffer->width; + j++) { + fb_ptr[j * (framebuffer->pitch / 4) + j] = colors[color]; + if ((count = (count + 1) % 16) == 0) { + color = (color + 1) % 3; + } + } + } + + HaltForever(); +} + diff --git a/source/memory.c b/source/memory.c new file mode 100644 index 0000000..b9d0405 --- /dev/null +++ b/source/memory.c @@ -0,0 +1,48 @@ +#include +#include "memory.h" + +void *memcpy(void *dest, const void *src, const size_t n) { + uint8_t *destB = (void *)dest; + const uint8_t *srcB = (void *)src; + + for (size_t i = 0; i < n; i++) { + destB[i] = srcB[i]; + } + + return dest; +} + +void *memset(void *s, int c, size_t n) { + uint8_t *sB = (uint8_t *)s; + + for (size_t i = 0; i < n; i++) { + sB[i] = (uint8_t)c; + } + + return s; +} + +void *memmove(void *dest, const void *src, const size_t n) { + uint8_t *db = (uint8_t *)dest; + const uint8_t *sb = (const uint8_t *)src; + + for (size_t i = n; i > 0; i--) { + db[i - 1] = sb[i - 1]; + } + + return dest; +} + +int memcmp(const void *s1, const void *s2, const size_t n) { + const uint8_t *s1b = (const uint8_t *)s1; + const uint8_t *s2b = (const uint8_t *)s2; + + for (size_t i = 0; i < n; i++) { + if (s1b[i] != s2b[i]) { + return ((s1b[i] > s2b[i]) ? 1 : -1); + } + } + + return 0; +} + diff --git a/source/memory.h b/source/memory.h new file mode 100644 index 0000000..0404144 --- /dev/null +++ b/source/memory.h @@ -0,0 +1,12 @@ +#ifndef MEMORY_H_ +#define MEMORY_H_ + +#include + +void *memcpy(void *dest, const void *src, const size_t n); +void *memset(void *s, int c, size_t n); +void *memmove(void *dest, const void *src, const size_t n); +int memcmp(const void *s1, const void *s2, const size_t n); + +#endif // MEMORY_H_ + -- cgit v1.2.3