diff --git a/samples/C/bitmap.h b/samples/C/bitmap.h
new file mode 100644
index 00000000..30ab99ea
--- /dev/null
+++ b/samples/C/bitmap.h
@@ -0,0 +1,47 @@
+#pragma once
+
+/* Copyright © 2010 Christoph Sünderhauf
+ *
+ * This file is part of Xelix.
+ *
+ * Xelix is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xelix is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Xelix. If not, see .
+ */
+
+#include "generic.h"
+
+typedef struct {
+ uint32_t numbits;
+ /* an array large enough for numbits to fit in. Might
+ * (if numbits%8!=0) have some spare bits at the end
+ */
+ uint32_t* bits;
+} bitmap_t;
+
+
+// creates a new bitmap.
+// CONTENT IS RANDOM! - use bitmap_clearall() to clear the bitmap.
+bitmap_t bitmap_init(uint32_t numbits);
+
+// returns 1 or 0
+uint8_t bitmap_get(bitmap_t bitmap, uint32_t bitnum);
+// sets a bit (to 1)
+void bitmap_set(bitmap_t bitmap, uint32_t bitnum);
+// clears a bit (to 0)
+void bitmap_clear(bitmap_t bitmap, uint32_t bitnum);
+
+// clears every bit to 0
+void bitmap_clearAll(bitmap_t bitmap);
+
+// finds the first bit set to 0 returns 0 if no cleared bit found (0 is also returned if the first bit is cleared)
+uint32_t bitmap_findFirstClear(bitmap_t bitmap);
diff --git a/samples/C/color.h b/samples/C/color.h
new file mode 100644
index 00000000..5c60b480
--- /dev/null
+++ b/samples/C/color.h
@@ -0,0 +1,44 @@
+#pragma once
+
+/* Copyright © 2011 Fritz Grimpen
+ *
+ * This file is part of Xelix.
+ *
+ * Xelix is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xelix is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Xelix. If not, see .
+ */
+
+#include
+
+typedef struct {
+ uint32_t background;
+ uint32_t foreground;
+} console_color_t;
+
+#define CONSOLE_COLOR_BLACK 0x0
+#define CONSOLE_COLOR_BLUE 0x1
+#define CONSOLE_COLOR_GREEN 0x2
+#define CONSOLE_COLOR_CYAN 0x3
+#define CONSOLE_COLOR_RED 0x4
+#define CONSOLE_COLOR_MAGENTA 0x5
+#define CONSOLE_COLOR_BROWN 0x6
+#define CONSOLE_COLOR_LGREY 0x7
+#define CONSOLE_COLOR_DGREY 0x8
+#define CONSOLE_COLOR_LBLUE 0x9
+#define CONSOLE_COLOR_LGREEN 0xa
+#define CONSOLE_COLOR_LCYAN 0xb
+#define CONSOLE_COLOR_LRED 0xc
+#define CONSOLE_COLOR_LMAGENTA 0xd
+#define CONSOLE_COLOR_YELLOW 0xe
+#define CONSOLE_COLOR_WHITE 0xf
+
diff --git a/samples/C/driver.h b/samples/C/driver.h
new file mode 100644
index 00000000..e376c97d
--- /dev/null
+++ b/samples/C/driver.h
@@ -0,0 +1,52 @@
+#pragma once
+
+/* Copyright © 2011 Fritz Grimpen
+ *
+ * This file is part of Xelix.
+ *
+ * Xelix is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xelix is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Xelix. If not, see .
+ */
+
+#include
+#include
+
+#define CONSOLE_DRV_CAP_CLEAR 0x01
+#define CONSOLE_DRV_CAP_SCROLL 0x02
+#define CONSOLE_DRV_CAP_SET_CURSOR 0x04
+
+// Input modifier keys
+typedef struct {
+ bool shift_left:1;
+ bool shift_right:1;
+ bool control_left:1;
+ bool control_right:1;
+ bool alt:1;
+ bool super:1;
+} console_modifiers_t;
+
+typedef struct {
+ char character;
+ console_modifiers_t* modifiers;
+} console_read_t;
+
+typedef struct {
+ int (*write)(console_info_t*, char);
+ console_read_t* (*read)(console_info_t*);
+
+ int capabilities;
+
+ int (*_clear)(console_info_t*);
+ int (*scroll)(console_info_t*, int32_t);
+ void (*setCursor)(console_info_t*, uint32_t, uint32_t);
+} console_driver_t;
diff --git a/samples/C/elf.h b/samples/C/elf.h
new file mode 100644
index 00000000..a270eb14
--- /dev/null
+++ b/samples/C/elf.h
@@ -0,0 +1,70 @@
+#pragma once
+
+/* Copyright © 2011 Lukas Martini
+ *
+ * This file is part of Xelix.
+ *
+ * Xelix is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xelix is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Xelix. If not, see .
+ */
+
+#include
+#include
+
+#define ELF_TYPE_NONE 0
+#define ELF_TYPE_REL 1
+#define ELF_TYPE_EXEC 2
+#define ELF_TYPE_DYN 3
+#define ELF_TYPE_CORE 4
+
+#define ELF_ARCH_NONE 0
+#define ELF_ARCH_386 3
+
+#define ELF_VERSION_CURRENT 1
+
+typedef struct {
+ unsigned char magic[4];
+ /* Note: There _is_ other stuff in here, but we don't need it */
+ unsigned char pad[12];
+} __attribute__((packed)) elf_ident_t;
+
+typedef struct {
+ uint32_t type;
+ uint32_t offset;
+ void* virtaddr;
+ void* physaddr;
+ uint32_t filesize;
+ uint32_t memsize;
+ uint32_t flags;
+ uint32_t alignment;
+} __attribute__((packed)) elf_program_t;
+
+typedef struct {
+ elf_ident_t ident;
+ uint16_t type; /* Object file type */
+ uint16_t machine; /* Architecture */
+ uint32_t version; /* Object file version */
+ void* entry; /* Entry point virtual address */
+ uint32_t phoff; /* Program header table file offset */
+ uint32_t shoff; /* Section header table file offset */
+ uint32_t flags; /* Processor-specific flags */
+ uint16_t ehsize; /* ELF header size in bytes */
+ uint16_t phentsize; /* Program header table entry size */
+ uint16_t phnum; /* Program header table entry count */
+ uint16_t shentsize; /* Section header table entry size */
+ uint16_t shnum; /* Section header table entry count */
+ uint16_t shstrndx; /* Section header string table index */
+} __attribute__((packed)) elf_t;
+
+task_t* elf_load(elf_t* bin, char* name, char** environ, char** argv, int argc);
+task_t* elf_load_file(char* path, char** environ, char** argv, int argc);
diff --git a/samples/C/filter.h b/samples/C/filter.h
new file mode 100644
index 00000000..a1a13c9f
--- /dev/null
+++ b/samples/C/filter.h
@@ -0,0 +1,45 @@
+#pragma once
+
+/* Copyright © 2011 Fritz Grimpen
+ *
+ * This file is part of Xelix.
+ *
+ * Xelix is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xelix is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Xelix. If not, see .
+ */
+
+#include
+#include
+#include
+
+struct console_filter {
+ // General callback for all actions etc.
+ // Preferred prototype:
+ // char (char c, console_info_t *info, console_driver_t *input, console_driver_t *output);
+ char (*callback)(char, console_info_t*, console_driver_t*, console_driver_t*);
+
+ // Specific callbacks for read and write
+ // Preferred prototype:
+ // char (char c, console_info_t *info, console_driver_t *input);
+ char (*read_callback)(char, console_info_t*, console_driver_t*);
+
+ // Preferred prototype:
+ // char (char c, console_info_t *info, console_driver_t *output);
+ char (*write_callback)(char, console_info_t*, console_driver_t*);
+
+ // The next filter in the filter chain
+ struct console_filter* next;
+};
+
+typedef struct console_filter console_filter_t;
+
diff --git a/samples/C/info.h b/samples/C/info.h
new file mode 100644
index 00000000..50be7b69
--- /dev/null
+++ b/samples/C/info.h
@@ -0,0 +1,44 @@
+#pragma once
+
+/* Copyright © 2011 Fritz Grimpen
+ *
+ * This file is part of Xelix.
+ *
+ * Xelix is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xelix is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Xelix. If not, see .
+ */
+
+#include
+#include
+
+typedef struct {
+ uint32_t cursor_x;
+ uint32_t cursor_y;
+
+ uint32_t rows;
+ uint32_t columns;
+
+ uint32_t tabstop;
+
+ console_color_t default_color;
+ console_color_t current_color;
+
+ uint8_t nonblocking;
+ uint8_t reverse_video;
+ uint8_t bold;
+ uint8_t blink;
+ uint8_t underline;
+ uint8_t newline_mode;
+ uint8_t auto_echo;
+ uint8_t handle_backspace;
+} console_info_t;
diff --git a/samples/C/interface.h b/samples/C/interface.h
new file mode 100644
index 00000000..2c3bfeff
--- /dev/null
+++ b/samples/C/interface.h
@@ -0,0 +1,47 @@
+#pragma once
+
+/* Copyright © 2011 Fritz Grimpen
+ *
+ * This file is part of Xelix.
+ *
+ * Xelix is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xelix is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Xelix. If not, see .
+ */
+
+#include
+#include
+#include
+#include
+
+typedef struct {
+ console_info_t info;
+
+ console_filter_t* input_filter;
+ console_filter_t* output_filter;
+
+ console_driver_t* input_driver;
+ console_driver_t* output_driver;
+} console_t;
+
+console_t* default_console;
+
+// Generate raw console, connected to the Display, Keyboard and the
+// ECMA-48-Filter
+void console_init();
+
+size_t console_write(console_t* console, const char* buffer, int32_t length);
+#define console_write2(console, buffer) console_write(console, buffer, strlen(buffer))
+size_t console_read(console_t* console, char* buffer, size_t length);
+size_t console_scroll(console_t* console, int32_t pages);
+
+void console_clear(console_t* console);
diff --git a/samples/C/ip4.h b/samples/C/ip4.h
new file mode 100644
index 00000000..b2c8a2a8
--- /dev/null
+++ b/samples/C/ip4.h
@@ -0,0 +1,50 @@
+#pragma once
+
+/* Copyright © 2011 Lukas Martini
+ *
+ * This file is part of Xelix.
+ *
+ * Xelix is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xelix is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Xelix. If not, see .
+ */
+
+#include
+#include
+
+#define IP4_TOS_ICMP 0
+
+typedef uint32_t ip4_addr_t;
+
+typedef struct {
+ unsigned int hl:4; /* both fields are 4 bits */
+ unsigned int version:4;
+ uint8_t tos;
+ uint16_t len;
+ uint16_t id;
+ uint16_t off;
+ uint8_t ttl;
+ uint8_t p;
+ uint16_t checksum;
+ ip4_addr_t src;
+ ip4_addr_t dst;
+} ip4_header_t;
+
+typedef struct {
+ uint8_t type;
+ uint8_t code;
+ uint16_t checksum;
+ uint16_t id;
+ uint16_t sequence;
+} ip4_icmp_header_t;
+
+void ip4_receive(net_device_t* origin, net_l2proto_t proto, size_t size, void* raw);
diff --git a/samples/C/multiboot.h b/samples/C/multiboot.h
new file mode 100644
index 00000000..fcbc13e1
--- /dev/null
+++ b/samples/C/multiboot.h
@@ -0,0 +1,110 @@
+#pragma once
+
+/* Copyright © 2010, 2011 Lukas Martini
+ *
+ * This file is part of Xelix.
+ *
+ * Xelix is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xelix is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Xelix. If not, see .
+ */
+
+#include
+
+#define MULTIBOOT_KERNELMAGIC 0x2BADB002
+
+#define MULTIBOOT_FLAG_MEM 0x001
+#define MULTIBOOT_FLAG_DEVICE 0x002
+#define MULTIBOOT_FLAG_CMDLINE 0x004
+#define MULTIBOOT_FLAG_MODS 0x008
+#define MULTIBOOT_FLAG_AOUT 0x010
+#define MULTIBOOT_FLAG_ELF 0x020
+#define MULTIBOOT_FLAG_MMAP 0x040
+#define MULTIBOOT_FLAG_CONFIG 0x080
+#define MULTIBOOT_FLAG_LOADER 0x100
+#define MULTIBOOT_FLAG_APM 0x200
+#define MULTIBOOT_FLAG_VBE 0x400
+
+// The symbol table for a.out.
+typedef struct
+{
+ uint32_t tabSize;
+ uint32_t strSize;
+ uint32_t addr;
+ uint32_t reserved;
+} __attribute__((packed)) multiboot_aoutSymbolTable_t;
+
+// The section header table for ELF.
+typedef struct
+{
+ uint32_t num;
+ uint32_t size;
+ uint32_t addr;
+ uint32_t shndx;
+} __attribute__((packed)) multiboot_elfSectionHeaderTable_t;
+
+typedef struct
+{
+ uint32_t size;
+ uint64_t addr;
+ uint64_t length;
+ uint32_t type;
+} __attribute__((packed)) multiboot_memoryMap_t;
+
+typedef struct
+{
+ uint32_t start;
+ uint32_t end;
+ char* cmdLine;
+ uint32_t reserved;
+} __attribute__((packed)) multiboot_module_t;
+
+typedef struct
+{
+ uint32_t flags;
+ uint32_t memLower;
+ uint32_t memUpper;
+ uint32_t bootDevice;
+ char* cmdLine;
+ uint32_t modsCount;
+ multiboot_module_t* modsAddr;
+
+ union
+ {
+ multiboot_aoutSymbolTable_t aoutSym;
+ multiboot_elfSectionHeaderTable_t elfSec;
+ } u;
+
+ uint32_t mmapLength;
+ uint32_t mmapAddr;
+
+ uint32_t drivesLength;
+ uint32_t drivesAddr;
+
+ // ROM configuration table
+ uint32_t configTable;
+
+ char* bootLoaderName;
+ uint32_t apmTable;
+
+ // Video
+ uint32_t vbeControlInfo;
+ uint32_t vbeModeInfo;
+ uint16_t vbeMode;
+ uint16_t vbeInterfaceSeg;
+ uint16_t vbeInterfaceOff;
+ uint16_t vbeInterfaceLen;
+} __attribute__((packed)) multiboot_info_t;
+
+multiboot_info_t* multiboot_info;
+
+void arch_multiboot_printInfo();
diff --git a/samples/C/portio.h b/samples/C/portio.h
new file mode 100644
index 00000000..8a805680
--- /dev/null
+++ b/samples/C/portio.h
@@ -0,0 +1,43 @@
+#pragma once
+
+/* Copyright © 2011 Lukas Martini
+ *
+ * This file is part of Xelix.
+ *
+ * Xelix is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xelix is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Xelix. If not, see .
+ */
+
+#include
+#include
+
+// Legacy
+#define outb(args...) portio_out8(args)
+#define outw(args...) portio_out16(args)
+#define outl(args...) portio_out32(args)
+#define outq(args...) portio_out64(args)
+
+#define inb(args...) portio_in8(args)
+#define inw(args...) portio_in16(args)
+#define inl(args...) portio_in32(args)
+#define inq(args...) portio_in64(args)
+
+void portio_out8(uint16_t port, uint8_t value);
+void portio_out16(uint16_t port, uint16_t value);
+void portio_out32(uint16_t port, uint32_t value);
+void portio_out64(uint16_t port, uint64_t value);
+
+uint8_t portio_in8(uint16_t port);
+uint16_t portio_in16(uint16_t port);
+uint32_t portio_in32(uint16_t port);
+uint64_t portio_in64(uint16_t port);
diff --git a/samples/C/scheduler.h b/samples/C/scheduler.h
new file mode 100644
index 00000000..a886003c
--- /dev/null
+++ b/samples/C/scheduler.h
@@ -0,0 +1,69 @@
+#pragma once
+
+/* Copyright © 2011 Lukas Martini
+ *
+ * This file is part of Xelix.
+ *
+ * Xelix is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xelix is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Xelix. If not, see .
+ */
+
+#include
+#include
+#include
+
+#define SCHEDULER_MAXNAME 256
+#define SCHEDULER_TASK_PATH_MAX 256
+
+// Single linked list
+typedef struct task {
+ uint32_t pid;
+ char name[SCHEDULER_MAXNAME];
+ struct task *parent;
+ cpu_state_t* state;
+ struct task* next;
+ struct task* previous;
+
+ void* stack;
+ void* entry;
+ struct vmem_context *memory_context;
+
+ // Current task state
+ enum {
+ TASK_STATE_KILLED,
+ TASK_STATE_TERMINATED,
+ TASK_STATE_BLOCKING,
+ TASK_STATE_STOPPED,
+ TASK_STATE_RUNNING
+ } task_state;
+
+ char** environ;
+ char** argv;
+ int argc;
+
+ // TODO Is this actually the same as PATH_MAX in our toolchain?
+ char cwd[SCHEDULER_TASK_PATH_MAX + 1];
+} task_t;
+
+int scheduler_state;
+
+task_t* scheduler_new(void* entry, task_t* parent, char name[SCHEDULER_MAXNAME],
+ char** environ, char** argv, int argc, struct vmem_context* memory_context, bool map_structs);
+void scheduler_add(task_t *task);
+void scheduler_terminate_current();
+task_t* scheduler_get_current();
+task_t* scheduler_select(cpu_state_t* lastRegs);
+void scheduler_init();
+void scheduler_yield();
+void scheduler_remove(task_t *t);
+task_t* scheduler_fork(task_t* to_fork, cpu_state_t* state);
\ No newline at end of file
diff --git a/samples/C/syscalls.h b/samples/C/syscalls.h
new file mode 100644
index 00000000..dc054e2b
--- /dev/null
+++ b/samples/C/syscalls.h
@@ -0,0 +1,95 @@
+#pragma once
+
+/* Copyright © 2011 Fritz Grimpen
+ *
+ * This file is part of Xelix.
+ *
+ * Xelix is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xelix is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Xelix. If not, see .
+ */
+
+#include
+#include
+
+#include "syscalls/write.h"
+#include "syscalls/exit.h"
+#include "syscalls/getpid.h"
+#include "syscalls/getppid.h"
+#include "syscalls/read.h"
+#include "syscalls/brk.h"
+#include "syscalls/mmap.h"
+#include "syscalls/munmap.h"
+#include "syscalls/test.h"
+#include "syscalls/hostname.h"
+#include "syscalls/uname.h"
+#include "syscalls/open.h"
+#include "syscalls/execve.h"
+#include "syscalls/seek.h"
+#include "syscalls/opendir.h"
+#include "syscalls/readdir.h"
+#include "syscalls/kill.h"
+#include "syscalls/getexecdata.h"
+#include "syscalls/cwd.h"
+#include "syscalls/fork.h"
+
+syscall_t syscall_table[] = {
+ NULL,
+ sys_exit, // 1
+ sys_read, // 2
+ sys_write, // 3
+ sys_getpid, // 4
+ sys_brk, // 5
+ sys_getppid, // 6
+ sys_mmap, // 7
+ sys_munmap, // 8
+ sys_test, // 9
+ sys_get_hostname, // 10
+ sys_set_hostname, // 11
+ sys_uname, // 12
+ sys_open, // 13
+ sys_execve, // 14
+ sys_seek, // 15
+ sys_opendir, // 16
+ sys_readdir, // 17
+ sys_kill, // 18
+ sys_getexecdata, // 19
+ sys_chdir, // 20
+ sys_getcwd, // 21
+ sys_fork, // 22
+};
+
+char* syscall_name_table[] = {
+ NULL,
+ "exit", // 1
+ "read", // 2
+ "write", // 3
+ "getpid", // 4
+ "brk", // 5
+ "getppid", // 6
+ "mmap", // 7
+ "munmap", // 8
+ "test", // 9
+ "get_hostname", // 10
+ "set_hostname", // 11
+ "uname", // 12
+ "open", // 13
+ "execve", // 14
+ "seek", // 15
+ "opendir", // 16
+ "readdir", // 17
+ "kill", // 18
+ "getexecdata", // 19
+ "chdir", // 20
+ "getcwd", // 21
+ "fork", // 22
+};
diff --git a/samples/C/vfs.h b/samples/C/vfs.h
new file mode 100644
index 00000000..3502460d
--- /dev/null
+++ b/samples/C/vfs.h
@@ -0,0 +1,56 @@
+#pragma once
+
+/* Copyright © 2010, 2011 Lukas Martini
+ *
+ * This file is part of Xelix.
+ *
+ * Xelix is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xelix is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Xelix. If not, see .
+ */
+
+#include
+
+#define VFS_SEEK_SET 0
+#define VFS_SEEK_CUR 1
+#define VFS_SEEK_END 2
+
+typedef struct {
+ uint64_t num;
+ char path[512];
+ char mount_path[512];
+ uint32_t offset;
+ uint32_t mountpoint;
+} vfs_file_t;
+
+typedef struct {
+ uint64_t num;
+ char path[512];
+ char mount_path[512];
+ uint32_t mountpoint;
+} vfs_dir_t;
+
+typedef void* (*vfs_read_callback_t)(char* path, uint32_t offset, uint32_t size);
+typedef char* (*vfs_read_dir_callback_t)(char* path, uint32_t offset);
+
+
+// Used to always store the last read/write attempt (used for kernel panic debugging)
+char vfs_last_read_attempt[512];
+
+vfs_file_t* vfs_get_from_id(uint32_t id);
+vfs_dir_t* vfs_get_dir_from_id(uint32_t id);
+void* vfs_read(vfs_file_t* fp, uint32_t size);
+char* vfs_dir_read(vfs_dir_t* dir, uint32_t offset);
+void vfs_seek(vfs_file_t* fp, uint32_t offset, int origin);
+vfs_file_t* vfs_open(char* path);
+vfs_dir_t* vfs_dir_open(char* path);
+int vfs_mount(char* path, vfs_read_callback_t read_callback, vfs_read_dir_callback_t read_dir_callback);
diff --git a/samples/C/vmem.h b/samples/C/vmem.h
new file mode 100644
index 00000000..82bd29be
--- /dev/null
+++ b/samples/C/vmem.h
@@ -0,0 +1,94 @@
+#pragma once
+
+/* Copyright © 2011 Fritz Grimpen
+ * Copyright © 2013 Lukas Martini
+ *
+ * This file is part of Xelix.
+ *
+ * Xelix is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xelix is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Xelix. If not, see .
+ */
+
+#include
+
+struct vmem_context;
+
+struct vmem_page
+{
+ enum
+ {
+ VMEM_SECTION_STACK, /* Initial stack */
+ VMEM_SECTION_CODE, /* Contains program code and is read-only */
+ VMEM_SECTION_DATA, /* Contains static data */
+ VMEM_SECTION_HEAP, /* Allocated by brk(2) at runtime */
+ VMEM_SECTION_MMAP, /* Allocated by mmap(2) at runtime */
+ VMEM_SECTION_KERNEL, /* Contains kernel-internal data */
+ VMEM_SECTION_UNMAPPED /* Unmapped */
+ } section;
+
+ bool readonly:1;
+ bool cow:1; /* Copy-on-Write mechanism */
+ bool allocated:1;
+
+ void *cow_src_addr;
+ void *virt_addr;
+ void *phys_addr;
+};
+
+typedef void (*vmem_iterator_t)(struct vmem_context *, struct vmem_page *, uint32_t);
+
+/* Initialize vmem_kernelContext for paging_init() */
+void vmem_init();
+struct vmem_context *vmem_kernelContext;
+struct vmem_context *vmem_currentContext;
+struct vmem_context *vmem_processContext;
+void *vmem_faultAddress;
+
+/* Some callbacks for magic functions */
+void (*vmem_applyPage)(struct vmem_context *, struct vmem_page *);
+
+/* Generate new page context */
+struct vmem_context *vmem_new();
+struct vmem_page *vmem_new_page();
+
+int vmem_add_page(struct vmem_context *ctx, struct vmem_page *pg);
+
+struct vmem_page *vmem_get_page_phys(struct vmem_context *ctx, void *phys_addr);
+struct vmem_page *vmem_get_page_virt(struct vmem_context *ctx, void *virt_addr);
+struct vmem_page *vmem_get_page(struct vmem_context *ctx, uint32_t offset);
+
+/* Remove pages in a specific context by physical or virtual address */
+struct vmem_page *vmem_rm_page_phys(struct vmem_context *ctx, void *phys_addr);
+struct vmem_page *vmem_rm_page_virt(struct vmem_context *ctx, void *virt_addr);
+
+/* Iterator */
+int vmem_iterate(struct vmem_context *ctx, vmem_iterator_t callback);
+
+uint32_t vmem_count_pages(struct vmem_context *ctx);
+void vmem_dump_page(struct vmem_page *pg);
+void vmem_dump(struct vmem_context *ctx);
+void vmem_handle_fault(uint32_t code, void *addr, void *instruction);
+
+/* Get/Set cached paging context */
+void vmem_set_cache(struct vmem_context *ctx, void *cache);
+void *vmem_get_cache(struct vmem_context *ctx);
+
+#ifdef __i386__
+ #define PAGE_SIZE 4096
+ #define VMEM_ALIGN(x) (typeof(x))(((intptr_t)(x) & 0xFFFFF000) + 0x1000)
+ #define VMEM_ALIGN_DOWN(x) (typeof(x))( \
+ ((intptr_t)(x) - ((intptr_t)(x) % PAGE_SIZE)))
+#else
+ #define PAGE_SIZE 0
+ #define VMEM_ALIGN(x) (x)
+#endif