diff --git a/arch/aarch64/kernel/entry.S b/arch/aarch64/kernel/entry.S index 659dc0572..7eb570a9c 100644 --- a/arch/aarch64/kernel/entry.S +++ b/arch/aarch64/kernel/entry.S @@ -290,7 +290,10 @@ _setup_pgtable: cmp x0, 0 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 */ add x0, x0, 0x10000 mov x1, ~0xFFFF diff --git a/arch/aarch64/mm/memory.c b/arch/aarch64/mm/memory.c index 85d78779c..3b89e94bc 100644 --- a/arch/aarch64/mm/memory.c +++ b/arch/aarch64/mm/memory.c @@ -51,7 +51,9 @@ typedef struct free_list { * maintaining a value, rather their address is their value. */ 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; @@ -245,7 +247,6 @@ void page_free(void* viraddr, size_t sz) int memory_init(void) { - size_t image_sz = (size_t) &kernel_end - (size_t) &kernel_start; int ret = 0; // enable paging and map Multiboot modules etc. @@ -255,22 +256,22 @@ int memory_init(void) 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 atomic_int64_add(&total_pages, (limit-base) >> PAGE_BITS); atomic_int64_add(&total_available_pages, (limit-base) >> PAGE_BITS); //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) init_list.end = limit; else init_list.end = GICD_BASE; // 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_sub(&total_available_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_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); diff --git a/arch/aarch64/mm/page.c b/arch/aarch64/mm/page.c index 75af10b0a..f578a6600 100644 --- a/arch/aarch64/mm/page.c +++ b/arch/aarch64/mm/page.c @@ -48,7 +48,6 @@ /* Note that linker symbols are not variables, they have no memory * allocated for maintaining a value, rather their address is their value. */ extern const void kernel_start; -extern const void kernel_end; extern size_t l0_pgtable; diff --git a/tools/uhyve-aarch64.c b/tools/uhyve-aarch64.c index 2a4d635c2..80676a7db 100644 --- a/tools/uhyve-aarch64.c +++ b/tools/uhyve-aarch64.c @@ -366,8 +366,8 @@ int load_kernel(uint8_t* mem, char* path) Elf64_Ehdr hdr; Elf64_Phdr *phdr = NULL; size_t buflen; + size_t pstart = 0; int fd, ret; - int first_load = 1; fd = open(path, O_RDONLY); if (fd == -1) @@ -432,8 +432,8 @@ int load_kernel(uint8_t* mem, char* path) mboot = mem+paddr-GUEST_OFFSET; //fprintf(stderr, "mboot at %p, klog at %p\n", mboot, klog); - if (first_load) { - first_load = 0; + if (!pstart) { + pstart = paddr; // initialize kernel *((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) *((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;