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:
parent
0da5a822b9
commit
c48461b796
4 changed files with 15 additions and 12 deletions
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue