mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Add a bunch of C header samples for the Bayesian classifier
This commit is contained in:
		
							
								
								
									
										47
									
								
								samples/C/bitmap.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								samples/C/bitmap.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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 <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #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); | ||||
							
								
								
									
										44
									
								
								samples/C/color.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								samples/C/color.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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 <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include <lib/generic.h> | ||||
|  | ||||
| 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 | ||||
|  | ||||
							
								
								
									
										52
									
								
								samples/C/driver.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								samples/C/driver.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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 <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include <lib/generic.h> | ||||
| #include <console/info.h> | ||||
|  | ||||
| #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; | ||||
							
								
								
									
										70
									
								
								samples/C/elf.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								samples/C/elf.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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 <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include <lib/generic.h> | ||||
| #include <tasks/scheduler.h> | ||||
|  | ||||
| #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); | ||||
							
								
								
									
										45
									
								
								samples/C/filter.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								samples/C/filter.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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 <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include <lib/generic.h> | ||||
| #include <console/info.h> | ||||
| #include <console/driver.h> | ||||
|  | ||||
| struct console_filter { | ||||
| 	// General callback for all actions etc. | ||||
| 	// Preferred prototype: | ||||
| 	// char <name>(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 <name>(char c, console_info_t *info, console_driver_t *input); | ||||
| 	char (*read_callback)(char, console_info_t*, console_driver_t*); | ||||
|  | ||||
| 	// Preferred prototype: | ||||
| 	// char <name>(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; | ||||
|  | ||||
							
								
								
									
										44
									
								
								samples/C/info.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								samples/C/info.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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 <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include <lib/generic.h> | ||||
| #include <console/color.h> | ||||
|  | ||||
| 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; | ||||
							
								
								
									
										47
									
								
								samples/C/interface.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								samples/C/interface.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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 <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include <lib/generic.h> | ||||
| #include <console/info.h> | ||||
| #include <console/filter.h> | ||||
| #include <console/driver.h> | ||||
|  | ||||
| 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); | ||||
							
								
								
									
										50
									
								
								samples/C/ip4.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								samples/C/ip4.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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 <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include <lib/generic.h> | ||||
| #include <net/net.h> | ||||
|  | ||||
| #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); | ||||
							
								
								
									
										110
									
								
								samples/C/multiboot.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								samples/C/multiboot.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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 <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include <lib/generic.h> | ||||
|  | ||||
| #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(); | ||||
							
								
								
									
										43
									
								
								samples/C/portio.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								samples/C/portio.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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 <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include <lib/generic.h> | ||||
| #include <lib/stdint.h> | ||||
|  | ||||
| // 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); | ||||
							
								
								
									
										69
									
								
								samples/C/scheduler.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								samples/C/scheduler.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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 <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include <lib/generic.h> | ||||
| #include <hw/cpu.h> | ||||
| #include <memory/vmem.h> | ||||
|  | ||||
| #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); | ||||
							
								
								
									
										95
									
								
								samples/C/syscalls.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								samples/C/syscalls.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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 <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include <lib/generic.h> | ||||
| #include <tasks/syscall.h> | ||||
|  | ||||
| #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 | ||||
| }; | ||||
							
								
								
									
										56
									
								
								samples/C/vfs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								samples/C/vfs.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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 <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include <lib/generic.h> | ||||
|  | ||||
| #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); | ||||
							
								
								
									
										94
									
								
								samples/C/vmem.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								samples/C/vmem.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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 <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include <lib/generic.h> | ||||
|  | ||||
| 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 | ||||
		Reference in New Issue
	
	Block a user