aboutsummaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/link.ld24
-rw-r--r--apps/test.c88
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");
+}