#include <wchar.h>
#include <stdlib.h>
#include <kernel/kernel.h>
#include <kernel/sys.h>
#include <kernel/driver.h>
#include <kernel/hash.h>
#include <kernel/thread.h>
#include <kernel/proc.h>
#include <errno.h>
hashtable_t* sys_mtab;
extern thread_t thr_idle;
extern process_t proc_idle;
void msleep(dword ms)
{
dword end = sysUpTime() + ms;
enable();
while (sysUpTime() < end)
;
}
void* sysOpen(const wchar_t* filespec)
{
hashelem_t* elem = hashFind(sys_mtab, filespec);
if (elem)
return elem->data;
else
return NULL;
}
void sysMount(const wchar_t* path, void* ptr)
{
hashelem_t elem, *f;
f = hashFind(sys_mtab, path);
// hashInsert() doesn't copy elem.str if already found
if (f)
elem.str = path;
else
elem.str = wcsdup(path);
elem.data = ptr;
hashInsert(sys_mtab, &elem);
}
dword i386_docall(void* addr, void* params, size_t sizeof_params);
dword sysInvoke(void* ptr, dword method, dword* params, size_t sizeof_params)
{
dword *vtbl;//, ret;
dword (*func) (void*, dword, dword, dword);
//static dword temp[64];
//wprintf(L"sysInvoke(%p, %d, %p, %d)\n", ptr, method, params, sizeof_params);
if (ptr == NULL)
{
//_cputws(L"sysInvoke: ptr == NULL\n");
errno = EINVALID;
return 0;
}
vtbl = *((dword**) ptr);
if (vtbl == NULL)
{
errno = EINVALID;
return 0;
}
//wprintf(L"func = %p\n", vtbl[method]);
//asm("cli ; hlt");
func = (dword (*) (void*, dword, dword, dword)) vtbl[method];
return func(ptr, params[0], params[1], params[2]);
//temp[0] = (dword) ptr;
//memcpy(temp + 1, params, sizeof_params);
//ret = i386_docall((void*) vtbl[method], temp, sizeof_params + sizeof(dword));
//memcpy(params, temp + 1, sizeof_params);
//return ret;
}
dword sysUpTime()
{
return uptime;
}
void sysYield()
{
asm("mov $2,%eax ; int $0x30");
}
void INIT_CODE sysInit()
{
sys_mtab = hashCreate(31);
}
void devCleanup();
bool keShutdown(dword flags)
{
word idtr[3] = { 0, 0, 0 };
/*while (thr_last != &thr_idle)
{
wprintf(L"Shutting down process %d...", thr_last->process->id);
procTerminate(thr_last->process);
_cputws(L"done\n");
}*/
//devCleanup();
//procDelete(&proc_idle);
switch (flags & 1)
{
case SHUTDOWN_REBOOT:
asm("lidt (%0); int $0" : : "p" (idtr));
/* reboot failed? */
return false;
case SHUTDOWN_POWEROFF:
halt(flags);
return false;
}
return true;
}