Files
2016-03-02 22:34:57 -05:00

103 lines
3.3 KiB
C

/* -*- mode:c; c-file-style:"k&r"; c-basic-offset: 4; tab-width:4; indent-tabs-mode:nil; mode:auto-fill; fill-column:78; -*- */
/* vim: set ts=4 sw=4 et tw=78 fo=cqt wm=0: */
#include "pal.h"
#include "pal_debug.h"
#include "api.h"
#define UNIT pal_control.alloc_align
static volatile int count = 0;
void handler (PAL_PTR event, PAL_NUM arg, PAL_CONTEXT * context)
{
count++;
pal_printf("Memory Fault %d\n", count);
while (*(unsigned char *) context->rip != 0x90)
context->rip++;
DkExceptionReturn(event);
}
int main (int argc, char ** argv, char ** envp)
{
volatile int c;
DkSetExceptionHandler(handler, PAL_EVENT_MEMFAULT, 0);
void * mem1 = (void *) DkVirtualMemoryAlloc(NULL, UNIT * 4, 0,
PAL_PROT_READ|PAL_PROT_WRITE);
if (mem1)
pal_printf("Memory Allocation OK\n");
void * mem2 = (void *) DkVirtualMemoryAlloc(NULL, UNIT, 0,
PAL_PROT_READ|PAL_PROT_WRITE);
if (mem2) {
c = count;
*(volatile int *) mem2 = 0;
pal_printf("(int *) %p = %d\n", mem2, *(volatile int *) mem2);
if (c == count)
pal_printf("Memory Allocation Protection (RW) OK\n");
DkVirtualMemoryProtect(mem2, UNIT, PAL_PROT_READ);
c = count;
*(volatile int *) mem2 = 0;
asm volatile("nop");
if (c == count - 1)
pal_printf("Memory Protection (R) OK\n");
DkVirtualMemoryFree(mem2, UNIT);
c = count;
*(volatile int *) mem2 = 0;
asm volatile("nop");
if (c == count - 1)
pal_printf("Memory Deallocation OK\n");
}
void * mem3 = (void *) pal_control.user_address.start;
void * mem4 = (void *) pal_control.user_address.end - UNIT;
if (mem3 >= pal_control.executable_range.start &&
mem3 < pal_control.executable_range.end)
mem3 = (void *) (((PAL_NUM) pal_control.executable_range.end + UNIT - 1) & ~(UNIT - 1));
mem3 = (void *) DkVirtualMemoryAlloc(mem3, UNIT, 0,
PAL_PROT_READ|PAL_PROT_WRITE);
mem4 = (void *) DkVirtualMemoryAlloc(mem4, UNIT, 0,
PAL_PROT_READ|PAL_PROT_WRITE);
if (mem3 && mem4)
pal_printf("Memory Allocation with Address OK\n");
/* total memory */
pal_printf("Total Memory: %llu\n", pal_control.mem_info.mem_total);
unsigned long before = DkMemoryAvailableQuota();
void * mem5 = (void *) DkVirtualMemoryAlloc(NULL, UNIT * 1000, 0,
PAL_PROT_READ|PAL_PROT_WRITE);
if (mem5) {
unsigned long after = before;
for (int i = 0 ; i < 10000 ; i++) {
for (void * ptr = mem5 ; ptr < mem5 + UNIT * 1000 ; ptr += UNIT)
*(volatile int *) ptr = 0;
unsigned long quota = DkMemoryAvailableQuota();
if (quota < after)
after = quota;
}
pal_printf("Memory Qouta Before Allocation: %ld\n", before);
pal_printf("Memory Qouta After Allocation: %ld\n", after);
/* chance are some pages are evicted, so at least 80% accuracy */
if (before >= after + UNIT * 800)
pal_printf("Get Memory Available Quota OK\n");
}
return 0;
}