fix: coding style
Signed-off-by: Julien CLEMENT <julien.clement@epita.fr>
This commit is contained in:
		
							parent
							
								
									7178dbb6a7
								
							
						
					
					
						commit
						3e881a6f33
					
				
							
								
								
									
										38
									
								
								k/crt0.S
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										38
									
								
								k/crt0.S
									
									
									
									
									
								
							| @ -24,32 +24,32 @@ | |||||||
| #include "multiboot.h" | #include "multiboot.h" | ||||||
| 
 | 
 | ||||||
| #define HEADER_FLAGS (MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO) | #define HEADER_FLAGS (MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO) | ||||||
| #define STACK_SIZE	8192 | #define STACK_SIZE    8192 | ||||||
| 
 | 
 | ||||||
| 	.section .multiboot |     .section .multiboot | ||||||
| 	.type multiboot_header, @object
 |     .type multiboot_header, @object
 | ||||||
| multiboot_header: | multiboot_header: | ||||||
| 	.align		MULTIBOOT_HEADER_ALIGN
 |     .align        MULTIBOOT_HEADER_ALIGN
 | ||||||
| 	.long		MULTIBOOT_HEADER_MAGIC
 |     .long        MULTIBOOT_HEADER_MAGIC
 | ||||||
| 	.long		HEADER_FLAGS
 |     .long        HEADER_FLAGS
 | ||||||
| 	.long		-(MULTIBOOT_HEADER_MAGIC + HEADER_FLAGS) |     .long        -(MULTIBOOT_HEADER_MAGIC + HEADER_FLAGS) | ||||||
| 	.size multiboot_header, . - multiboot_header |     .size multiboot_header, . - multiboot_header | ||||||
| 
 | 
 | ||||||
| 	.section .text |     .section .text | ||||||
| 	.global k_entry
 |     .global k_entry
 | ||||||
| 	.type k_entry, @function
 |     .type k_entry, @function
 | ||||||
| k_entry: | k_entry: | ||||||
| 	lea end_stack, %esp |     lea end_stack, %esp | ||||||
| 	push %ebx	/* multiboot info */ |     push %ebx    /* multiboot info */ | ||||||
| 	push %eax	/* magic */ |     push %eax    /* magic */ | ||||||
| 	call k_main	/* kernel entry point */ |     call k_main    /* kernel entry point */ | ||||||
| .Lend: | .Lend: | ||||||
| 	jmp .Lend |     jmp .Lend | ||||||
| 	.size k_entry, . - k_entry |     .size k_entry, . - k_entry | ||||||
| 
 | 
 | ||||||
| .section .bss | .section .bss | ||||||
| stack: | stack: | ||||||
| 	.space STACK_SIZE
 |     .space STACK_SIZE
 | ||||||
| 	.align 16
 |     .align 16
 | ||||||
| end_stack: | end_stack: | ||||||
| .global end_stack
 | .global end_stack
 | ||||||
|  | |||||||
							
								
								
									
										18
									
								
								k/io.h
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										18
									
								
								k/io.h
									
									
									
									
									
								
							| @ -5,30 +5,30 @@ | |||||||
| 
 | 
 | ||||||
