summaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
Diffstat (limited to 'src/include')
-rw-r--r--src/include/acpi.h39
-rw-r--r--src/include/libc.h12
-rw-r--r--src/include/paging.h71
-rw-r--r--src/include/printf.h117
-rw-r--r--src/include/serial.h16
-rw-r--r--src/include/video.h51
6 files changed, 306 insertions, 0 deletions
diff --git a/src/include/acpi.h b/src/include/acpi.h
new file mode 100644
index 0000000..c15e044
--- /dev/null
+++ b/src/include/acpi.h
@@ -0,0 +1,39 @@
+#include <stdint.h>
+#include <libc.h>
+
+struct rsdp_v1 {
+ char sig[8];
+ uint8_t checksum;
+ char OEMID[6];
+ uint8_t version;
+ uint32_t rsdt_addr;
+
+} __attribute__((packed));
+
+struct rsdp_v2 {
+ struct rsdp_v1 v1;
+ uint32_t len;
+ uint64_t xsdt_addr;
+ uint8_t extended_checksum;
+ uint8_t reserved[3];
+} __attribute__((packed));
+
+
+typedef union rsdp_t {
+ struct rsdp_v1 v1;
+ struct rsdp_v2 v2;
+} rsdp_t;
+
+struct acpi_header {
+ char sig[4];
+ uint32_t length;
+ uint8_t revision;
+ uint8_t checksum;
+ char OEMID[6];
+ char OEMTableID[8];
+ uint32_t OEMRevision;
+ uint32_t creator_id;
+ uint32_t creator_revision;
+} __attribute__((packed));
+
+rsdp_t *find_RSDP();
diff --git a/src/include/libc.h b/src/include/libc.h
new file mode 100644
index 0000000..cdf6dbc
--- /dev/null
+++ b/src/include/libc.h
@@ -0,0 +1,12 @@
+#ifndef _STRING_H_
+#define _STRING_H_
+#include <stddef.h>
+
+int strcmp(const char *str1, const char *str2);
+int strncmp(const char *str1, const char *str2, size_t n);
+void strcpy(char *dest, char *src);
+void memcpy(void *dest, void *src, size_t n); //TODO
+int memcmp(const void *s1, const void *s2, size_t n);
+void bzero(const void *dest, size_t size);
+int ceil(float n1);
+#endif
diff --git a/src/include/paging.h b/src/include/paging.h
new file mode 100644
index 0000000..267da43
--- /dev/null
+++ b/src/include/paging.h
@@ -0,0 +1,71 @@
+#include <stdbool.h>
+//paging errors
+#define PAGEMAP_LOCATION 0x4000
+#ifndef _PAGE_H_
+#define _PAGE_H_
+#include <stdint.h>
+
+#define PAGE_VIRT_UNALIGNED 0x01
+#define PAGE_PHYS_UNALIGNED 0x02
+#define PAGE_PHYS_INVALID 0x03
+#define PAGE_VIRT_INVALID 0x04
+
+//*
+typedef struct __attribute__((packed)) {
+ unsigned int present : 1; // present, must be one when accessed.
+ unsigned int read_write : 1; // if set to one, read and write is set
+ unsigned int user : 1; // another bit we'll never use, for seperating CPL 0-2 and 3+
+ unsigned int writethrough_cache : 1; // honestly maybe I should look into caching
+ unsigned int cachable : 1; // hardware chaching. 0 is enabled, whats the worst that could happen?
+ unsigned int accessed : 1; // we'll never use any of these!
+ unsigned int zg0 : 1; // needs to be (and will be) zero'd
+ unsigned int size : 1;
+ unsigned int zg1 : 1; // needs to be (and will be) zero'd
+ unsigned int software_marks : 3; // available for our own use, I doubt we'll use it in such a simple thing
+
+ uintptr_t base_ptr : 40;
+ unsigned int sign:11;
+} page_entry;
+
+
+typedef struct __attribute__((packed)) {
+ page_entry pml4e[512];
+ page_entry pdpe[512];
+ page_entry pde[512];
+ page_entry pte[512];
+} page_table;
+
+#define MEM_AVAILABLE 1
+#define MEM_RESERVED 2
+#define MEM_APCI_RECLAIMABLE 3
+#define MEM_APCI_NVS 4
+#define MEM_BAD 5
+
+#define PAGE_SIZE_4K 12
+#define PAGE_SIZE_2M 21
+#define PAGE_SIZE_1G 30
+
+struct memory_table {
+ uint64_t base;
+ uint64_t length;
+ uint32_t type;
+ uint32_t ACPI;
+} __attribute__((packed));
+
+struct phys_map {
+ uint64_t map_size; //this way we won't have to calculate it every time
+ void *chunk_start;
+ uint64_t chunk_size;
+ uint64_t *buddies;
+} __attribute__((packed));
+
+
+extern void* _meminfo_loc;
+extern void* _stage2_pagetable;
+
+bool map_page(void *virtual_addr, void *physical_addr, uint8_t PAGE_SIZE);
+void debug_print_memory();
+void create_pagetable_stage2(uint64_t free_mem);
+void init_memory();
+#endif
+
diff --git a/src/include/printf.h b/src/include/printf.h
new file mode 100644
index 0000000..6104ccf
--- /dev/null
+++ b/src/include/printf.h
@@ -0,0 +1,117 @@
+///////////////////////////////////////////////////////////////////////////////
+// \author (c) Marco Paland (info@paland.com)
+// 2014-2019, PALANDesign Hannover, Germany
+//
+// \license The MIT License (MIT)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+// \brief Tiny printf, sprintf and snprintf implementation, optimized for speed on
+// embedded systems with a very limited resources.
+// Use this instead of bloated standard/newlib printf.
+// These routines are thread safe and reentrant.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef _PRINTF_H_
+#define _PRINTF_H_
+
+#include <stdarg.h>
+#include <stddef.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * Output a character to a custom device like UART, used by the printf() function
+ * This function is declared here only. You have to write your custom implementation somewhere
+ * \param character Character to output
+ */
+void _putchar(char character);
+
+
+/**
+ * Tiny printf implementation
+ * You have to implement _putchar if you use printf()
+ * To avoid conflicts with the regular printf() API it is overridden by macro defines
+ * and internal underscore-appended functions like printf_() are used
+ * \param format A string that specifies the format of the output
+ * \return The number of characters that are written into the array, not counting the terminating null character
+ */
+#define printf printf_
+int printf_(const char* format, ...);
+
+
+/**
+ * Tiny sprintf implementation
+ * Due to security reasons (buffer overflow) YOU SHOULD CONSIDER USING (V)SNPRINTF INSTEAD!
+ * \param buffer A pointer to the buffer where to store the formatted string. MUST be big enough to store the output!
+ * \param format A string that specifies the format of the output
+ * \return The number of characters that are WRITTEN into the buffer, not counting the terminating null character
+ */
+#define sprintf sprintf_
+int sprintf_(char* buffer, const char* format, ...);
+
+
+/**
+ * Tiny snprintf/vsnprintf implementation
+ * \param buffer A pointer to the buffer where to store the formatted string
+ * \param count The maximum number of characters to store in the buffer, including a terminating null character
+ * \param format A string that specifies the format of the output
+ * \param va A value identifying a variable arguments list
+ * \return The number of characters that COULD have been written into the buffer, not counting the terminating
+ * null character. A value equal or larger than count indicates truncation. Only when the returned value
+ * is non-negative and less than count, the string has been completely written.
+ */
+#define snprintf snprintf_
+#define vsnprintf vsnprintf_
+int snprintf_(char* buffer, size_t count, const char* format, ...);
+int vsnprintf_(char* buffer, size_t count, const char* format, va_list va);
+
+
+/**
+ * Tiny vprintf implementation
+ * \param format A string that specifies the format of the output
+ * \param va A value identifying a variable arguments list
+ * \return The number of characters that are WRITTEN into the buffer, not counting the terminating null character
+ */
+#define vprintf vprintf_
+int vprintf_(const char* format, va_list va);
+
+
+/**
+ * printf with output function
+ * You may use this as dynamic alternative to printf() with its fixed _putchar() output
+ * \param out An output function which takes one character and an argument pointer
+ * \param arg An argument pointer for user data passed to output function
+ * \param format A string that specifies the format of the output
+ * \return The number of characters that are sent to the output function, not counting the terminating null character
+ */
+int fctprintf(void (*out)(char character, void* arg), void* arg, const char* format, ...);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif // _PRINTF_H_
diff --git a/src/include/serial.h b/src/include/serial.h
new file mode 100644
index 0000000..824e245
--- /dev/null
+++ b/src/include/serial.h
@@ -0,0 +1,16 @@
+//these com values are just guesses! Figure out how to find em later if you want
+#ifndef _SERIAL_H_
+#define _SERIAL_H_
+
+#include <stdint.h>
+#define COM1 0x3f8
+#define COM2 0x2f8
+#define COM3 0x3e8
+#define COM4 0x2e8
+
+
+int init_serial(uint16_t port);
+void serial_out(uint16_t port, char *string);
+void _putchar_serial(uint16_t port, char character);
+
+#endif
diff --git a/src/include/video.h b/src/include/video.h
new file mode 100644
index 0000000..82d3423
--- /dev/null
+++ b/src/include/video.h
@@ -0,0 +1,51 @@
+#include <stdint.h>
+void dump_video();
+
+//this struct was stolen from wiki.osdev.org
+struct mode_info {
+ uint16_t attributes;
+ uint8_t window_a;
+ uint8_t window_b;
+ uint16_t granularity;
+ uint16_t window_size;
+ uint16_t segment_a;
+ uint16_t segment_b;
+ uint32_t win_func_ptr;
+ uint16_t pitch;
+ uint16_t width;
+ uint16_t height;
+ uint8_t w_char;
+ uint8_t y_char;
+ uint8_t planes;
+ uint8_t bpp;
+ uint8_t banks;
+ uint8_t memory_model;
+ uint8_t bank_size;
+ uint8_t image_pages;
+ uint8_t reserved0;
+ uint8_t red_mask;
+ uint8_t red_position;
+ uint8_t green_mask;
+ uint8_t green_position;
+ uint8_t blue_mask;
+ uint8_t blue_position;
+ uint8_t reserved_mask;
+ uint8_t reserved_position;
+ uint8_t direct_color_attributes;
+
+ uint32_t framebuffer;
+ uint32_t off_screen_mem_off;
+ uint16_t off_screen_mem_size;
+ uint8_t reserved1[206];
+} __attribute__((packed));
+
+struct vbe_infoblock {
+ char vbe_signature[4];
+ uint16_t vbe_version;
+ uint16_t oem_ptr[2];
+ uint8_t capabilities[4];
+ uint32_t videomodeptr;
+ uint16_t total_memory;
+} __attribute__((packed));
+
+extern void *_vbe_infoblock;