Commit ba565cc6 by triazo

Make types fit. Somehow.

Wow why does C have different types we should just use uint32_t for
everything it would be much cleaner.
parent 574fd64b
Showing with 20 additions and 18 deletions
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
Mainly, contains the elf loading code Mainly, contains the elf loading code
*/ */
#include "mem.h" #include "elf.h"
void load_elf(elf_header* elf_start) void load_elf(elf_header* elf_start)
{ {
...@@ -16,24 +16,21 @@ void load_elf(elf_header* elf_start) ...@@ -16,24 +16,21 @@ void load_elf(elf_header* elf_start)
{ {
// get this section header // get this section header
elf_program_header* ph; elf_program_header* ph;
ph = elf_start + elf_start->ph_table_offset + (i * elf_start->ph_entry_size); ph = (elf_program_header*) elf_start + (elf_start->ph_table_offset + (i * elf_start->ph_entry_size));
// map and copy // map and copy
for (pg = ph->p_vaddr & 0xfffff000; pg - ph->p_vaddr < ph->memory_segment_size; pg+=0x1000) for (void* pg = (void*)((uint32_t)ph->p_vaddr & 0xfffff000); (uint32_t)(pg - ph->p_vaddr) < ph->memory_segment_size; pg+=0x1000)
{ {
real_page = page_allocate(pg); void* real_page = page_map(pgdir, pg);
start = (pg > ph->p_vaddr) ? pg : ph->p_vaddr; void* start = (pg > ph->p_vaddr) ? pg : ph->p_vaddr;
end = (pg + 0x1000 < ph->p_vaddr + ph->file_segment_size) ? pg + 0x1000 : ph->p_vaddr + ph->file_segment_size; void* end = (pg + 0x1000 < ph->p_vaddr + ph->file_segment_size) ? pg + 0x1000 : ph->p_vaddr + ph->file_segment_size;
size = end - start; size_t size = end - start;
offset = (pg > ph->p_vaddr) ? 0 : ph->p_vaddr - pg; size_t offset = (pg > ph->p_vaddr) ? 0 : ph->p_vaddr - pg;
// do some memcpy stuff // do some memcpy stuff
memcpy(real_page + offset, start, size); memcpy(real_page + offset, start, size);
elf_start + p->ph_offset
} }
} }
} }
...@@ -8,6 +8,10 @@ ...@@ -8,6 +8,10 @@
#define _ELF_INT #define _ELF_INT
#include <stdint.h> #include <stdint.h>
#include <stddef.h>
#include "mem.h"
#include "string.h"
extern uint8_t elf_hello[] asm("_binary_hello_elf_start"); extern uint8_t elf_hello[] asm("_binary_hello_elf_start");
...@@ -32,7 +36,7 @@ typedef struct ...@@ -32,7 +36,7 @@ typedef struct
uint16_t sh_entry_size; uint16_t sh_entry_size;
uint16_t sh_entry_count; uint16_t sh_entry_count;
uint16_t sh_name_index; uint16_t sh_name_index;
} __attribute__(packed) elf_header; } __attribute__((packed)) elf_header;
typedef struct typedef struct
{ {
......
...@@ -146,17 +146,18 @@ page_directory_entry* mem_init_kern_tables(multiboot_memory_map* mmap, multiboot ...@@ -146,17 +146,18 @@ page_directory_entry* mem_init_kern_tables(multiboot_memory_map* mmap, multiboot
// page_map takes in a virtual address and a directory, and ensures // page_map takes in a virtual address and a directory, and ensures
// that that address points to valid memory // that that address points to valid memory
void page_map(page_directory_entry[] pgdir, void* page_start) void* page_map(page_directory_entry pgdir[], void* page_start)
{ {
void* page = 0; void* page = 0;
if (pgdir[page_start>>22] & 0xfffff == 0) if ((pgdir[(uint32_t)page_start>>22] & 0xfffff) == 0)
{ {
pgdir[page_start>>22] |= page_new_table(); pgdir[(uint32_t)page_start>>22] |= (page_directory_entry)page_new_table();
} }
if (pgdir[page_start>>22][(page_start>>12)%1024] & 0xfffff == 0) page_table_entry* page_table = (page_table_entry*) ((uint32_t) pgdir[(uint32_t)page_start>>22] & 0xfffff000);
if ((page_table[((uint32_t)page_start >> 12) % 1024] & 0xfffff) == 0)
{ {
page = page_allocate(); page = page_allocate();
pgdir[page_start>>22][(page_start>>12)%1024] |= page; page_table[((uint32_t)page_start>>12)%1024] |= (page_table_entry)page;
} }
return page; return page;
} }
......
...@@ -33,7 +33,7 @@ extern char _kernel_end[]; ...@@ -33,7 +33,7 @@ extern char _kernel_end[];
// Allocation of pages // Allocation of pages
void* page_allocate(); void* page_allocate();
void page_free(void* page_start); void page_free(void* page_start);
void page_map(page_directory_entry[] pgdir, void* page_start); void* page_map(page_directory_entry pgdir[], void* page_start);
// Initilization // Initilization
page_directory_entry* mem_init_kern_tables(multiboot_memory_map* mmap, multiboot_memory_map* mmap_end); page_directory_entry* mem_init_kern_tables(multiboot_memory_map* mmap, multiboot_memory_map* mmap_end);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment