summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/LimineRequests.c45
-rw-r--r--source/LimineRequests.h15
-rw-r--r--source/main.c51
-rw-r--r--source/memory.c48
-rw-r--r--source/memory.h12
5 files changed, 171 insertions, 0 deletions
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 <stdint.h>
+#include <limine.h>
+#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 <stdint.h>
+#include <limine.h>
+
+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 <stddef.h>
+#include <limine.h>
+#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 <stdint.h>
+#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 <stddef.h>
+
+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_
+