| static inline void outb(u16 port, u8 val) | static inline void outb(u16 port, u8 val) | ||||||
| { | { | ||||||
| 	asm volatile ("outb %0, %1" : /* No output */ : "a"(val), "d"(port)); |     asm volatile ("outb %0, %1" : /* No output */ : "a"(val), "d"(port)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static inline u8 inb(u16 port) | static inline u8 inb(u16 port) | ||||||
| { | { | ||||||
| 	u8 res; |     u8 res; | ||||||
| 
 | 
 | ||||||
| 	asm volatile ("inb %1, %0" : "=&a"(res) : "d"(port)); |     asm volatile ("inb %1, %0" : "=&a"(res) : "d"(port)); | ||||||
| 
 | 
 | ||||||
| 	return res; |     return res; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static inline void outw(u16 port, u16 val) | static inline void outw(u16 port, u16 val) | ||||||
| { | { | ||||||
| 	asm volatile ("outw %0, %1" : /* No output */ : "a"(val), "d"(port)); |     asm volatile ("outw %0, %1" : /* No output */ : "a"(val), "d"(port)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static inline u16 inw(u16 port) | static inline u16 inw(u16 port) | ||||||
| { | { | ||||||
| 	u16 res; |     u16 res; | ||||||
| 
 | 
 | ||||||
| 	asm volatile ("inw %1, %0" : "=&a"(res) : "d"(port)); |     asm volatile ("inw %1, %0" : "=&a"(res) : "d"(port)); | ||||||
| 
 | 
 | ||||||
| 	return res; |     return res; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #endif				/* !IO_H_ */ | #endif                /* !IO_H_ */ | ||||||
|  | |||||||
							
								
								
									
										18
									
								
								k/k.c
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										18
									
								
								k/k.c
									
									
									
									
									
								
							| @ -28,16 +28,16 @@ | |||||||
| 
 | 
 | ||||||
| void k_main(unsigned long magic, multiboot_info_t *info) | void k_main(unsigned long magic, multiboot_info_t *info) | ||||||
| { | { | ||||||
| 	(void)magic; |     (void)magic; | ||||||
| 	(void)info; |     (void)info; | ||||||
| 
 | 
 | ||||||
| 	char star[4] = "|/-\\"; |     char star[4] = "|/-\\"; | ||||||
| 	char *fb = (void *)0xb8000; |     char *fb = (void *)0xb8000; | ||||||
| 
 | 
 | ||||||
| 	for (unsigned i = 0; ; ) { |     for (unsigned i = 0; ; ) { | ||||||
| 		*fb = star[i++ % 4]; |         *fb = star[i++ % 4]; | ||||||
| 	} |     } | ||||||
| 
 | 
 | ||||||
| 	for (;;) |     for (;;) | ||||||
| 		asm volatile ("hlt"); |         asm volatile ("hlt"); | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										340
									
								
								k/libvga.c
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										340
									
								
								k/libvga.c
									
									
									
									
									
								
							| @ -36,44 +36,44 @@ static unsigned char libvga_txt_mode_font[320 * 200]; | |||||||
| ** Registers value for graphic mode. | ** Registers value for graphic mode. | ||||||
| */ | */ | ||||||
| static unsigned char libvga_regs_320x200x256[] = { | static unsigned char libvga_regs_320x200x256[] = { | ||||||
| 	/* MISC */ |     /* MISC */ | ||||||
| 	0x63, |     0x63, | ||||||
| 	/* SEQ */ |     /* SEQ */ | ||||||
| 	0x03, 0x01, 0x0F, 0x00, 0x0E, |     0x03, 0x01, 0x0F, 0x00, 0x0E, | ||||||
| 	/* CRTC */ |     /* CRTC */ | ||||||
| 	0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, |     0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, | ||||||
| 	0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |     0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||||
| 	0x9C, 0x0E, 0x8F, 0x28, 0x40, 0x96, 0xB9, 0xA3, |     0x9C, 0x0E, 0x8F, 0x28, 0x40, 0x96, 0xB9, 0xA3, | ||||||
| 	0xFF, |     0xFF, | ||||||
| 	/* GC */ |     /* GC */ | ||||||
| 	0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, |     0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, | ||||||
| 	0xFF, |     0xFF, | ||||||
| 	/* AC */ |     /* AC */ | ||||||
| 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, |     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||||||
| 	0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, |     0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, | ||||||
| 	0x41, 0x00, 0x0F, 0x00, 0x00 |     0x41, 0x00, 0x0F, 0x00, 0x00 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
| ** Registers value for basic text mode. | ** Registers value for basic text mode. | ||||||
| */ | */ | ||||||
| static unsigned char libvga_regs_80x25xtext[] = { | static unsigned char libvga_regs_80x25xtext[] = { | ||||||
| 	/* MISC */ |     /* MISC */ | ||||||
| 	0x67, |     0x67, | ||||||
| 	/* SEQ */ |     /* SEQ */ | ||||||
| 	0x03, 0x00, 0x03, 0x00, 0x02, |     0x03, 0x00, 0x03, 0x00, 0x02, | ||||||
| 	/* CRTC */ |     /* CRTC */ | ||||||
| 	0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81, 0xBF, 0x1F, |     0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81, 0xBF, 0x1F, | ||||||
| 	0x00, 0x4F, 0x0D, 0x0E, 0x00, 0x00, 0x00, 0x50, |     0x00, 0x4F, 0x0D, 0x0E, 0x00, 0x00, 0x00, 0x50, | ||||||
| 	0x9C, 0x0E, 0x8F, 0x28, 0x1F, 0x96, 0xB9, 0xA3, |     0x9C, 0x0E, 0x8F, 0x28, 0x1F, 0x96, 0xB9, 0xA3, | ||||||
| 	0xFF, |     0xFF, | ||||||
| 	/* GC */ |     /* GC */ | ||||||
| 	0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, |     0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, | ||||||
| 	0xFF, |     0xFF, | ||||||
| 	/* AC */ |     /* AC */ | ||||||
| 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, |     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, | ||||||
| 	0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, |     0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, | ||||||
| 	0x0C, 0x00, 0x0F, 0x08, 0x00 |     0x0C, 0x00, 0x0F, 0x08, 0x00 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
| @ -81,171 +81,171 @@ static unsigned char libvga_regs_80x25xtext[] = { | |||||||
| ** This palette is automatically loaded when switching to mode 13h | ** This palette is automatically loaded when switching to mode 13h | ||||||
| */ | */ | ||||||
| static unsigned int libvga_default_palette[256] = { | static unsigned int libvga_default_palette[256] = { | ||||||
| 	0x0, 0x800000, 0x8000, 0x808000, |     0x0, 0x800000, 0x8000, 0x808000, | ||||||
| 	0x80, 0x800080, 0x8080, 0xc0c0c0, |     0x80, 0x800080, 0x8080, 0xc0c0c0, | ||||||
| 	0xc0dcc0, 0xa6caf0, 0x402000, 0x602000, |     0xc0dcc0, 0xa6caf0, 0x402000, 0x602000, | ||||||
| 	0x802000, 0xa02000, 0xc02000, 0xe02000, |     0x802000, 0xa02000, 0xc02000, 0xe02000, | ||||||
| 	0x4000, 0x204000, 0x404000, 0x604000, |     0x4000, 0x204000, 0x404000, 0x604000, | ||||||
| 	0x804000, 0xa04000, 0xc04000, 0xe04000, |     0x804000, 0xa04000, 0xc04000, 0xe04000, | ||||||
| 	0x6000, 0x206000, 0x406000, 0x606000, |     0x6000, 0x206000, 0x406000, 0x606000, | ||||||
| 	0x806000, 0xa06000, 0xc06000, 0xe06000, |     0x806000, 0xa06000, 0xc06000, 0xe06000, | ||||||
| 	0x8000, 0x208000, 0x408000, 0x608000, |     0x8000, 0x208000, 0x408000, 0x608000, | ||||||
| 	0x808000, 0xa08000, 0xc08000, 0xe08000, |     0x808000, 0xa08000, 0xc08000, 0xe08000, | ||||||
| 	0xa000, 0x20a000, 0x40a000, 0x60a000, |     0xa000, 0x20a000, 0x40a000, 0x60a000, | ||||||
| 	0x80a000, 0xa0a000, 0xc0a000, 0xe0a000, |     0x80a000, 0xa0a000, 0xc0a000, 0xe0a000, | ||||||
| 	0xc000, 0x20c000, 0x40c000, 0x60c000, |     0xc000, 0x20c000, 0x40c000, 0x60c000, | ||||||
| 	0x80c000, 0xa0c000, 0xc0c000, 0xe0c000, |     0x80c000, 0xa0c000, 0xc0c000, 0xe0c000, | ||||||
| 	0xe000, 0x20e000, 0x40e000, 0x60e000, |     0xe000, 0x20e000, 0x40e000, 0x60e000, | ||||||
| 	0x80e000, 0xa0e000, 0xc0e000, 0xe0e000, |     0x80e000, 0xa0e000, 0xc0e000, 0xe0e000, | ||||||
| 	0x40, 0x200040, 0x400040, 0x600040, |     0x40, 0x200040, 0x400040, 0x600040, | ||||||
| 	0x800040, 0xa00040, 0xc00040, 0xe00040, |     0x800040, 0xa00040, 0xc00040, 0xe00040, | ||||||
| 	0x2040, 0x202040, 0x402040, 0x602040, |     0x2040, 0x202040, 0x402040, 0x602040, | ||||||
| 	0x802040, 0xa02040, 0xc02040, 0xe02040, |     0x802040, 0xa02040, 0xc02040, 0xe02040, | ||||||
| 	0x4040, 0x204040, 0x404040, 0x604040, |     0x4040, 0x204040, 0x404040, 0x604040, | ||||||
| 	0x804040, 0xa04040, 0xc04040, 0xe04040, |     0x804040, 0xa04040, 0xc04040, 0xe04040, | ||||||
| 	0x6040, 0x206040, 0x406040, 0x606040, |     0x6040, 0x206040, 0x406040, 0x606040, | ||||||
| 	0x806040, 0xa06040, 0xc06040, 0xe06040, |     0x806040, 0xa06040, 0xc06040, 0xe06040, | ||||||
| 	0x8040, 0x208040, 0x408040, 0x608040, |     0x8040, 0x208040, 0x408040, 0x608040, | ||||||
| 	0x808040, 0xa08040, 0xc08040, 0xe08040, |     0x808040, 0xa08040, 0xc08040, 0xe08040, | ||||||
| 	0xa040, 0x20a040, 0x40a040, 0x60a040, |     0xa040, 0x20a040, 0x40a040, 0x60a040, | ||||||
| 	0x80a040, 0xa0a040, 0xc0a040, 0xe0a040, |     0x80a040, 0xa0a040, 0xc0a040, 0xe0a040, | ||||||
| 	0xc040, 0x20c040, 0x40c040, 0x60c040, |     0xc040, 0x20c040, 0x40c040, 0x60c040, | ||||||
| 	0x80c040, 0xa0c040, 0xc0c040, 0xe0c040, |     0x80c040, 0xa0c040, 0xc0c040, 0xe0c040, | ||||||
| 	0xe040, 0x20e040, 0x40e040, 0x60e040, |     0xe040, 0x20e040, 0x40e040, 0x60e040, | ||||||
| 	0x80e040, 0xa0e040, 0xc0e040, 0xe0e040, |     0x80e040, 0xa0e040, 0xc0e040, 0xe0e040, | ||||||
| 	0x80, 0x200080, 0x400080, 0x600080, |     0x80, 0x200080, 0x400080, 0x600080, | ||||||
| 	0x800080, 0xa00080, 0xc00080, 0xe00080, |     0x800080, 0xa00080, 0xc00080, 0xe00080, | ||||||
| 	0x2080, 0x202080, 0x402080, 0x602080, |     0x2080, 0x202080, 0x402080, 0x602080, | ||||||
| 	0x802080, 0xa02080, 0xc02080, 0xe02080, |     0x802080, 0xa02080, 0xc02080, 0xe02080, | ||||||
| 	0x4080, 0x204080, 0x404080, 0x604080, |     0x4080, 0x204080, 0x404080, 0x604080, | ||||||
| 	0x804080, 0xa04080, 0xc04080, 0xe04080, |     0x804080, 0xa04080, 0xc04080, 0xe04080, | ||||||
| 	0x6080, 0x206080, 0x406080, 0x606080, |     0x6080, 0x206080, 0x406080, 0x606080, | ||||||
| 	0x806080, 0xa06080, 0xc06080, 0xe06080, |     0x806080, 0xa06080, 0xc06080, 0xe06080, | ||||||
| 	0x8080, 0x208080, 0x408080, 0x608080, |     0x8080, 0x208080, 0x408080, 0x608080, | ||||||
| 	0x808080, 0xa08080, 0xc08080, 0xe08080, |     0x808080, 0xa08080, 0xc08080, 0xe08080, | ||||||
| 	0xa080, 0x20a080, 0x40a080, 0x60a080, |     0xa080, 0x20a080, 0x40a080, 0x60a080, | ||||||
| 	0x80a080, 0xa0a080, 0xc0a080, 0xe0a080, |     0x80a080, 0xa0a080, 0xc0a080, 0xe0a080, | ||||||
| 	0xc080, 0x20c080, 0x40c080, 0x60c080, |     0xc080, 0x20c080, 0x40c080, 0x60c080, | ||||||
| 	0x80c080, 0xa0c080, 0xc0c080, 0xe0c080, |     0x80c080, 0xa0c080, 0xc0c080, 0xe0c080, | ||||||
| 	0xe080, 0x20e080, 0x40e080, 0x60e080, |     0xe080, 0x20e080, 0x40e080, 0x60e080, | ||||||
| 	0x80e080, 0xa0e080, 0xc0e080, 0xe0e080, |     0x80e080, 0xa0e080, 0xc0e080, 0xe0e080, | ||||||
| 	0xc0, 0x2000c0, 0x4000c0, 0x6000c0, |     0xc0, 0x2000c0, 0x4000c0, 0x6000c0, | ||||||
| 	0x8000c0, 0xa000c0, 0xc000c0, 0xe000c0, |     0x8000c0, 0xa000c0, 0xc000c0, 0xe000c0, | ||||||
| 	0x20c0, 0x2020c0, 0x4020c0, 0x6020c0, |     0x20c0, 0x2020c0, 0x4020c0, 0x6020c0, | ||||||
| 	0x8020c0, 0xa020c0, 0xc020c0, 0xe020c0, |     0x8020c0, 0xa020c0, 0xc020c0, 0xe020c0, | ||||||
| 	0x40c0, 0x2040c0, 0x4040c0, 0x6040c0, |     0x40c0, 0x2040c0, 0x4040c0, 0x6040c0, | ||||||
| 	0x8040c0, 0xa040c0, 0xc040c0, 0xe040c0, |     0x8040c0, 0xa040c0, 0xc040c0, 0xe040c0, | ||||||
| 	0x60c0, 0x2060c0, 0x4060c0, 0x6060c0, |     0x60c0, 0x2060c0, 0x4060c0, 0x6060c0, | ||||||
| 	0x8060c0, 0xa060c0, 0xc060c0, 0xe060c0, |     0x8060c0, 0xa060c0, 0xc060c0, 0xe060c0, | ||||||
| 	0x80c0, 0x2080c0, 0x4080c0, 0x6080c0, |     0x80c0, 0x2080c0, 0x4080c0, 0x6080c0, | ||||||
| 	0x8080c0, 0xa080c0, 0xc080c0, 0xe080c0, |     0x8080c0, 0xa080c0, 0xc080c0, 0xe080c0, | ||||||
| 	0xa0c0, 0x20a0c0, 0x40a0c0, 0x60a0c0, |     0xa0c0, 0x20a0c0, 0x40a0c0, 0x60a0c0, | ||||||
| 	0x80a0c0, 0xa0a0c0, 0xc0a0c0, 0xe0a0c0, |     0x80a0c0, 0xa0a0c0, 0xc0a0c0, 0xe0a0c0, | ||||||
| 	0xc0c0, 0x20c0c0, 0x40c0c0, 0x60c0c0, |     0xc0c0, 0x20c0c0, 0x40c0c0, 0x60c0c0, | ||||||
| 	0x80c0c0, 0xa0c0c0, 0xfffbf0, 0xa0a0a4, |     0x80c0c0, 0xa0c0c0, 0xfffbf0, 0xa0a0a4, | ||||||
| 	0x808080, 0xff0000, 0xff00, 0xffff00, |     0x808080, 0xff0000, 0xff00, 0xffff00, | ||||||
| 	0xff, 0xff00ff, 0xffff, 0xffffff |     0xff, 0xff00ff, 0xffff, 0xffffff | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static void libvga_write_regs(unsigned char *regs) | static void libvga_write_regs(unsigned char *regs) | ||||||
| { | { | ||||||
| 	unsigned int i; |     unsigned int i; | ||||||
| 	unsigned int a; |     unsigned int a; | ||||||
| 
 | 
 | ||||||
| 	/* write the MISC register */ |     /* write the MISC register */ | ||||||
| 	outb(VGA_MISC_WRITE, *regs); |     outb(VGA_MISC_WRITE, *regs); | ||||||
| 	regs++; |     regs++; | ||||||
| 
 | 
 | ||||||
| 	/* write SEQ registers */ |     /* write SEQ registers */ | ||||||
| 	for (i = 0; i < VGA_NUM_SEQ_REGS; i++) { |     for (i = 0; i < VGA_NUM_SEQ_REGS; i++) { | ||||||
| 		outb(VGA_SEQ_INDEX, i); |         outb(VGA_SEQ_INDEX, i); | ||||||
| 		outb(VGA_SEQ_DATA, *regs); |         outb(VGA_SEQ_DATA, *regs); | ||||||
| 		regs++; |         regs++; | ||||||
| 	} |     } | ||||||
| 
 | 
 | ||||||
| 	/* write CRTC registers */ |     /* write CRTC registers */ | ||||||
| 	outb(VGA_CRTC_INDEX, 0x03); |     outb(VGA_CRTC_INDEX, 0x03); | ||||||
| 	a = inb(VGA_CRTC_DATA); |     a = inb(VGA_CRTC_DATA); | ||||||
| 	outb(VGA_CRTC_DATA, a | 0x80); |     outb(VGA_CRTC_DATA, a | 0x80); | ||||||
| 	outb(VGA_CRTC_INDEX, 0x11); |     outb(VGA_CRTC_INDEX, 0x11); | ||||||
| 	a = inb(VGA_CRTC_DATA); |     a = inb(VGA_CRTC_DATA); | ||||||
| 	outb(VGA_CRTC_DATA, a & ~0x80); |     outb(VGA_CRTC_DATA, a & ~0x80); | ||||||
| 	regs[0x03] |= 0x80; |     regs[0x03] |= 0x80; | ||||||
| 	regs[0x11] &= ~0x80; |     regs[0x11] &= ~0x80; | ||||||
| 	for (i = 0; i < VGA_NUM_CRTC_REGS; i++) { |     for (i = 0; i < VGA_NUM_CRTC_REGS; i++) { | ||||||
| 		outb(VGA_CRTC_INDEX, i); |         outb(VGA_CRTC_INDEX, i); | ||||||
| 		outb(VGA_CRTC_DATA, *regs); |         outb(VGA_CRTC_DATA, *regs); | ||||||
| 		regs++; |         regs++; | ||||||
| 	} |     } | ||||||
| 
 | 
 | ||||||
| 	/* write GC registers */ |     /* write GC registers */ | ||||||
| 	for (i = 0; i < VGA_NUM_GC_REGS; i++) { |     for (i = 0; i < VGA_NUM_GC_REGS; i++) { | ||||||
| 		outb(VGA_GC_INDEX, i); |         outb(VGA_GC_INDEX, i); | ||||||
| 		outb(VGA_GC_DATA, *regs); |         outb(VGA_GC_DATA, *regs); | ||||||
| 		regs++; |         regs++; | ||||||
| 	} |     } | ||||||
| 
 | 
 | ||||||
| 	/* write AC registers */ |     /* write AC registers */ | ||||||
| 	inb(VGA_INSTAT_READ); |     inb(VGA_INSTAT_READ); | ||||||
| 	for (i = 0; i < VGA_NUM_AC_REGS; i++) { |     for (i = 0; i < VGA_NUM_AC_REGS; i++) { | ||||||
| 		outb(VGA_AC_INDEX, i); |         outb(VGA_AC_INDEX, i); | ||||||
| 		outb(VGA_AC_WRITE, *regs); |         outb(VGA_AC_WRITE, *regs); | ||||||
| 		regs++; |         regs++; | ||||||
| 	} |     } | ||||||
| 	inb(VGA_INSTAT_READ); |     inb(VGA_INSTAT_READ); | ||||||
| 	outb(VGA_AC_INDEX, 0x20); |     outb(VGA_AC_INDEX, 0x20); | ||||||
| 
 | 
 | ||||||
| 	/* write the default palette to the DAC */ |     /* write the default palette to the DAC */ | ||||||
| 	outb(VGA_DAC_MASK, 0xFF); |     outb(VGA_DAC_MASK, 0xFF); | ||||||
| 	libvga_set_palette(libvga_default_palette, array_size(libvga_default_palette)); |     libvga_set_palette(libvga_default_palette, array_size(libvga_default_palette)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void libvga_set_palette(unsigned int *new_palette, size_t size) | void libvga_set_palette(unsigned int *new_palette, size_t size) | ||||||
| { | { | ||||||
| 	outb(VGA_DAC_WRITE_INDEX, 0); |     outb(VGA_DAC_WRITE_INDEX, 0); | ||||||
| 	for (size_t i = 0; i < size; i++) { |     for (size_t i = 0; i < size; i++) { | ||||||
| 		outb(VGA_DAC_DATA, ((new_palette[i] >> 16) >> 2) & 0xFF); |         outb(VGA_DAC_DATA, ((new_palette[i] >> 16) >> 2) & 0xFF); | ||||||
| 		outb(VGA_DAC_DATA, ((new_palette[i] >> 8) >> 2) & 0xFF); |         outb(VGA_DAC_DATA, ((new_palette[i] >> 8) >> 2) & 0xFF); | ||||||
| 		outb(VGA_DAC_DATA, ((new_palette[i]) >> 2) & 0xFF); |         outb(VGA_DAC_DATA, ((new_palette[i]) >> 2) & 0xFF); | ||||||
| 	} |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| char *libvga_get_framebuffer(void) | char *libvga_get_framebuffer(void) | ||||||
| { | { | ||||||
| 	unsigned int mmap_select; |     unsigned int mmap_select; | ||||||
| 
 | 
 | ||||||
| 	outb(VGA_GC_INDEX, 6); |     outb(VGA_GC_INDEX, 6); | ||||||
| 	mmap_select = inb(VGA_GC_DATA); |     mmap_select = inb(VGA_GC_DATA); | ||||||
| 	mmap_select >>= 2; |     mmap_select >>= 2; | ||||||
| 	mmap_select &= 3; |     mmap_select &= 3; | ||||||
| 	switch (mmap_select) { |     switch (mmap_select) { | ||||||
| 	case 0: |     case 0: | ||||||
| 	case 1: |     case 1: | ||||||
| 		return (char *)0xA0000; |         return (char *)0xA0000; | ||||||
| 	case 2: |     case 2: | ||||||
| 		return (char *)0xB0000; |         return (char *)0xB0000; | ||||||
| 	case 3: |     case 3: | ||||||
| 		return (char *)0xB8000; |         return (char *)0xB8000; | ||||||
| 	} |     } | ||||||
| 	return (char *)0; |     return (char *)0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void libvga_switch_mode13h(void) | void libvga_switch_mode13h(void) | ||||||
| { | { | ||||||
| 	libvga_write_regs(libvga_regs_320x200x256); |     libvga_write_regs(libvga_regs_320x200x256); | ||||||
| 
 | 
 | ||||||
| 	// plane 2 is now map in the memory, save it
 |     // plane 2 is now map in the memory, save it
 | ||||||
| 	char *vram = libvga_get_framebuffer(); |     char *vram = libvga_get_framebuffer(); | ||||||
| 	for (size_t i = 0; i < array_size(libvga_txt_mode_font); i++) |     for (size_t i = 0; i < array_size(libvga_txt_mode_font); i++) | ||||||
| 		libvga_txt_mode_font[i] = vram[i]; |         libvga_txt_mode_font[i] = vram[i]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void libvga_switch_mode3h(void) | void libvga_switch_mode3h(void) | ||||||
| { | { | ||||||
| 	// restore the VGA plane 2 to the text font
 |     // restore the VGA plane 2 to the text font
 | ||||||
| 	char *vram = libvga_get_framebuffer(); |     char *vram = libvga_get_framebuffer(); | ||||||
| 	for (size_t i = 0; i < array_size(libvga_txt_mode_font); i++) |     for (size_t i = 0; i < array_size(libvga_txt_mode_font); i++) | ||||||
| 		vram[i] = libvga_txt_mode_font[i]; |         vram[i] = libvga_txt_mode_font[i]; | ||||||
| 
 | 
 | ||||||
| 	libvga_write_regs(libvga_regs_80x25xtext); |     libvga_write_regs(libvga_regs_80x25xtext); | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										42
									
								
								k/libvga.h
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										42
									
								
								k/libvga.h
									
									
									
									
									
								
							| @ -26,28 +26,28 @@ | |||||||
| 
 | 
 | ||||||
| #include <stddef.h> | #include <stddef.h> | ||||||
| 
 | 
 | ||||||
| #define VGA_AC_INDEX		0x3C0 | #define VGA_AC_INDEX        0x3C0 | ||||||
| #define VGA_AC_WRITE		0x3C0 | #define VGA_AC_WRITE        0x3C0 | ||||||
| #define VGA_AC_READ		0x3C1 | #define VGA_AC_READ        0x3C1 | ||||||
| #define VGA_MISC_WRITE		0x3C2 | #define VGA_MISC_WRITE        0x3C2 | ||||||
| #define VGA_SEQ_INDEX		0x3C4 | #define VGA_SEQ_INDEX        0x3C4 | ||||||
| #define VGA_SEQ_DATA		0x3C5 | #define VGA_SEQ_DATA        0x3C5 | ||||||
| #define VGA_DAC_MASK		0x3C6 | #define VGA_DAC_MASK        0x3C6 | ||||||
| #define VGA_DAC_READ_INDEX	0x3C7 | #define VGA_DAC_READ_INDEX    0x3C7 | ||||||
| #define VGA_DAC_WRITE_INDEX	0x3C8 | #define VGA_DAC_WRITE_INDEX    0x3C8 | ||||||
| #define VGA_DAC_DATA		0x3C9 | #define VGA_DAC_DATA        0x3C9 | ||||||
| #define VGA_MISC_READ		0x3CC | #define VGA_MISC_READ        0x3CC | ||||||
| #define VGA_GC_INDEX 		0x3CE | #define VGA_GC_INDEX         0x3CE | ||||||
| #define VGA_GC_DATA 		0x3CF | #define VGA_GC_DATA         0x3CF | ||||||
| 
 | 
 | ||||||
| #define VGA_CRTC_INDEX		0x3D4 | #define VGA_CRTC_INDEX        0x3D4 | ||||||
| #define VGA_CRTC_DATA		0x3D5 | #define VGA_CRTC_DATA        0x3D5 | ||||||
| #define VGA_INSTAT_READ	0x3DA | #define VGA_INSTAT_READ    0x3DA | ||||||
| 
 | 
 | ||||||
| #define VGA_NUM_SEQ_REGS	5 | #define VGA_NUM_SEQ_REGS    5 | ||||||
| #define VGA_NUM_CRTC_REGS	25 | #define VGA_NUM_CRTC_REGS    25 | ||||||
| #define VGA_NUM_GC_REGS	9 | #define VGA_NUM_GC_REGS    9 | ||||||
| #define VGA_NUM_AC_REGS	21 | #define VGA_NUM_AC_REGS    21 | ||||||
| 
 | 
 | ||||||
| void libvga_set_palette(unsigned int *new_palette, size_t size); | void libvga_set_palette(unsigned int *new_palette, size_t size); | ||||||
| 
 | 
 | ||||||
| @ -57,4 +57,4 @@ void libvga_switch_mode13h(void); | |||||||
| 
 | 
 | ||||||
| void libvga_switch_mode3h(void); | void libvga_switch_mode3h(void); | ||||||
| 
 | 
 | ||||||
| #endif				/* !LIBVGA_H */ | #endif                /* !LIBVGA_H */ | ||||||
|  | |||||||
							
								
								
									
										22
									
								
								k/list.c
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										22
									
								
								k/list.c
									
									
									
									
									
								
							| @ -7,27 +7,27 @@ | |||||||
| 
 | 
 | ||||||
| void list_init(struct list *list) | void list_init(struct list *list) | ||||||
| { | { | ||||||
| 	list->prev = list; |     list->prev = list; | ||||||
| 	list->next = list; |     list->next = list; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void list_insert(struct list *list, struct list *elm) | void list_insert(struct list *list, struct list *elm) | ||||||
| { | { | ||||||
| 	elm->prev = list; |     elm->prev = list; | ||||||
| 	elm->next = list->next; |     elm->next = list->next; | ||||||
| 	list->next = elm; |     list->next = elm; | ||||||
| 	elm->next->prev = elm; |     elm->next->prev = elm; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void list_remove(struct list *elm) | void list_remove(struct list *elm) | ||||||
| { | { | ||||||
| 	elm->prev->next = elm->next; |     elm->prev->next = elm->next; | ||||||
| 	elm->next->prev = elm->prev; |     elm->next->prev = elm->prev; | ||||||
| 	elm->next = NULL; |     elm->next = NULL; | ||||||
| 	elm->prev = NULL; |     elm->prev = NULL; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int list_empty(const struct list *list) | int list_empty(const struct list *list) | ||||||
| { | { | ||||||
| 	return list->next == list; |     return list->next == list; | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										36
									
								
								k/list.h
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										36
									
								
								k/list.h
									
									
									
									
									
								
							| @ -9,8 +9,8 @@ | |||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| struct list { | struct list { | ||||||
| 	struct list *prev; |     struct list *prev; | ||||||
| 	struct list *next; |     struct list *next; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| void list_init(struct list *list); | void list_init(struct list *list); | ||||||
| @ -18,24 +18,24 @@ void list_insert(struct list *list, struct list *elm); | |||||||
| void list_remove(struct list *elm); | void list_remove(struct list *elm); | ||||||
| int list_empty(const struct list *list); | int list_empty(const struct list *list); | ||||||
| 
 | 
 | ||||||
| #define container_of(ptr, type, member)					\ | #define container_of(ptr, type, member)                    \ | ||||||
| 	(__typeof__(type) *)((char *)(ptr) -				\ |     (__typeof__(type) *)((char *)(ptr) -                \ | ||||||
| 		 offsetof(__typeof__(type), member)) |          offsetof(__typeof__(type), member)) | ||||||
| 
 | 
 | ||||||
| #define list_first_entry(head, pos, member)				\ | #define list_first_entry(head, pos, member)                \ | ||||||
| 	container_of((head)->next, __typeof__(*pos), member) |     container_of((head)->next, __typeof__(*pos), member) | ||||||
| 
 | 
 | ||||||
| #define list_for_each(pos, head, member)				\ | #define list_for_each(pos, head, member)                \ | ||||||
| 	for (pos = 0, pos = list_first_entry(head, pos, member);	\ |     for (pos = 0, pos = list_first_entry(head, pos, member);    \ | ||||||
| 	     &pos->member != (head);					\ |          &pos->member != (head);                    \ | ||||||
| 	     pos = list_first_entry(&pos->member, pos, member)) |          pos = list_first_entry(&pos->member, pos, member)) | ||||||
| 
 | 
 | ||||||
| #define list_for_each_safe(pos, tmp, head, member)			\ | #define list_for_each_safe(pos, tmp, head, member)            \ | ||||||
| 	for (pos = 0, tmp = 0, 						\ |     for (pos = 0, tmp = 0,                         \ | ||||||
| 	     pos = list_first_entry(head, pos, member),			\ |          pos = list_first_entry(head, pos, member),            \ | ||||||
| 	     tmp = list_first_entry(&pos->member, tmp, member);		\ |          tmp = list_first_entry(&pos->member, tmp, member);        \ | ||||||
| 	     &pos->member != (head);					\ |          &pos->member != (head);                    \ | ||||||
| 	     pos = tmp,							\ |          pos = tmp,                            \ | ||||||
| 	     tmp = list_first_entry(&pos->member, tmp, member)) |          tmp = list_first_entry(&pos->member, tmp, member)) | ||||||
| 
 | 
 | ||||||
| #endif /* LIST_H */ | #endif /* LIST_H */ | ||||||
|  | |||||||
							
								
								
									
										304
									
								
								k/memory.c
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										304
									
								
								k/memory.c
									
									
									
									
									
								
							| @ -12,256 +12,256 @@ static void *__cache_alloc(struct cache *cache, int in_extend); | |||||||
| 
 | 
 | ||||||
| static void cache_initialize(struct cache *c, void *p, size_t sz, size_t bsize) | static void cache_initialize(struct cache *c, void *p, size_t sz, size_t bsize) | ||||||
| { | { | ||||||
| 	list_init(&c->freelist); |     list_init(&c->freelist); | ||||||
| 	list_init(&c->caches); |     list_init(&c->caches); | ||||||
| 	c->base = p; |     c->base = p; | ||||||
| 	c->size = sz; |     c->size = sz; | ||||||
| 	c->bsize = bsize; |     c->bsize = bsize; | ||||||
| 
 | 
 | ||||||
| 	for (size_t i = 0; i < sz / bsize; ++i) { |     for (size_t i = 0; i < sz / bsize; ++i) { | ||||||
| 		struct list *l = (struct list *)((char *) p + i * bsize); |         struct list *l = (struct list *)((char *) p + i * bsize); | ||||||
| 		list_init(l); |         list_init(l); | ||||||
| 		list_insert(c->freelist.prev, l); |         list_insert(c->freelist.prev, l); | ||||||
| 	} |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cache_extend(struct cache *old, void *p, size_t sz, size_t bsize, int in_extend) | static void cache_extend(struct cache *old, void *p, size_t sz, size_t bsize, int in_extend) | ||||||
| { | { | ||||||
| 	struct cache *c = __cache_alloc(metadata_cache, in_extend); |     struct cache *c = __cache_alloc(metadata_cache, in_extend); | ||||||
| 	cache_initialize(c, p, sz, bsize); |     cache_initialize(c, p, sz, bsize); | ||||||
| 	list_insert(old->caches.prev, &c->caches); |     list_insert(old->caches.prev, &c->caches); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| struct cache *cache_new(void *base, size_t nmemb, size_t bsize) | struct cache *cache_new(void *base, size_t nmemb, size_t bsize) | ||||||
| { | { | ||||||
| 	struct cache *c = cache_alloc(metadata_cache); |     struct cache *c = cache_alloc(metadata_cache); | ||||||
| 
 | 
 | ||||||
| 	cache_initialize(c, base, nmemb * bsize, bsize); |     cache_initialize(c, base, nmemb * bsize, bsize); | ||||||
| 
 | 
 | ||||||
| 	return c; |     return c; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static size_t freelist_size(struct cache *cache) | static size_t freelist_size(struct cache *cache) | ||||||
| { | { | ||||||
| 	if (list_empty(&cache->freelist)) |     if (list_empty(&cache->freelist)) | ||||||
| 		return 0; |         return 0; | ||||||
| 
 | 
 | ||||||
| 	size_t len = 1; |     size_t len = 1; | ||||||
| 
 | 
 | ||||||
| 	struct list *l = cache->freelist.next; |     struct list *l = cache->freelist.next; | ||||||
| 
 | 
 | ||||||
| 	for (; l != &cache->freelist; l = l->next) { |     for (; l != &cache->freelist; l = l->next) { | ||||||
| 		len++; |         len++; | ||||||
| 	} |     } | ||||||
| 
 | 
 | ||||||
| 	return len; |     return len; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static size_t cache_remaining(struct cache *cache) | static size_t cache_remaining(struct cache *cache) | ||||||
| { | { | ||||||
| 	size_t len = freelist_size(cache); |     size_t len = freelist_size(cache); | ||||||
| 
 | 
 | ||||||
| 	struct cache *c; |     struct cache *c; | ||||||
| 	list_for_each(c, &cache->caches, caches) { |     list_for_each(c, &cache->caches, caches) { | ||||||
| 		len += freelist_size(c); |         len += freelist_size(c); | ||||||
| 	} |     } | ||||||
| 
 | 
 | ||||||
| 	return len; |     return len; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void *__cache_alloc(struct cache *cache, int in_extend) | static void *__cache_alloc(struct cache *cache, int in_extend) | ||||||
| { | { | ||||||
| try_alloc: | try_alloc: | ||||||
| 	if (!list_empty(&cache->freelist)) { |     if (!list_empty(&cache->freelist)) { | ||||||
| 		struct list *l = cache->freelist.next; |         struct list *l = cache->freelist.next; | ||||||
| 		list_remove(l); |         list_remove(l); | ||||||
| 		return (void *)l; |         return (void *)l; | ||||||
| 	} |     } | ||||||
| 
 | 
 | ||||||
| 	struct cache *c; |     struct cache *c; | ||||||
| 	list_for_each(c, &cache->caches, caches) { |     list_for_each(c, &cache->caches, caches) { | ||||||
| 		if (!list_empty(&c->freelist)) { |         if (!list_empty(&c->freelist)) { | ||||||
| 			return cache_alloc(c); |             return cache_alloc(c); | ||||||
| 		} |         } | ||||||
| 	} |     } | ||||||
| 
 | 
 | ||||||
| 	if (cache_remaining(metadata_cache) <= 2 && !in_extend) { |     if (cache_remaining(metadata_cache) <= 2 && !in_extend) { | ||||||
| 		void *p = __memory_reserve_ex(0, metadata_cache->size, 1); |         void *p = __memory_reserve_ex(0, metadata_cache->size, 1); | ||||||
| 		cache_extend(metadata_cache, p, |         cache_extend(metadata_cache, p, | ||||||
| 			     metadata_cache->size, |                  metadata_cache->size, | ||||||
| 			     metadata_cache->bsize, 1); |                  metadata_cache->bsize, 1); | ||||||
| 	} |     } | ||||||
| 
 | 
 | ||||||
| 	void *p = memory_reserve(c->size); |     void *p = memory_reserve(c->size); | ||||||
| 	cache_extend(c, p, c->size, c->bsize, 0); |     cache_extend(c, p, c->size, c->bsize, 0); | ||||||
| 
 | 
 | ||||||
| 	goto try_alloc; |     goto try_alloc; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void *cache_alloc(struct cache *cache) | void *cache_alloc(struct cache *cache) | ||||||
| { | { | ||||||
| 	return __cache_alloc(cache, 0); |     return __cache_alloc(cache, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int cache_try_free(struct cache *cache, void *ptr) | static int cache_try_free(struct cache *cache, void *ptr) | ||||||
| { | { | ||||||
| 	if ((size_t)cache->base <= (size_t)ptr |     if ((size_t)cache->base <= (size_t)ptr | ||||||
| 	 && (size_t)cache->base + cache->size > (size_t)ptr) { |      && (size_t)cache->base + cache->size > (size_t)ptr) { | ||||||
| 		list_init(ptr); |         list_init(ptr); | ||||||
| 		list_insert(&cache->freelist, ptr); |         list_insert(&cache->freelist, ptr); | ||||||
| 		return 1; |         return 1; | ||||||
| 	} |     } | ||||||
| 	return 0; |     return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void cache_free(struct cache *cache, void *ptr) | void cache_free(struct cache *cache, void *ptr) | ||||||
| { | { | ||||||
| 	if (cache_try_free(cache, ptr)) { |     if (cache_try_free(cache, ptr)) { | ||||||
| 		return; |         return; | ||||||
| 	} |     } | ||||||
| 	struct cache *c; |     struct cache *c; | ||||||
| 	list_for_each(c, &cache->caches, caches) { |     list_for_each(c, &cache->caches, caches) { | ||||||
| 		if (cache_try_free(c, ptr)) { |         if (cache_try_free(c, ptr)) { | ||||||
| 			return; |             return; | ||||||
| 		} |         } | ||||||
| 	} |     } | ||||||
| 	/* FIXME: handle the case when the pointer does not belong to the cache */ |     /* FIXME: handle the case when the pointer does not belong to the cache */ | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void memory_initialize(struct memory_map *m, | static void memory_initialize(struct memory_map *m, | ||||||
| 			      unsigned addr, unsigned size, int type) |                   unsigned addr, unsigned size, int type) | ||||||
| { | { | ||||||
| 	list_init(&m->list); |     list_init(&m->list); | ||||||
| 	m->base_addr = addr; |     m->base_addr = addr; | ||||||
| 	m->size = size; |     m->size = size; | ||||||
| 	m->type = type; |     m->type = type; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void memory_dump() | void memory_dump() | ||||||
| { | { | ||||||
| 	struct memory_map *m; |     struct memory_map *m; | ||||||
| 	list_for_each(m, &memory_map, list) { |     list_for_each(m, &memory_map, list) { | ||||||
| 		printf("{.base_addr=%p, .length=0x%x, .type=%u}\n", |         printf("{.base_addr=%p, .length=0x%x, .type=%u}\n", | ||||||
| 				m->base_addr, m->size, m->type); |                 m->base_addr, m->size, m->type); | ||||||
| 	} |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| extern void *_end[]; /* kernel data end address */ | extern void *_end[]; /* kernel data end address */ | ||||||
| 
 | 
 | ||||||
| #define BASE_METADATA_CACHE_NMEMB	10 | #define BASE_METADATA_CACHE_NMEMB    10 | ||||||
| 
 | 
 | ||||||
| void memory_init(multiboot_info_t *info) | void memory_init(multiboot_info_t *info) | ||||||
| { | { | ||||||
| 	unsigned int last_loaded_addr = info->mods_count |     unsigned int last_loaded_addr = info->mods_count | ||||||
| 		? ((multiboot_module_t *)info->mods_addr)[info->mods_count - 1].mod_end |         ? ((multiboot_module_t *)info->mods_addr)[info->mods_count - 1].mod_end | ||||||
| 		: 0; |         : 0; | ||||||
| 
 | 
 | ||||||
| 	if (last_loaded_addr < (u32)_end) { |     if (last_loaded_addr < (u32)_end) { | ||||||
| 		last_loaded_addr = (u32)_end; /* XXX: needs to align up */ |         last_loaded_addr = (u32)_end; /* XXX: needs to align up */ | ||||||
| 	} |     } | ||||||
| 
 | 
 | ||||||
| 	/* take the first good memory region */ |     /* take the first good memory region */ | ||||||
| 	unsigned int reservation_addr = last_loaded_addr; |     unsigned int reservation_addr = last_loaded_addr; | ||||||
| 	unsigned int reservation_len = (BASE_METADATA_CACHE_NMEMB + 1) * sizeof(struct cache); |     unsigned int reservation_len = (BASE_METADATA_CACHE_NMEMB + 1) * sizeof(struct cache); | ||||||
| 
 | 
 | ||||||
| 	unsigned int num_mem_zone = info->mmap_length / sizeof(multiboot_memory_map_t); |     unsigned int num_mem_zone = info->mmap_length / sizeof(multiboot_memory_map_t); | ||||||
| 
 | 
 | ||||||
| 	metadata_cache = (void *)reservation_addr; |     metadata_cache = (void *)reservation_addr; | ||||||
| 	cache_initialize(metadata_cache, metadata_cache + 1, BASE_METADATA_CACHE_NMEMB * sizeof(struct cache), |     cache_initialize(metadata_cache, metadata_cache + 1, BASE_METADATA_CACHE_NMEMB * sizeof(struct cache), | ||||||
| 			 sizeof(struct cache)); |              sizeof(struct cache)); | ||||||
| 
 | 
 | ||||||
| 	memory_map_cache = cache_new((void *)(reservation_addr + reservation_len), |     memory_map_cache = cache_new((void *)(reservation_addr + reservation_len), | ||||||
| 				      num_mem_zone * 2, sizeof(struct memory_map)); |                       num_mem_zone * 2, sizeof(struct memory_map)); | ||||||
| 
 | 
 | ||||||
| 	reservation_len += num_mem_zone * 2 * sizeof(struct memory_map); |     reservation_len += num_mem_zone * 2 * sizeof(struct memory_map); | ||||||
| 
 | 
 | ||||||
| 	multiboot_memory_map_t *map = (void *)info->mmap_addr; |     multiboot_memory_map_t *map = (void *)info->mmap_addr; | ||||||
| 
 | 
 | ||||||
| 	for (size_t i = 0; i < num_mem_zone; ++i) { |     for (size_t i = 0; i < num_mem_zone; ++i) { | ||||||
| 		struct memory_map *m = cache_alloc(memory_map_cache); |         struct memory_map *m = cache_alloc(memory_map_cache); | ||||||
| 
 | 
 | ||||||
| 		memory_initialize(m, (u32)map[i].addr, (u32)map[i].len, |         memory_initialize(m, (u32)map[i].addr, (u32)map[i].len, | ||||||
| 				  map[i].type - 1); |                   map[i].type - 1); | ||||||
| 
 | 
 | ||||||
| 		list_insert(memory_map.prev, &m->list); |         list_insert(memory_map.prev, &m->list); | ||||||
| 	} |     } | ||||||
| 
 | 
 | ||||||
| 	/* reserve all low memory to avoid overwriting grub data */ |     /* reserve all low memory to avoid overwriting grub data */ | ||||||
| 	memory_reserve_ex(0, info->mem_lower * 1024); |     memory_reserve_ex(0, info->mem_lower * 1024); | ||||||
| 	/* reserve kernel and fs data */ |     /* reserve kernel and fs data */ | ||||||
| 	memory_reserve_ex(0x100000, last_loaded_addr - 0x100000); |     memory_reserve_ex(0x100000, last_loaded_addr - 0x100000); | ||||||
| 	/* reserve initial cache datas */ |     /* reserve initial cache datas */ | ||||||
| 	memory_reserve_ex(reservation_addr, reservation_len); |     memory_reserve_ex(reservation_addr, reservation_len); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void *memory_split(struct memory_map *m, size_t size) | static void *memory_split(struct memory_map *m, size_t size) | ||||||
| { | { | ||||||
| 	struct memory_map *t = cache_alloc(memory_map_cache); |     struct memory_map *t = cache_alloc(memory_map_cache); | ||||||
| 	memory_initialize(t, m->base_addr, size, 2); |     memory_initialize(t, m->base_addr, size, 2); | ||||||
| 
 | 
 | ||||||
| 	list_insert(m->list.prev, &t->list); |     list_insert(m->list.prev, &t->list); | ||||||
| 
 | 
 | ||||||
| 	m->size -= size; |     m->size -= size; | ||||||
| 	m->base_addr += size; |     m->base_addr += size; | ||||||
| 
 | 
 | ||||||
| 	return (void *)t->base_addr; |     return (void *)t->base_addr; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void *__memory_reserve_ex(unsigned int base_addr, size_t size, int in_extend) | static void *__memory_reserve_ex(unsigned int base_addr, size_t size, int in_extend) | ||||||
| { | { | ||||||
| 	if (cache_remaining(memory_map_cache) <= 2 && !in_extend) { |     if (cache_remaining(memory_map_cache) <= 2 && !in_extend) { | ||||||
| 		void *p = __memory_reserve_ex(0, 10 * sizeof(struct cache), 1); |         void *p = __memory_reserve_ex(0, 10 * sizeof(struct cache), 1); | ||||||
| 		cache_extend(memory_map_cache, p, 10 * sizeof(struct cache), |         cache_extend(memory_map_cache, p, 10 * sizeof(struct cache), | ||||||
| 				sizeof(struct cache), 0); |                 sizeof(struct cache), 0); | ||||||
| 	} |     } | ||||||
| 
 | 
 | ||||||
| 	struct memory_map *m; |     struct memory_map *m; | ||||||
| 	list_for_each(m, &memory_map, list) { |     list_for_each(m, &memory_map, list) { | ||||||
| 		if (m->type) |         if (m->type) | ||||||
| 			continue; |             continue; | ||||||
| 
 | 
 | ||||||
| 		if (!base_addr && m->size >= size) { |         if (!base_addr && m->size >= size) { | ||||||
| 			if (m->size == size) { |             if (m->size == size) { | ||||||
| 				m->type = 2; |                 m->type = 2; | ||||||
| 				return (void *)m->base_addr; |                 return (void *)m->base_addr; | ||||||
| 			} |             } | ||||||
| 			return memory_split(m, size); |             return memory_split(m, size); | ||||||
| 		} else if (base_addr >= m->base_addr && base_addr < m->base_addr + m->size) { |         } else if (base_addr >= m->base_addr && base_addr < m->base_addr + m->size) { | ||||||
| 			if (base_addr + size >= m->base_addr + m->size) { |             if (base_addr + size >= m->base_addr + m->size) { | ||||||
| 				return NULL; |                 return NULL; | ||||||
| 			} |             } | ||||||
| 			unsigned first_size = base_addr - m->base_addr; |             unsigned first_size = base_addr - m->base_addr; | ||||||
| 			if (first_size) { |             if (first_size) { | ||||||
| 				memory_split(m, first_size); |                 memory_split(m, first_size); | ||||||
| 				return memory_reserve_ex(base_addr, size); |                 return memory_reserve_ex(base_addr, size); | ||||||
| 			} |             } | ||||||
| 
 | 
 | ||||||
| 			return memory_split(m, size); |             return memory_split(m, size); | ||||||
| 		} |         } | ||||||
| 	} |     } | ||||||
| 
 | 
 | ||||||
| 	return NULL; |     return NULL; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void *memory_reserve_ex(unsigned int base_addr, size_t size) | void *memory_reserve_ex(unsigned int base_addr, size_t size) | ||||||
| { | { | ||||||
| 	return __memory_reserve_ex(base_addr, size, 0); |     return __memory_reserve_ex(base_addr, size, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void *memory_reserve(size_t size) | void *memory_reserve(size_t size) | ||||||
| { | { | ||||||
| 	return memory_reserve_ex(0, size); |     return memory_reserve_ex(0, size); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void memory_release(void *ptr) | void memory_release(void *ptr) | ||||||
| { | { | ||||||
| 	struct memory_map *m; |     struct memory_map *m; | ||||||
| 	list_for_each(m, &memory_map, list) { |     list_for_each(m, &memory_map, list) { | ||||||
| 		if (m->base_addr == (unsigned int)ptr) { |         if (m->base_addr == (unsigned int)ptr) { | ||||||
| 			m->type = 0; |             m->type = 0; | ||||||
| 			/* FIXME: need to merge free blocks */ |             /* FIXME: need to merge free blocks */ | ||||||
| 			return; |             return; | ||||||
| 		} |         } | ||||||
| 	} |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										18
									
								
								k/memory.h
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										18
									
								
								k/memory.h
									
									
									
									
									
								
							| @ -5,10 +5,10 @@ | |||||||
| #include "multiboot.h" | #include "multiboot.h" | ||||||
| 
 | 
 | ||||||
| struct memory_map { | struct memory_map { | ||||||
| 	struct list list; |     struct list list; | ||||||
| 	unsigned int base_addr; |     unsigned int base_addr; | ||||||
| 	unsigned int size; |     unsigned int size; | ||||||
| 	int type; |     int type; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| void memory_dump(); | void memory_dump(); | ||||||
| @ -18,11 +18,11 @@ void *memory_reserve_ex(unsigned int base_addr, size_t size); | |||||||
| void memory_release(void *ptr); | void memory_release(void *ptr); | ||||||
| 
 | 
 | ||||||
| struct cache { | struct cache { | ||||||
| 	struct list freelist; |     struct list freelist; | ||||||
| 	struct list caches; |     struct list caches; | ||||||
| 	void *base; |     void *base; | ||||||
| 	size_t size; |     size_t size; | ||||||
| 	size_t bsize; |     size_t bsize; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct cache *cache_new(void *base, size_t nmemb, size_t bsize); | struct cache *cache_new(void *base, size_t nmemb, size_t bsize); | ||||||
|  | |||||||
							
								
								
									
										206
									
								
								k/multiboot.h
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										206
									
								
								k/multiboot.h
									
									
									
									
									
								
							| @ -97,164 +97,164 @@ typedef unsigned int            multiboot_uint32_t; | |||||||
| typedef unsigned long long      multiboot_uint64_t; | typedef unsigned long long      multiboot_uint64_t; | ||||||
| 
 | 
 | ||||||
| struct multiboot_header { | struct multiboot_header { | ||||||
| 	/* Must be MULTIBOOT_MAGIC - see above. */ |     /* Must be MULTIBOOT_MAGIC - see above. */ | ||||||
| 	multiboot_uint32_t magic; |     multiboot_uint32_t magic; | ||||||
| 
 | 
 | ||||||
| 	/* Feature flags. */ |     /* Feature flags. */ | ||||||
| 	multiboot_uint32_t flags; |     multiboot_uint32_t flags; | ||||||
| 
 | 
 | ||||||
| 	/* The above fields plus this one must equal 0 mod 2^32. */ |     /* The above fields plus this one must equal 0 mod 2^32. */ | ||||||
| 	multiboot_uint32_t checksum; |     multiboot_uint32_t checksum; | ||||||
| 
 | 
 | ||||||
| 	/* These are only valid if MULTIBOOT_AOUT_KLUDGE is set. */ |     /* These are only valid if MULTIBOOT_AOUT_KLUDGE is set. */ | ||||||
| 	multiboot_uint32_t header_addr; |     multiboot_uint32_t header_addr; | ||||||
| 	multiboot_uint32_t load_addr; |     multiboot_uint32_t load_addr; | ||||||
| 	multiboot_uint32_t load_end_addr; |     multiboot_uint32_t load_end_addr; | ||||||
| 	multiboot_uint32_t bss_end_addr; |     multiboot_uint32_t bss_end_addr; | ||||||
| 	multiboot_uint32_t entry_addr; |     multiboot_uint32_t entry_addr; | ||||||
| 
 | 
 | ||||||
| 	/* These are only valid if MULTIBOOT_VIDEO_MODE is set. */ |     /* These are only valid if MULTIBOOT_VIDEO_MODE is set. */ | ||||||
| 	multiboot_uint32_t mode_type; |     multiboot_uint32_t mode_type; | ||||||
| 	multiboot_uint32_t width; |     multiboot_uint32_t width; | ||||||
| 	multiboot_uint32_t height; |     multiboot_uint32_t height; | ||||||
| 	multiboot_uint32_t depth; |     multiboot_uint32_t depth; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /* The symbol table for a.out. */ | /* The symbol table for a.out. */ | ||||||
| struct multiboot_aout_symbol_table { | struct multiboot_aout_symbol_table { | ||||||
| 	multiboot_uint32_t tabsize; |     multiboot_uint32_t tabsize; | ||||||
| 	multiboot_uint32_t strsize; |     multiboot_uint32_t strsize; | ||||||
| 	multiboot_uint32_t addr; |     multiboot_uint32_t addr; | ||||||
| 	multiboot_uint32_t reserved; |     multiboot_uint32_t reserved; | ||||||
| }; | }; | ||||||
| typedef struct multiboot_aout_symbol_table multiboot_aout_symbol_table_t; | typedef struct multiboot_aout_symbol_table multiboot_aout_symbol_table_t; | ||||||
| 
 | 
 | ||||||
| /* The section header table for ELF. */ | /* The section header table for ELF. */ | ||||||
| struct multiboot_elf_section_header_table { | struct multiboot_elf_section_header_table { | ||||||
| 	multiboot_uint32_t num; |     multiboot_uint32_t num; | ||||||
| 	multiboot_uint32_t size; |     multiboot_uint32_t size; | ||||||
| 	multiboot_uint32_t addr; |     multiboot_uint32_t addr; | ||||||
| 	multiboot_uint32_t shndx; |     multiboot_uint32_t shndx; | ||||||
| }; | }; | ||||||
| typedef struct multiboot_elf_section_header_table multiboot_elf_section_header_table_t; | typedef struct multiboot_elf_section_header_table multiboot_elf_section_header_table_t; | ||||||
| 
 | 
 | ||||||
| struct multiboot_info { | struct multiboot_info { | ||||||
| 	/* Multiboot info version number */ |     /* Multiboot info version number */ | ||||||
| 	multiboot_uint32_t flags; |     multiboot_uint32_t flags; | ||||||
| 
 | 
 | ||||||
| 	/* Available memory from BIOS */ |     /* Available memory from BIOS */ | ||||||
| 	multiboot_uint32_t mem_lower; |     multiboot_uint32_t mem_lower; | ||||||
| 	multiboot_uint32_t mem_upper; |     multiboot_uint32_t mem_upper; | ||||||
| 
 | 
 | ||||||
| 	/* "root" partition */ |     /* "root" partition */ | ||||||
| 	multiboot_uint32_t boot_device; |     multiboot_uint32_t boot_device; | ||||||
| 
 | 
 | ||||||
| 	/* Kernel command line */ |     /* Kernel command line */ | ||||||
| 	multiboot_uint32_t cmdline; |     multiboot_uint32_t cmdline; | ||||||
| 
 | 
 | ||||||
| 	/* Boot-Module list */ |     /* Boot-Module list */ | ||||||
| 	multiboot_uint32_t mods_count; |     multiboot_uint32_t mods_count; | ||||||
| 	multiboot_uint32_t mods_addr; |     multiboot_uint32_t mods_addr; | ||||||
| 
 | 
 | ||||||
| 	union { |     union { | ||||||
| 		multiboot_aout_symbol_table_t aout_sym; |         multiboot_aout_symbol_table_t aout_sym; | ||||||
| 		multiboot_elf_section_header_table_t elf_sec; |         multiboot_elf_section_header_table_t elf_sec; | ||||||
| 	} u; |     } u; | ||||||
| 
 | 
 | ||||||
| 	/* Memory Mapping buffer */ |     /* Memory Mapping buffer */ | ||||||
| 	multiboot_uint32_t mmap_length; |     multiboot_uint32_t mmap_length; | ||||||
| 	multiboot_uint32_t mmap_addr; |     multiboot_uint32_t mmap_addr; | ||||||
| 
 | 
 | ||||||
| 	/* Drive Info buffer */ |     /* Drive Info buffer */ | ||||||
| 	multiboot_uint32_t drives_length; |     multiboot_uint32_t drives_length; | ||||||
| 	multiboot_uint32_t drives_addr; |     multiboot_uint32_t drives_addr; | ||||||
| 
 | 
 | ||||||
| 	/* ROM configuration table */ |     /* ROM configuration table */ | ||||||
| 	multiboot_uint32_t config_table; |     multiboot_uint32_t config_table; | ||||||
| 
 | 
 | ||||||
| 	/* Boot Loader Name */ |     /* Boot Loader Name */ | ||||||
| 	multiboot_uint32_t boot_loader_name; |     multiboot_uint32_t boot_loader_name; | ||||||
| 
 | 
 | ||||||
| 	/* APM table */ |     /* APM table */ | ||||||
| 	multiboot_uint32_t apm_table; |     multiboot_uint32_t apm_table; | ||||||
| 
 | 
 | ||||||
| 	/* Video */ |     /* Video */ | ||||||
| 	multiboot_uint32_t vbe_control_info; |     multiboot_uint32_t vbe_control_info; | ||||||
| 	multiboot_uint32_t vbe_mode_info; |     multiboot_uint32_t vbe_mode_info; | ||||||
| 	multiboot_uint16_t vbe_mode; |     multiboot_uint16_t vbe_mode; | ||||||
| 	multiboot_uint16_t vbe_interface_seg; |     multiboot_uint16_t vbe_interface_seg; | ||||||
| 	multiboot_uint16_t vbe_interface_off; |     multiboot_uint16_t vbe_interface_off; | ||||||
| 	multiboot_uint16_t vbe_interface_len; |     multiboot_uint16_t vbe_interface_len; | ||||||
| 
 | 
 | ||||||
| 	multiboot_uint64_t framebuffer_addr; |     multiboot_uint64_t framebuffer_addr; | ||||||
| 	multiboot_uint32_t framebuffer_pitch; |     multiboot_uint32_t framebuffer_pitch; | ||||||
| 	multiboot_uint32_t framebuffer_width; |     multiboot_uint32_t framebuffer_width; | ||||||
| 	multiboot_uint32_t framebuffer_height; |     multiboot_uint32_t framebuffer_height; | ||||||
| 	multiboot_uint8_t framebuffer_bpp; |     multiboot_uint8_t framebuffer_bpp; | ||||||
| #define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0 | #define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0 | ||||||
| #define MULTIBOOT_FRAMEBUFFER_TYPE_RGB     1 | #define MULTIBOOT_FRAMEBUFFER_TYPE_RGB     1 | ||||||
| #define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT     2 | #define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT     2 | ||||||
| 	multiboot_uint8_t framebuffer_type; |     multiboot_uint8_t framebuffer_type; | ||||||
| 	union { |     union { | ||||||
| 		struct { |         struct { | ||||||
| 			multiboot_uint32_t framebuffer_palette_addr; |             multiboot_uint32_t framebuffer_palette_addr; | ||||||
| 			multiboot_uint16_t framebuffer_palette_num_colors; |             multiboot_uint16_t framebuffer_palette_num_colors; | ||||||
| 		}; |         }; | ||||||
| 		struct { |         struct { | ||||||
| 			multiboot_uint8_t framebuffer_red_field_position; |             multiboot_uint8_t framebuffer_red_field_position; | ||||||
| 			multiboot_uint8_t framebuffer_red_mask_size; |             multiboot_uint8_t framebuffer_red_mask_size; | ||||||
| 			multiboot_uint8_t framebuffer_green_field_position; |             multiboot_uint8_t framebuffer_green_field_position; | ||||||
| 			multiboot_uint8_t framebuffer_green_mask_size; |             multiboot_uint8_t framebuffer_green_mask_size; | ||||||
| 			multiboot_uint8_t framebuffer_blue_field_position; |             multiboot_uint8_t framebuffer_blue_field_position; | ||||||
| 			multiboot_uint8_t framebuffer_blue_mask_size; |             multiboot_uint8_t framebuffer_blue_mask_size; | ||||||
| 		}; |         }; | ||||||
| 	}; |     }; | ||||||
| }; | }; | ||||||
| typedef struct multiboot_info multiboot_info_t; | typedef struct multiboot_info multiboot_info_t; | ||||||
| 
 | 
 | ||||||
| struct multiboot_color { | struct multiboot_color { | ||||||
| 	multiboot_uint8_t red; |     multiboot_uint8_t red; | ||||||
| 	multiboot_uint8_t green; |     multiboot_uint8_t green; | ||||||
| 	multiboot_uint8_t blue; |     multiboot_uint8_t blue; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct multiboot_mmap_entry { | struct multiboot_mmap_entry { | ||||||
| 	multiboot_uint32_t size; |     multiboot_uint32_t size; | ||||||
| 	multiboot_uint64_t addr; |     multiboot_uint64_t addr; | ||||||
| 	multiboot_uint64_t len; |     multiboot_uint64_t len; | ||||||
| #define MULTIBOOT_MEMORY_AVAILABLE              1 | #define MULTIBOOT_MEMORY_AVAILABLE              1 | ||||||
| #define MULTIBOOT_MEMORY_RESERVED               2 | #define MULTIBOOT_MEMORY_RESERVED               2 | ||||||
| #define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE       3 | #define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE       3 | ||||||
| #define MULTIBOOT_MEMORY_NVS                    4 | #define MULTIBOOT_MEMORY_NVS                    4 | ||||||
| #define MULTIBOOT_MEMORY_BADRAM                 5 | #define MULTIBOOT_MEMORY_BADRAM                 5 | ||||||
| 	multiboot_uint32_t type; |     multiboot_uint32_t type; | ||||||
| } __attribute__((packed)); | } __attribute__((packed)); | ||||||
| typedef struct multiboot_mmap_entry multiboot_memory_map_t; | typedef struct multiboot_mmap_entry multiboot_memory_map_t; | ||||||
| 
 | 
 | ||||||
| struct multiboot_mod_list { | struct multiboot_mod_list { | ||||||
| 	/* the memory used goes from bytes 'mod_start' to 'mod_end-1' inclusive */ |     /* the memory used goes from bytes 'mod_start' to 'mod_end-1' inclusive */ | ||||||
| 	multiboot_uint32_t mod_start; |     multiboot_uint32_t mod_start; | ||||||
| 	multiboot_uint32_t mod_end; |     multiboot_uint32_t mod_end; | ||||||
| 
 | 
 | ||||||
| 	/* Module command line */ |     /* Module command line */ | ||||||
| 	multiboot_uint32_t cmdline; |     multiboot_uint32_t cmdline; | ||||||
| 
 | 
 | ||||||
| 	/* padding to take it to 16 bytes (must be zero) */ |     /* padding to take it to 16 bytes (must be zero) */ | ||||||
| 	multiboot_uint32_t pad; |     multiboot_uint32_t pad; | ||||||
| }; | }; | ||||||
| typedef struct multiboot_mod_list multiboot_module_t; | typedef struct multiboot_mod_list multiboot_module_t; | ||||||
| 
 | 
 | ||||||
| /* APM BIOS info. */ | /* APM BIOS info. */ | ||||||
| struct multiboot_apm_info { | struct multiboot_apm_info { | ||||||
| 	multiboot_uint16_t version; |     multiboot_uint16_t version; | ||||||
| 	multiboot_uint16_t cseg; |     multiboot_uint16_t cseg; | ||||||
| 	multiboot_uint32_t offset; |     multiboot_uint32_t offset; | ||||||
| 	multiboot_uint16_t cseg_16; |     multiboot_uint16_t cseg_16; | ||||||
| 	multiboot_uint16_t dseg; |     multiboot_uint16_t dseg; | ||||||
| 	multiboot_uint16_t flags; |     multiboot_uint16_t flags; | ||||||
| 	multiboot_uint16_t cseg_len; |     multiboot_uint16_t cseg_len; | ||||||
| 	multiboot_uint16_t cseg_16_len; |     multiboot_uint16_t cseg_16_len; | ||||||
| 	multiboot_uint16_t dseg_len; |     multiboot_uint16_t dseg_len; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #endif /* ! ASM_FILE */ | #endif /* ! ASM_FILE */ | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user