mirror of
https://github.com/hermitcore/libhermit.git
synced 2025-03-30 00:00:15 +01:00
first changes to make dlsym and transparent addresses work
This commit is contained in:
parent
3ae9af5ca4
commit
907ccf4e2b
9 changed files with 1178 additions and 74 deletions
1089
Highlight test~
Normal file
1089
Highlight test~
Normal file
File diff suppressed because it is too large
Load diff
|
@ -36,12 +36,13 @@
|
|||
#include <asm/atomic.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/multiboot.h>
|
||||
#include <asm/uhyve.h>
|
||||
|
||||
#define GAP_BELOW 0x100000ULL
|
||||
#define IB_POOL_SIZE 0x400000ULL
|
||||
|
||||
#define IB_MEMORY_SIZE (1UL << 20)
|
||||
#define IB_MEMORY_NPAGES (IB_MEMORY_SIZE / PAGE_SIZE)
|
||||
/* #define IB_MEMORY_SIZE (1UL << 20) */
|
||||
/* #define IB_MEMORY_NPAGES (IB_MEMORY_SIZE / PAGE_SIZE) */
|
||||
|
||||
extern uint64_t base;
|
||||
extern uint64_t limit;
|
||||
|
@ -382,6 +383,7 @@ int memory_init(void)
|
|||
vma_add((size_t)host_logical_addr+phyaddr, (size_t)host_logical_addr+phyaddr+IB_POOL_SIZE, VMA_READ|VMA_WRITE|VMA_CACHEABLE);
|
||||
ib_pool_addr = (size_t)host_logical_addr+phyaddr;
|
||||
LOG_INFO("Map IB pool at 0x%zx\n", ib_pool_addr);
|
||||
uhyve_send(UHYVE_PORT_SET_IB_POOL_ADDR, (unsigned) virt_to_phys((size_t) &ib_pool_addr));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -392,31 +394,31 @@ oom:
|
|||
while(1) {HALT; }
|
||||
}
|
||||
|
||||
void * ib_memory_init(void)
|
||||
{
|
||||
size_t phyaddr, viraddr, bits;
|
||||
int err;
|
||||
/* void * ib_memory_init(void) */
|
||||
/* { */
|
||||
/* size_t phyaddr, viraddr, bits; */
|
||||
/* int err; */
|
||||
|
||||
phyaddr = (size_t) &kernel_end - IB_MEMORY_SIZE;
|
||||
bits = PG_RW|PG_GLOBAL|PG_NX;
|
||||
viraddr = vma_alloc(IB_MEMORY_NPAGES * PAGE_SIZE, VMA_READ|VMA_WRITE|VMA_CACHEABLE);
|
||||
if (BUILTIN_EXPECT(!viraddr, 0)) {
|
||||
LOG_INFO("BUILTIN_EXPECT failed: ib_memory_init 1\n");
|
||||
return NULL;
|
||||
}
|
||||
/* phyaddr = (size_t) &kernel_end - IB_MEMORY_SIZE; */
|
||||
/* bits = PG_RW|PG_GLOBAL|PG_NX; */
|
||||
/* viraddr = vma_alloc(IB_MEMORY_NPAGES * PAGE_SIZE, VMA_READ|VMA_WRITE|VMA_CACHEABLE); */
|
||||
/* if (BUILTIN_EXPECT(!viraddr, 0)) { */
|
||||
/* LOG_INFO("BUILTIN_EXPECT failed: ib_memory_init 1\n"); */
|
||||
/* return NULL; */
|
||||
/* } */
|
||||
|
||||
LOG_INFO("ib_memory_init, size: %lu\n", IB_MEMORY_SIZE);
|
||||
LOG_INFO("\tGuest Phys Start: %p\tEnd: %p\n", (uint8_t *) phyaddr, (uint8_t *) &kernel_end);
|
||||
/* LOG_INFO("\tHost Virt Start: %p\tEnd: %p\n", */
|
||||
/* phyaddr + host_kernel_start, (size_t) &kernel_end + host_kernel_start); */
|
||||
/* LOG_INFO("ib_memory_init, size: %lu\n", IB_MEMORY_SIZE); */
|
||||
/* LOG_INFO("\tGuest Phys Start: %p\tEnd: %p\n", (uint8_t *) phyaddr, (uint8_t *) &kernel_end); */
|
||||
/* [> LOG_INFO("\tHost Virt Start: %p\tEnd: %p\n", <] */
|
||||
/* [> phyaddr + host_kernel_start, (size_t) &kernel_end + host_kernel_start); <] */
|
||||
|
||||
err = page_map(viraddr, phyaddr, IB_MEMORY_NPAGES, bits);
|
||||
if (BUILTIN_EXPECT(err, 0)) {
|
||||
LOG_INFO("BUILTIN_EXPECT failed: ib_memory_init 2\n");
|
||||
vma_free(viraddr, viraddr + IB_MEMORY_NPAGES*PAGE_SIZE);
|
||||
return NULL;
|
||||
}
|
||||
/* err = page_map(viraddr, phyaddr, IB_MEMORY_NPAGES, bits); */
|
||||
/* if (BUILTIN_EXPECT(err, 0)) { */
|
||||
/* LOG_INFO("BUILTIN_EXPECT failed: ib_memory_init 2\n"); */
|
||||
/* vma_free(viraddr, viraddr + IB_MEMORY_NPAGES*PAGE_SIZE); */
|
||||
/* return NULL; */
|
||||
/* } */
|
||||
|
||||
LOG_INFO("ib_memory_init finished\n");
|
||||
return (void *) viraddr;
|
||||
}
|
||||
/* LOG_INFO("ib_memory_init finished\n"); */
|
||||
/* return (void *) viraddr; */
|
||||
/* } */
|
||||
|
|
|
@ -33,15 +33,15 @@
|
|||
|
||||
#include <hermit/verbs.h>
|
||||
|
||||
extern uint8_t * kernel_start_host;
|
||||
extern uint8_t * host_logical_addr;
|
||||
typedef enum {GUEST, HOST} addr_type;
|
||||
|
||||
inline size_t guest_to_host(size_t address) {
|
||||
return address ? virt_to_phys(address) + (size_t) kernel_start_host : address;
|
||||
return address ? virt_to_phys(address) + (size_t) host_logical_addr : address;
|
||||
}
|
||||
|
||||
inline size_t host_to_guest(size_t address) {
|
||||
return address ? phys_to_virt(address - (size_t) kernel_start_host) : address;
|
||||
return address ? phys_to_virt(address - (size_t) host_logical_addr) : address;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -67,6 +67,7 @@ extern const size_t image_size;
|
|||
#define UHYVE_PORT_LSEEK 0x504
|
||||
|
||||
// InfiniBand uhyve port IDs
|
||||
#define UHYVE_PORT_SET_IB_POOL_ADDR 0x609
|
||||
#define UHYVE_PORT_IBV_OPEN_DEVICE 0x610
|
||||
#define UHYVE_PORT_IBV_GET_DEVICE_LIST 0x611
|
||||
#define UHYVE_PORT_IBV_GET_DEVICE_NAME 0x612
|
||||
|
|
|
@ -202,6 +202,6 @@ struct ibv_comp_channel * ibv_create_comp_channel(struct ibv_context * context)
|
|||
|
||||
void kernel_ibv_log() {
|
||||
char log_message[128];
|
||||
ksprintf(log_message, "%p", kernel_start_host);
|
||||
ksprintf(log_message, "%p", host_logical_addr);
|
||||
uhyve_send(UHYVE_PORT_KERNEL_IBV_LOG, (unsigned) virt_to_phys((size_t) log_message));
|
||||
}
|
||||
|
|
|
@ -139,7 +139,7 @@ static int hermit_init(void)
|
|||
timer_init();
|
||||
multitasking_init();
|
||||
memory_init();
|
||||
ib_memory_init();
|
||||
/* ib_memory_init(); */
|
||||
signal_init();
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -45,20 +45,21 @@ void call_ibv_get_device_list(struct kvm_run * run, uint8_t * guest_mem) {
|
|||
*temp = 42;
|
||||
free(temp);
|
||||
|
||||
ib_malloc = true;
|
||||
unsigned data = *((unsigned *)((size_t)run+run->io.data_offset));
|
||||
uhyve_ibv_get_device_list_t * args = (uhyve_ibv_get_device_list_t *) (guest_mem + data);
|
||||
|
||||
printf("temp check 2\n");
|
||||
ib_malloc = true;
|
||||
temp = malloc(sizeof(int));
|
||||
*temp = 42;
|
||||
free(temp);
|
||||
|
||||
printf("LOG: UHYVE - call_ibv_get_device_list -- before ibv call\n");
|
||||
args->ret = ibv_get_device_list(args->num_devices);
|
||||
printf("LOG: UHYVE - call_ibv_get_device_list -- after ibv call\n");
|
||||
|
||||
ib_malloc = false;
|
||||
printf("LOG: UHYVE - call_ibv_get_device_list -- before ibv call\n");
|
||||
ib_malloc = true;
|
||||
args->ret = ibv_get_device_list(args->num_devices);
|
||||
ib_malloc = false;
|
||||
printf("LOG: UHYVE - call_ibv_get_device_list -- after ibv call\n");
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -28,14 +28,16 @@
|
|||
extern bool ib_malloc;
|
||||
|
||||
typedef enum {
|
||||
UHYVE_PORT_SET_IB_POOL_ADDR = 0x609,
|
||||
|
||||
UHYVE_PORT_IBV_OPEN_DEVICE = 0x610,
|
||||
UHYVE_PORT_IBV_GET_DEVICE_LIST = 0x611,
|
||||
UHYVE_PORT_IBV_GET_DEVICE_NAME = 0x612,
|
||||
UHYVE_PORT_IBV_QUERY_PORT = 0x613,
|
||||
UHYVE_PORT_IBV_CREATE_COMP_CHANNEL = 0x614,
|
||||
UHYVE_PORT_KERNEL_IBV_LOG = 0x615,
|
||||
} uhyve_ibv_t;
|
||||
|
||||
} uhyve_ibv_t;
|
||||
|
||||
typedef struct {
|
||||
// Parameters:
|
||||
|
|
|
@ -170,7 +170,8 @@
|
|||
#define IOAPIC_DEFAULT_BASE 0xfec00000
|
||||
#define APIC_DEFAULT_BASE 0xfee00000
|
||||
|
||||
/* #define IB_MEM_DEBUG */
|
||||
#define IB_POOL_SIZE 0x400000ULL
|
||||
#define IB_MEM_DEBUG
|
||||
|
||||
static bool restart = false;
|
||||
static bool cap_tsc_deadline = false;
|
||||
|
@ -222,30 +223,31 @@ typedef struct {
|
|||
} __attribute__ ((packed)) uhyve_cmdval_t;
|
||||
|
||||
|
||||
// DLSYM
|
||||
|
||||
|
||||
|
||||
|
||||
static uint8_t * ib_mem = NULL;
|
||||
/* static uint8_t * ib_pool_top = NULL; */
|
||||
/* uint64_t ib_pool_addr = 0; // TODO: static? */
|
||||
static uint8_t* ib_pool_addr = 0;
|
||||
static uint8_t* ib_pool_top = 0;
|
||||
bool ib_malloc = false;
|
||||
static const size_t std_alignment = 16; // TODO: Use sizeof(maxint_t) (?) or similar
|
||||
|
||||
|
||||
/* Redefining malloc */
|
||||
|
||||
static void * (* real_malloc) (size_t) = NULL;
|
||||
static void * (* real_realloc)(void *, size_t) = NULL;
|
||||
static void (* real_free) (void *) = NULL;
|
||||
/* static void (* real_free_alt) (void *) = NULL; */
|
||||
static void * (*real_malloc) (size_t) = NULL;
|
||||
static void * (*real_realloc)(void *, size_t) = NULL;
|
||||
static void (*real_free) (void *) = NULL;
|
||||
/* static void (*real_free_alt) (void *) = NULL; */
|
||||
|
||||
/*
|
||||
* init_ib_memalloc
|
||||
* init_ib_mem_functions
|
||||
*/
|
||||
|
||||
static void init_ib_memalloc(void)
|
||||
static void init_ib_mem_functions(void)
|
||||
{
|
||||
#ifdef IB_MEM_DEBUG
|
||||
printf("Entered init_ib_memalloc.\n");
|
||||
printf("Entered init_ib_mem_functions.\n");
|
||||
#endif
|
||||
real_malloc = dlsym(RTLD_NEXT, "malloc");
|
||||
real_realloc = dlsym(RTLD_NEXT, "realloc");
|
||||
|
@ -265,30 +267,30 @@ static void init_ib_memalloc(void)
|
|||
void * new_ib_malloc_region(size_t size)
|
||||
{
|
||||
#ifdef IB_MEM_DEBUG
|
||||
printf("Entered init_ib_memalloc.\n");
|
||||
printf("Entered new_ib_malloc_region.\n");
|
||||
#endif
|
||||
|
||||
void * result = NULL;
|
||||
|
||||
if (NULL == ib_mem) {
|
||||
if (0 == ib_pool_top || 0 == ib_pool_addr) {
|
||||
fprintf(stderr, "Error: ib_malloc called before ib_mem has been set.\n");
|
||||
}
|
||||
if (size > 0) {
|
||||
ib_mem -= size;
|
||||
ib_mem -= (size_t) ((uintptr_t) ib_mem % std_alignment);
|
||||
#ifdef IB_MEM_DEBUG
|
||||
printf("ib_mem aligned: %p\n", ib_mem);
|
||||
#endif
|
||||
result = ib_mem;
|
||||
|
||||
ib_mem -= std_alignment;
|
||||
size_t * block_size = (size_t *) ib_mem;
|
||||
size_t * block_size = (size_t *) ib_pool_top;
|
||||
*block_size = size;
|
||||
ib_pool_top += std_alignment;
|
||||
|
||||
result = ib_pool_top;
|
||||
ib_pool_top += size;
|
||||
ib_pool_top += (size_t) ((uintptr_t) ib_pool_top % std_alignment);
|
||||
#ifdef IB_MEM_DEBUG
|
||||
printf("ib_pool_top aligned: %p\n", ib_pool_top);
|
||||
#endif
|
||||
}
|
||||
|
||||
if ((uint8_t *) result < guest_mem + guest_size - (size_t) (1UL << 20)) { // TODO: remove this
|
||||
if (ib_pool_top > ib_pool_addr + IB_POOL_SIZE) { // TODO: make ib addr a uint8* as well?
|
||||
#ifdef IB_MEM_DEBUG
|
||||
printf("WARNING, IB MEM OUT OF BOUNDS\n\n");
|
||||
fprintf(stderr, "Error: IB Memory Pool overflow.\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -303,7 +305,7 @@ void * new_ib_malloc_region(size_t size)
|
|||
void * malloc(size_t size)
|
||||
{
|
||||
if (real_malloc == NULL) {
|
||||
init_ib_memalloc();
|
||||
init_ib_mem_functions();
|
||||
}
|
||||
|
||||
#ifdef IB_MEM_DEBUG
|
||||
|
@ -337,7 +339,7 @@ void * realloc(void * ptr, size_t new_size) {
|
|||
void * result;
|
||||
|
||||
if (ib_malloc) {
|
||||
size_t * mem_block_size_ptr = (size_t *) (ptr - std_alignment);
|
||||
size_t* mem_block_size_ptr = (size_t*) (ptr - std_alignment);
|
||||
size_t orig_size = *mem_block_size_ptr;
|
||||
|
||||
if (new_size <= 0 || ptr == NULL) {
|
||||
|
@ -374,19 +376,20 @@ void * realloc(void * ptr, size_t new_size) {
|
|||
|
||||
void free(void * ptr) {
|
||||
/* if (real_free == NULL) { */
|
||||
/* init_ib_memalloc(); */
|
||||
/* init_ib_mem_functions(); */
|
||||
/* } */
|
||||
|
||||
#ifdef IB_MEM_DEBUG
|
||||
printf(" ib_free_hook\tib_malloc %s\t Args:\tptr = %p\n", ib_malloc ? "true " : "false", ptr);
|
||||
printf(" real_free: %p\n", real_free);
|
||||
printf(" my own free: %p\n", free);
|
||||
/* printf(" ib_free_hook\tib_malloc %s\t Args:\tptr = %p\n", ib_malloc ? "true " : "false", ptr); */
|
||||
/* printf(" real_free: %p\n", real_free); */
|
||||
/* printf(" my own free: %p\n", free); */
|
||||
|
||||
/* printf(" real_free_alt: %p\n", real_free_alt); */
|
||||
#endif
|
||||
|
||||
if (!ib_malloc) {
|
||||
real_free(ptr);
|
||||
} else if (ptr != NULL && (ptr <= ib_mem || ptr > guest_mem + guest_size)) {
|
||||
} else if (ptr != NULL && (ptr <= ib_pool_addr || ptr >= ib_pool_addr + IB_POOL_SIZE)) {
|
||||
#ifdef IB_MEM_DEBUG
|
||||
printf("\t!!! ptr out of ib bounds !!!");
|
||||
#endif
|
||||
|
@ -1161,6 +1164,12 @@ static int vcpu_loop(void)
|
|||
}
|
||||
|
||||
// InfiniBand
|
||||
case UHYVE_PORT_SET_IB_POOL_ADDR:
|
||||
printf("LOG: UHYVE CASE\n");
|
||||
unsigned data = *((unsigned*)((size_t)run+run->io.data_offset));
|
||||
ib_pool_addr = (uint8_t*) *((uint64_t*) (guest_mem + data));
|
||||
ib_pool_top = ib_pool_addr;
|
||||
break;
|
||||
case UHYVE_PORT_IBV_GET_DEVICE_LIST:
|
||||
printf("LOG: UHYVE CASE\n");
|
||||
call_ibv_get_device_list(run, guest_mem);
|
||||
|
@ -1626,11 +1635,11 @@ int uhyve_init(char *path)
|
|||
err(1, "unable to initialized network");
|
||||
}
|
||||
|
||||
printf("UHYVE: Initialize malloc hooks (init_ib_hooks())\n");
|
||||
ib_mem = guest_mem + guest_size;
|
||||
printf("guest_mem: %p, guest_size: %p\n", guest_mem, guest_size);
|
||||
printf("ib_mem = guest_mem + guest_size: %p\n", ib_mem);
|
||||
/* init_ib_memalloc(); */
|
||||
/* printf("UHYVE: Initialize malloc hooks (init_ib_hooks())\n"); */
|
||||
/* ib_mem = guest_mem + guest_size; */
|
||||
/* printf("guest_mem: %p, guest_size: %p\n", guest_mem, guest_size); */
|
||||
/* printf("ib_mem = guest_mem + guest_size: %p\n", ib_mem); */
|
||||
/* init_ib_mem_functions(); */
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue