From 66289aa8ecfa07b20bad424eb9860b196641ef52 Mon Sep 17 00:00:00 2001 From: Brett Weiland Date: Fri, 19 Mar 2021 10:54:25 -0500 Subject: first commit --- src/kernel/include/acpi.h | 39 +++++++++++++++ src/kernel/include/libc.h | 10 ++++ src/kernel/include/paging.h | 60 +++++++++++++++++++++++ src/kernel/include/printf.h | 117 ++++++++++++++++++++++++++++++++++++++++++++ src/kernel/include/serial.h | 16 ++++++ src/kernel/include/video.h | 49 +++++++++++++++++++ 6 files changed, 291 insertions(+) create mode 100644 src/kernel/include/acpi.h create mode 100644 src/kernel/include/libc.h create mode 100644 src/kernel/include/paging.h create mode 100644 src/kernel/include/printf.h create mode 100644 src/kernel/include/serial.h create mode 100644 src/kernel/include/video.h (limited to 'src/kernel/include') diff --git a/src/kernel/include/acpi.h b/src/kernel/include/acpi.h new file mode 100644 index 0000000..c15e044 --- /dev/null +++ b/src/kernel/include/acpi.h @@ -0,0 +1,39 @@ +#include +#include + +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/kernel/include/libc.h b/src/kernel/include/libc.h new file mode 100644 index 0000000..7e837ae --- /dev/null +++ b/src/kernel/include/libc.h @@ -0,0 +1,10 @@ +#ifndef _STRING_H_ +#define _STRING_H_ +#include + +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); +#endif diff --git a/src/kernel/include/paging.h b/src/kernel/include/paging.h new file mode 100644 index 0000000..3b89af9 --- /dev/null +++ b/src/kernel/include/paging.h @@ -0,0 +1,60 @@ +#include +//paging errors +#define PAGEMAP_LOCATION 0x4000 +#ifndef _PAGE_H_ +#define _PAGE_H_ +#include + +#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 available: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 0 +#define MEM_RESERVED 1 +#define MEM_APCI_RECLAIMABLE 2 +#define MEM_APCI_NVS 3 +#define MEM_BAD 4 + +#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; //we'll never use this +} __attribute__((packed)); + + +extern void* _meminfo_loc; + +bool map_page(uintptr_t virtual_addr, uintptr_t physical_addr, uint8_t PAGE_SIZE); +void debug_print_memory(); +#endif diff --git a/src/kernel/include/printf.h b/src/kernel/include/printf.h new file mode 100644 index 0000000..6104ccf --- /dev/null +++ b/src/kernel/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 +#include + + +#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/kernel/include/serial.h b/src/kernel/include/serial.h new file mode 100644 index 0000000..824e245 --- /dev/null +++ b/src/kernel/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 +#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/kernel/include/video.h b/src/kernel/include/video.h new file mode 100644 index 0000000..6f702b1 --- /dev/null +++ b/src/kernel/include/video.h @@ -0,0 +1,49 @@ +#include +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)); -- cgit v1.2.3