1
0
Fork 0
mirror of https://github.com/hermitcore/libhermit.git synced 2025-03-30 00:00:15 +01:00

remove dependency from kernel_end

- the new version binutils will remove the mark kernel_end

=> remove the usage of this mark
This commit is contained in:
Stefan Lankes 2018-06-13 19:40:38 +00:00
parent 0da5a822b9
commit c48461b796
4 changed files with 15 additions and 12 deletions

View file

@ -290,7 +290,10 @@ _setup_pgtable:
cmp x0, 0 cmp x0, 0
b.ne 4f b.ne 4f
ldr x0, =kernel_end ldr x0, =kernel_start
ldr x1, =image_size
ldr x1, [x1]
add x0, x0, x1
/* align to a 16KByte boundary */ /* align to a 16KByte boundary */
add x0, x0, 0x10000 add x0, x0, 0x10000
mov x1, ~0xFFFF mov x1, ~0xFFFF

View file

@ -51,7 +51,9 @@ typedef struct free_list {
* maintaining a value, rather their address is their value. * maintaining a value, rather their address is their value.
*/ */
extern const void kernel_start; extern const void kernel_start;
extern const void kernel_end;
// defined in entry.S
extern size_t image_size;
static spinlock_t list_lock = SPINLOCK_INIT; static spinlock_t list_lock = SPINLOCK_INIT;
@ -245,7 +247,6 @@ void page_free(void* viraddr, size_t sz)
int memory_init(void) int memory_init(void)
{ {
size_t image_sz = (size_t) &kernel_end - (size_t) &kernel_start;
int ret = 0; int ret = 0;
// enable paging and map Multiboot modules etc. // enable paging and map Multiboot modules etc.
@ -255,22 +256,22 @@ int memory_init(void)
return ret; return ret;
} }
LOG_INFO("memory_init: base 0x%zx, image_size 0x%zx, limit 0x%zx\n", base, image_sz, limit); LOG_INFO("memory_init: base 0x%zx, image_size 0x%zx, limit 0x%zx\n", base, image_size, limit);
// determine available memory // determine available memory
atomic_int64_add(&total_pages, (limit-base) >> PAGE_BITS); atomic_int64_add(&total_pages, (limit-base) >> PAGE_BITS);
atomic_int64_add(&total_available_pages, (limit-base) >> PAGE_BITS); atomic_int64_add(&total_available_pages, (limit-base) >> PAGE_BITS);
//initialize free list //initialize free list
init_list.start = PAGE_FLOOR((size_t) &kernel_end + (16+511)*PAGE_SIZE); init_list.start = PAGE_FLOOR((size_t) &kernel_start + image_size + (16+511)*PAGE_SIZE);
if (limit < GICD_BASE) if (limit < GICD_BASE)
init_list.end = limit; init_list.end = limit;
else else
init_list.end = GICD_BASE; init_list.end = GICD_BASE;
// determine allocated memory, we use 2MB pages to map the kernel // determine allocated memory, we use 2MB pages to map the kernel
atomic_int64_add(&total_allocated_pages, PAGE_FLOOR((size_t) &kernel_end + 511*PAGE_SIZE) >> PAGE_BITS); atomic_int64_add(&total_allocated_pages, PAGE_FLOOR((size_t) &kernel_start + image_size + 511*PAGE_SIZE) >> PAGE_BITS);
atomic_int64_sub(&total_available_pages, PAGE_FLOOR((size_t) &kernel_end + 511*PAGE_SIZE) >> PAGE_BITS); atomic_int64_sub(&total_available_pages, PAGE_FLOOR((size_t) &kernel_start + image_size + 511*PAGE_SIZE) >> PAGE_BITS);
LOG_INFO("free list starts at 0x%zx, limit 0x%zx\n", init_list.start, init_list.end); LOG_INFO("free list starts at 0x%zx, limit 0x%zx\n", init_list.start, init_list.end);

View file

@ -48,7 +48,6 @@
/* Note that linker symbols are not variables, they have no memory /* Note that linker symbols are not variables, they have no memory
* allocated for maintaining a value, rather their address is their value. */ * allocated for maintaining a value, rather their address is their value. */
extern const void kernel_start; extern const void kernel_start;
extern const void kernel_end;
extern size_t l0_pgtable; extern size_t l0_pgtable;

View file

@ -366,8 +366,8 @@ int load_kernel(uint8_t* mem, char* path)
Elf64_Ehdr hdr; Elf64_Ehdr hdr;
Elf64_Phdr *phdr = NULL; Elf64_Phdr *phdr = NULL;
size_t buflen; size_t buflen;
size_t pstart = 0;
int fd, ret; int fd, ret;
int first_load = 1;
fd = open(path, O_RDONLY); fd = open(path, O_RDONLY);
if (fd == -1) if (fd == -1)
@ -432,8 +432,8 @@ int load_kernel(uint8_t* mem, char* path)
mboot = mem+paddr-GUEST_OFFSET; mboot = mem+paddr-GUEST_OFFSET;
//fprintf(stderr, "mboot at %p, klog at %p\n", mboot, klog); //fprintf(stderr, "mboot at %p, klog at %p\n", mboot, klog);
if (first_load) { if (!pstart) {
first_load = 0; pstart = paddr;
// initialize kernel // initialize kernel
*((uint64_t*) (mem+paddr-GUEST_OFFSET + 0x100)) = paddr; // physical start address *((uint64_t*) (mem+paddr-GUEST_OFFSET + 0x100)) = paddr; // physical start address
@ -480,7 +480,7 @@ int load_kernel(uint8_t* mem, char* path)
if (verbose) if (verbose)
*((uint32_t*) (mem+paddr-GUEST_OFFSET + 0x174)) = (uint32_t) UHYVE_UART_PORT; *((uint32_t*) (mem+paddr-GUEST_OFFSET + 0x174)) = (uint32_t) UHYVE_UART_PORT;
} }
*((uint64_t*) (mem+paddr-GUEST_OFFSET + 0x158)) += memsz; // total kernel size *((uint64_t*) (mem+pstart-GUEST_OFFSET + 0x158)) = paddr + memsz - pstart; // total kernel size
} }
ret = 0; ret = 0;