diff options
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/acpi.h | 39 | ||||
-rw-r--r-- | src/include/libc.h | 12 | ||||
-rw-r--r-- | src/include/paging.h | 71 | ||||
-rw-r--r-- | src/include/printf.h | 117 | ||||
-rw-r--r-- | src/include/serial.h | 16 | ||||
-rw-r--r-- | src/include/video.h | 51 |
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; |