From f90c075d5061b3a89316d6bf3d5b190d49049ccd Mon Sep 17 00:00:00 2001 From: Brett Weiland Date: Wed, 24 Mar 2021 15:42:20 -0500 Subject: renamed: kernel/include/acpi.h -> include/acpi.h renamed: kernel/include/libc.h -> include/libc.h renamed: kernel/include/paging.h -> include/paging.h renamed: kernel/include/printf.h -> include/printf.h renamed: kernel/include/serial.h -> include/serial.h renamed: kernel/include/video.h -> include/video.h new file: indigo_os renamed: kernel/libs/acpi.c -> kernel/acpi.c renamed: kernel/libs/drivers/serial.c -> kernel/drivers/serial.c renamed: kernel/libs/drivers/video.c -> kernel/drivers/video.c renamed: kernel/libs/libc.c -> kernel/libc.c renamed: kernel/libs/page.c -> kernel/page.c renamed: kernel/libs/printf.c -> kernel/printf.c renamed: kernel/libs/printf.h -> kernel/printf.h modified: makefile --- src/include/acpi.h | 39 +++++++++++++++++ src/include/libc.h | 12 ++++++ src/include/paging.h | 71 +++++++++++++++++++++++++++++++ src/include/printf.h | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/include/serial.h | 16 +++++++ src/include/video.h | 51 ++++++++++++++++++++++ 6 files changed, 306 insertions(+) create mode 100644 src/include/acpi.h create mode 100644 src/include/libc.h create mode 100644 src/include/paging.h create mode 100644 src/include/printf.h create mode 100644 src/include/serial.h create mode 100644 src/include/video.h (limited to 'src/include') 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 +#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/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 + +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 +//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 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 +#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/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 +#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 +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; -- cgit v1.2.3