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 @@
Mainly, contains the elf loading code
*/
#include "mem.h"
#include "elf.h"
void load_elf(elf_header* elf_start)
{
......@@ -16,24 +16,21 @@ void load_elf(elf_header* elf_start)
{
// get this section header
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
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;
end = (pg + 0x1000 < ph->p_vaddr + ph->file_segment_size) ? pg + 0x1000 : ph->p_vaddr + ph->file_segment_size;
void* start = (pg > ph->p_vaddr) ? pg : ph->p_vaddr;
void* end = (pg + 0x1000 < ph->p_vaddr + ph->file_segment_size) ? pg + 0x1000 : ph->p_vaddr + ph->file_segment_size;
size = end - start;
offset = (pg > ph->p_vaddr) ? 0 : ph->p_vaddr - pg;
size_t size = end - start;
size_t offset = (pg > ph->p_vaddr) ? 0 : ph->p_vaddr - pg;
// do some memcpy stuff
memcpy(real_page + offset, start, size);
elf_start + p->ph_offset
}
}
}
......@@ -8,6 +8,10 @@
#define _ELF_INT
#include <stdint.h>
#include <stddef.h>
#include "mem.h"
#include "string.h"
extern uint8_t elf_hello[] asm("_binary_hello_elf_start");
......@@ -32,7 +36,7 @@ typedef struct
uint16_t sh_entry_size;
uint16_t sh_entry_count;
uint16_t sh_name_index;
} __attribute__(packed) elf_header;
} __attribute__((packed)) elf_header;
typedef struct
{
......
......@@ -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
// 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;
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();
pgdir[page_start>>22][(page_start>>12)%1024] |= page;
page_table[((uint32_t)page_start>>12)%1024] |= (page_table_entry)page;
}
return page;
}
......
......@@ -33,7 +33,7 @@ extern char _kernel_end[];
// Allocation of pages
void* page_allocate();
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
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