1
0
Fork 0
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:
Annika Wierichs 2018-01-17 00:47:54 +01:00
parent 3ae9af5ca4
commit 907ccf4e2b
9 changed files with 1178 additions and 74 deletions

1089
Highlight test~ Normal file

File diff suppressed because it is too large Load diff

View file

@ -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; */
/* } */

View file

@ -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;
}

View file

@ -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

View file

@ -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));
}

View file

@ -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;

View file

@ -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");
}

View file

@ -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:

View file

@ -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;
}