CPU skeleton.
This commit is contained in:
@@ -19,6 +19,7 @@ typedef struct xe_kernel {
|
||||
|
||||
xe_pal_ref pal;
|
||||
xe_memory_ref memory;
|
||||
xe_cpu_ref cpu;
|
||||
xe_kernel_export_resolver_ref export_resolver;
|
||||
|
||||
struct {
|
||||
@@ -29,7 +30,7 @@ typedef struct xe_kernel {
|
||||
} xe_kernel_t;
|
||||
|
||||
|
||||
xe_kernel_ref xe_kernel_create(xe_pal_ref pal, xe_memory_ref memory,
|
||||
xe_kernel_ref xe_kernel_create(xe_pal_ref pal, xe_cpu_ref cpu,
|
||||
xe_kernel_options_t options) {
|
||||
xe_kernel_ref kernel = (xe_kernel_ref)xe_calloc(sizeof(xe_kernel));
|
||||
xe_ref_init((xe_ref)kernel);
|
||||
@@ -37,23 +38,27 @@ xe_kernel_ref xe_kernel_create(xe_pal_ref pal, xe_memory_ref memory,
|
||||
xe_copy_struct(&kernel->options, &options, sizeof(xe_kernel_options_t));
|
||||
|
||||
kernel->pal = xe_pal_retain(pal);
|
||||
kernel->memory = xe_memory_retain(memory);
|
||||
kernel->memory = xe_cpu_get_memory(cpu);
|
||||
kernel->cpu = xe_cpu_retain(cpu);
|
||||
kernel->export_resolver = xe_kernel_export_resolver_create();
|
||||
|
||||
kernel->modules.xam =
|
||||
xe_xam_create(pal, memory, kernel->export_resolver);
|
||||
xe_xam_create(kernel->pal, kernel->memory, kernel->export_resolver);
|
||||
kernel->modules.xbdm =
|
||||
xe_xbdm_create(pal, memory, kernel->export_resolver);
|
||||
xe_xbdm_create(kernel->pal, kernel->memory, kernel->export_resolver);
|
||||
kernel->modules.xboxkrnl =
|
||||
xe_xboxkrnl_create(pal, memory, kernel->export_resolver);
|
||||
xe_xboxkrnl_create(kernel->pal, kernel->memory, kernel->export_resolver);
|
||||
|
||||
return kernel;
|
||||
}
|
||||
|
||||
void xe_kernel_dealloc(xe_kernel_ref kernel) {
|
||||
xe_xboxkrnl_release(kernel->modules.xboxkrnl);
|
||||
xe_xbdm_release(kernel->modules.xbdm);
|
||||
xe_xam_release(kernel->modules.xam);
|
||||
|
||||
xe_kernel_export_resolver_release(kernel->export_resolver);
|
||||
xe_cpu_release(kernel->cpu);
|
||||
xe_memory_release(kernel->memory);
|
||||
xe_pal_release(kernel->pal);
|
||||
}
|
||||
@@ -75,6 +80,10 @@ xe_memory_ref xe_kernel_get_memory(xe_kernel_ref kernel) {
|
||||
return xe_memory_retain(kernel->memory);
|
||||
}
|
||||
|
||||
xe_cpu_ref xe_kernel_get_cpu(xe_kernel_ref kernel) {
|
||||
return xe_cpu_retain(kernel->cpu);
|
||||
}
|
||||
|
||||
const xechar_t *xe_kernel_get_command_line(xe_kernel_ref kernel) {
|
||||
return kernel->options.command_line;
|
||||
}
|
||||
@@ -112,13 +121,37 @@ xe_module_ref xe_kernel_load_module(xe_kernel_ref kernel,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// stash in modules list
|
||||
// Prepare the module.
|
||||
XEEXPECTZERO(xe_cpu_prepare_module(kernel->cpu, module));
|
||||
|
||||
// Stash in modules list (takes reference).
|
||||
// TODO(benvanik): stash in list.
|
||||
return xe_module_retain(module);
|
||||
|
||||
XECLEANUP:
|
||||
xe_module_release(module);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void xe_kernel_launch_module(xe_kernel_ref kernel, xe_module_ref module) {
|
||||
//
|
||||
//const xe_xex2_header_t *xex_header = xe_module_get_xex_header(module);
|
||||
|
||||
// TODO(benvanik): set as main module/etc
|
||||
// xekXexExecutableModuleHandle = xe_module_get_handle(module);
|
||||
|
||||
// XEEXPECTTRUE(XECPUPrepareModule(XEGetCPU(), module->xex, module->pe, module->address_space, module->address_space_size));
|
||||
|
||||
// Setup the heap (and TLS?).
|
||||
// xex_header->exe_heap_size;
|
||||
|
||||
// Launch thread.
|
||||
// XHANDLE thread_handle;
|
||||
// XDWORD thread_id;
|
||||
// XBOOL result = xekExCreateThread(&thread_handle, xex_header->exe_stack_size, &thread_id, NULL, (void*)xex_header->exe_entry_point, NULL, 0);
|
||||
|
||||
// Wait until thread completes.
|
||||
// XLARGE_INTEGER timeout = XINFINITE;
|
||||
// xekNtWaitForSingleObjectEx(thread_handle, TRUE, &timeout);
|
||||
}
|
||||
|
||||
xe_module_ref xe_kernel_get_module(xe_kernel_ref kernel, const xechar_t *path) {
|
||||
|
||||
Reference in New Issue
Block a user