diff options
author | Marvin Borner | 2020-07-30 16:15:39 +0200 |
---|---|---|
committer | Marvin Borner | 2020-07-30 16:15:54 +0200 |
commit | 46fb7dcf479ac85361d8eaae5af3ea27a6b93a2d (patch) | |
tree | b71cc5056914c6709cef18022e8da9b243323998 /apps | |
parent | f092bf03baf3b2c13c9dc462bdc697caddccd347 (diff) |
Something something with elfs and witches
Diffstat (limited to 'apps')
-rw-r--r-- | apps/link.ld | 24 | ||||
-rw-r--r-- | apps/test.c | 88 |
2 files changed, 112 insertions, 0 deletions
diff --git a/apps/link.ld b/apps/link.ld new file mode 100644 index 0000000..ee41578 --- /dev/null +++ b/apps/link.ld @@ -0,0 +1,24 @@ +ENTRY(main) +SECTIONS +{ + .text 0x40000000: + { + code = .; _code = .; __code = .; + *(.text) + } + + .data ALIGN(0x400000): + { + data = .; _data = .; __data = .; + *(.data) + *(.rodata) + } + + .bss ALIGN(0x400000): + { + bss = .; _bss = .; __bss = .; + *(.bss) + } + + end = .; _end = .; __end = .; +} diff --git a/apps/test.c b/apps/test.c new file mode 100644 index 0000000..f9e40cb --- /dev/null +++ b/apps/test.c @@ -0,0 +1,88 @@ +#include <def.h> + +u32 strlen(const char *s) +{ + const char *ss = s; + while (*ss) + ss++; + return ss - s; +} + +u8 inb(u16 port) +{ + u8 value; + __asm__ volatile("inb %1, %0" : "=a"(value) : "Nd"(port)); + return value; +} + +u16 inw(u16 port) +{ + u16 value; + __asm__ volatile("inw %1, %0" : "=a"(value) : "Nd"(port)); + return value; +} + +u32 inl(u16 port) +{ + u32 value; + __asm__ volatile("inl %1, %0" : "=a"(value) : "Nd"(port)); + return value; +} + +void insl(u16 port, void *addr, int n) +{ + __asm__ volatile("cld; rep insl" + : "=D"(addr), "=c"(n) + : "d"(port), "0"(addr), "1"(n) + : "memory", "cc"); +} + +void outb(u16 port, u8 data) +{ + __asm__ volatile("outb %0, %1" ::"a"(data), "Nd"(port)); +} + +void outw(u16 port, u16 data) +{ + __asm__ volatile("outw %0, %1" ::"a"(data), "Nd"(port)); +} + +void outl(u16 port, u32 data) +{ + __asm__ volatile("outl %0, %1" ::"a"(data), "Nd"(port)); +} + +void serial_install() +{ + outb(0x3f8 + 1, 0x00); + outb(0x3f8 + 3, 0x80); + outb(0x3f8 + 0, 0x03); + outb(0x3f8 + 1, 0x00); + outb(0x3f8 + 3, 0x03); + outb(0x3f8 + 2, 0xC7); + outb(0x3f8 + 4, 0x0B); +} + +int is_transmit_empty() +{ + return inb(0x3f8 + 5) & 0x20; +} + +void serial_put(char ch) +{ + while (is_transmit_empty() == 0) + ; + outb(0x3f8, (u8)ch); +} + +void serial_print(const char *data) +{ + for (u32 i = 0; i < strlen(data); i++) + serial_put(data[i]); +} + +void main() +{ + serial_install(); + serial_print("WELCOME TO USERSPACE"); +} |