X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fpalacios-stubs.c;h=a7f1607d779c5852eb69ddd3f03d7b0491618092;hb=2a666e7e1a1aac879f68bc2662675bdf57b66678;hp=72604d3cb4aa7a9d9a8f911fac6f5a9e10125012;hpb=4a63fd4cef38da57f4b44d8ac88737faa0a12846;p=palacios.git diff --git a/linux_module/palacios-stubs.c b/linux_module/palacios-stubs.c index 72604d3..a7f1607 100644 --- a/linux_module/palacios-stubs.c +++ b/linux_module/palacios-stubs.c @@ -168,6 +168,11 @@ void palacios_print_scoped(void * vm, int vcore, const char *fmt, ...) { void *palacios_allocate_pages(int num_pages, unsigned int alignment) { void * pg_addr = NULL; + if (num_pages<=0) { + ERROR("ALERT ALERT Attempt to allocate zero or fewer pages\n"); + return NULL; + } + pg_addr = (void *)alloc_palacios_pgs(num_pages, alignment); if (!pg_addr) { @@ -201,6 +206,14 @@ void * palacios_alloc_extended(unsigned int size, unsigned int flags) { void * addr = NULL; + if (size==0) { + // note that modern kernels will respond to a zero byte + // kmalloc and return the address 0x10... In Palacios, + // we will simply not allow 0 byte allocs at all, of any kind + ERROR("ALERT ALERT attempt to kmalloc zero bytes rejected\n"); + return NULL; + } + addr = kmalloc(size+2*ALLOC_PAD, flags); if (!addr) { @@ -214,7 +227,7 @@ palacios_alloc_extended(unsigned int size, unsigned int flags) { memset(addr,0,size+2*ALLOC_PAD); #endif - MEMCHECK_KMALLOC(addr+ALLOC_PAD,size+2*ALLOC_PAD); + MEMCHECK_KMALLOC(addr,size+2*ALLOC_PAD); return addr+ALLOC_PAD; } @@ -224,6 +237,11 @@ palacios_valloc(unsigned int size) { void * addr = NULL; + if (size==0) { + ERROR("ALERT ALERT attempt to vmalloc zero bytes rejected\n"); + return NULL; + } + addr = vmalloc(size); if (!addr) { @@ -667,6 +685,17 @@ void palacios_mutex_init(void *mutex) } } +void palacios_mutex_deinit(void *mutex) +{ + spinlock_t *lock = (spinlock_t*)mutex; + + if (lock) { + // no actual spin_lock_deinit on linux + // our purpose here is to drive the lock checker + LOCKCHECK_FREE(lock); + } +} + /** * Frees a mutex. @@ -682,8 +711,10 @@ palacios_mutex_free(void * mutex) { */ void palacios_mutex_lock(void * mutex, int must_spin) { + + LOCKCHECK_LOCK_PRE(mutex); spin_lock((spinlock_t *)mutex); - LOCKCHECK_LOCK(mutex); + LOCKCHECK_LOCK_POST(mutex); } @@ -695,8 +726,9 @@ palacios_mutex_lock_irqsave(void * mutex, int must_spin) { unsigned long flags; + LOCKCHECK_LOCK_IRQSAVE_PRE(mutex,flags); spin_lock_irqsave((spinlock_t *)mutex,flags); - LOCKCHECK_LOCK_IRQSAVE(mutex,flags); + LOCKCHECK_LOCK_IRQSAVE_POST(mutex,flags); return (void *)flags; } @@ -710,8 +742,9 @@ palacios_mutex_unlock( void * mutex ) { + LOCKCHECK_UNLOCK_PRE(mutex); spin_unlock((spinlock_t *)mutex); - LOCKCHECK_UNLOCK(mutex); + LOCKCHECK_UNLOCK_POST(mutex); } @@ -721,9 +754,10 @@ palacios_mutex_unlock( void palacios_mutex_unlock_irqrestore(void *mutex, void *flags) { + LOCKCHECK_UNLOCK_IRQRESTORE_PRE(mutex,(unsigned long)flags); // This is correct, flags is opaque spin_unlock_irqrestore((spinlock_t *)mutex,(unsigned long)flags); - LOCKCHECK_UNLOCK_IRQRESTORE(mutex,(unsigned long)flags); + LOCKCHECK_UNLOCK_IRQRESTORE_POST(mutex,(unsigned long)flags); } /**