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