big kernel additions: paging, elf loading, separate kernel and user page allocation it now properly loads and runs sd0:bin/init.elf still need to determine which disk was booted from, and start the init on that disk
		
			
				
	
	
		
			69 lines
		
	
	
		
			No EOL
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			No EOL
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <stdint.h>
 | |
| #include "drive.h"
 | |
| #include "util.h"
 | |
| #include "log.h"
 | |
| 
 | |
| static char nbuf2[11];
 | |
| 
 | |
| static char path_builder[200];
 | |
| static uint8_t path_builder_len;
 | |
| 
 | |
| static char indent_builder[20];
 | |
| static uint8_t indent_builder_len;
 | |
| 
 | |
| void reset_tree() {
 | |
|   path_builder[0] = '\0';
 | |
|   path_builder_len = 0;
 | |
| 
 | |
|   indent_builder[0] = ' ';
 | |
|   indent_builder[1] = ' ';
 | |
|   indent_builder[2] = '\0';
 | |
|   indent_builder_len = 2;
 | |
| }
 | |
| 
 | |
| void tree(struct drive *d) {
 | |
|   struct directory_content_info infos[100];
 | |
|   uint8_t n_infos = d->enumerate_dir(d, path_builder, infos, 100);
 | |
| 
 | |
|   if (!n_infos) {
 | |
|     logsz(indent_builder);
 | |
|     logsz("(empty)\n");
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   for (uint8_t i = 0; i < n_infos; ++i) {
 | |
|     logsz(indent_builder);
 | |
|     logsz(infos[i].name);
 | |
| 
 | |
|     if (infos[i].is_dir) {
 | |
|       logsz(":\n");
 | |
| 
 | |
|       indent_builder[indent_builder_len] = ' ';
 | |
|       indent_builder[indent_builder_len + 1] = ' ';
 | |
|       indent_builder[indent_builder_len + 2] = '\0';
 | |
|       indent_builder_len += 2;
 | |
| 
 | |
|       uint8_t name_length = 0;
 | |
|       while (infos[i].name[name_length])
 | |
|         ++name_length;
 | |
| 
 | |
|       memcpy(path_builder + path_builder_len, infos[i].name, name_length + 1);
 | |
|       path_builder_len += name_length;
 | |
| 
 | |
|       tree(d);
 | |
| 
 | |
|       path_builder_len -= name_length;
 | |
|       path_builder[path_builder_len] = '\0';
 | |
| 
 | |
|       indent_builder_len -= 2;
 | |
|       indent_builder[indent_builder_len] = '\0';
 | |
|     }
 | |
| 
 | |
|     else {
 | |
|       u32_dec(infos[i].size, nbuf2);
 | |
|       logsz(" (");
 | |
|       logsz(nbuf2);
 | |
|       logsz(" bytes)\n");
 | |
|     }
 | |
|   }
 | |
| } |