Defines the memory interface and adds a dump_memory function.
This commit is contained in:
parent
d4129cce0e
commit
c404e99e59
2 changed files with 108 additions and 26 deletions
|
@ -2,6 +2,49 @@
|
|||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
void vm_assert(int assertion, const char *msg)
|
||||
{
|
||||
if(assertion != 0)
|
||||
return;
|
||||
printf("Assertion failed: %s\n", msg);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void vm_syscall(Process *p, CommandInfo *info)
|
||||
{
|
||||
switch(info->additional)
|
||||
{
|
||||
case 0: // EXIT
|
||||
p->tag = NULL;
|
||||
break;
|
||||
case 1:
|
||||
printf("%c", info->input0);
|
||||
break;
|
||||
case 2:
|
||||
printf("%d", info->input0);
|
||||
break;
|
||||
default:
|
||||
printf("Some syscall: (%d, %d, %d, %d)\n",
|
||||
info->input0,
|
||||
info->input1,
|
||||
info->argument,
|
||||
info->additional);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void vm_hwio(Process *p, CommandInfo *info)
|
||||
{
|
||||
printf("Some hardware IO: (%d, %d, %d, %d)\n",
|
||||
info->input0,
|
||||
info->input1,
|
||||
info->argument,
|
||||
info->additional);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void dump_proc(Process *process)
|
||||
{
|
||||
|
@ -27,30 +70,32 @@ void dump_proc(Process *process)
|
|||
printf("]\n");
|
||||
}
|
||||
|
||||
void vm_assert(int assertion, const char *msg)
|
||||
void dump_memory(Process *process)
|
||||
{
|
||||
if(assertion != 0)
|
||||
return;
|
||||
printf("Assertion failed: %s\n", msg);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void vm_syscall(Process *p, CommandInfo *info)
|
||||
{
|
||||
printf("Some syscall: (%d, %d, %d, %d)\n",
|
||||
info->input0,
|
||||
info->input1,
|
||||
info->argument,
|
||||
info->additional);
|
||||
}
|
||||
|
||||
void vm_hwio(Process *p, CommandInfo *info)
|
||||
{
|
||||
printf("Some hardware IO: (%d, %d, %d, %d)\n",
|
||||
info->input0,
|
||||
info->input1,
|
||||
info->argument,
|
||||
info->additional);
|
||||
printf("Memory Dump:\n");
|
||||
|
||||
for(int i = 0; i < process->mmap.length; i++) {
|
||||
printf("Page %d\n", i);
|
||||
|
||||
// Just assume that pageSize is a multiple of 16
|
||||
for(int j = 0; j < process->mmap.pageSize; j++) {
|
||||
if(j % 16 == 0)
|
||||
printf("%3x ", j);
|
||||
|
||||
printf("%2.2X ", process->mmap.pages[i][j]);
|
||||
|
||||
if(j % 16 == 15) {
|
||||
printf(" '");
|
||||
for(int x = 16*(j/16); x < 16*(j/16+1); x++) {
|
||||
char c = process->mmap.pages[i][x];
|
||||
if(c < 0x20) c = '.';
|
||||
if(c > 0x7E) c = '.';
|
||||
printf("%c", c);
|
||||
}
|
||||
printf("'\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, const char **argv)
|
||||
|
@ -92,14 +137,42 @@ int main(int argc, const char **argv)
|
|||
c.execZ);
|
||||
}
|
||||
|
||||
Process process = { &module, 0, 0, 0, 0 };
|
||||
Process *p = &process;
|
||||
uint8_t page0[64];
|
||||
uint8_t page1[64];
|
||||
|
||||
strcpy((char*)page0, "Hallo Welt!");
|
||||
|
||||
uint8_t *mmapDirectory[2] = {
|
||||
page0,
|
||||
page1,
|
||||
};
|
||||
|
||||
VirtualMemoryMap mmap = {
|
||||
.pageSize = 64,
|
||||
.length = 2,
|
||||
.pages = mmapDirectory,
|
||||
};
|
||||
|
||||
Process process = {
|
||||
&module,
|
||||
.codePointer = 0,
|
||||
.stackPointer = 0,
|
||||
.basePointer = 0,
|
||||
.flags = 0,
|
||||
.mmap = mmap,
|
||||
};
|
||||
|
||||
Process *p = &process;
|
||||
p->tag = p;
|
||||
|
||||
dump_memory(p);
|
||||
dump_proc(p);
|
||||
while(vm_step_process(p)) {
|
||||
|
||||
while(vm_step_process(p) && p->tag) {
|
||||
dump_proc(p);
|
||||
}
|
||||
dump_proc(p);
|
||||
dump_memory(p);
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -83,6 +83,13 @@ typedef struct
|
|||
uint32_t length;
|
||||
} Module;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t pageSize;
|
||||
uint32_t length;
|
||||
uint8_t **pages;
|
||||
} VirtualMemoryMap;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
Module *module;
|
||||
|
@ -94,6 +101,8 @@ typedef struct
|
|||
uint32_t flags;
|
||||
|
||||
uint32_t stack[VM_STACKSIZE];
|
||||
|
||||
VirtualMemoryMap mmap;
|
||||
} Process;
|
||||
|
||||
typedef struct
|
||||
|
|
Loading…
Reference in a new issue