2024-08-05 00:59:07 +02:00
|
|
|
#include <stdint.h>
|
|
|
|
#include <stddef.h>
|
|
|
|
#include <debugging.h>
|
|
|
|
#include <kernel/tty.h>
|
|
|
|
#include <kernel/gdt.h>
|
2024-08-22 13:41:51 +02:00
|
|
|
#include <kernel/task.h>
|
2024-08-08 21:34:30 +02:00
|
|
|
#include <debugging.h>
|
|
|
|
|
|
|
|
static void* memcpy(void* restrict dstptr, const void* restrict srcptr, size_t size) {
|
2024-08-13 15:24:17 +02:00
|
|
|
unsigned char* dst = (unsigned char*) dstptr;
|
|
|
|
const unsigned char* src = (const unsigned char*) srcptr;
|
|
|
|
for (size_t i = 0; i < size; i++)
|
|
|
|
dst[i] = src[i];
|
|
|
|
return dstptr;
|
2024-08-08 21:34:30 +02:00
|
|
|
}
|
2024-08-05 00:59:07 +02:00
|
|
|
|
2025-07-02 13:35:14 +02:00
|
|
|
void run_program(void* code, size_t code_length, void* data, size_t data_length, struct Heap_Block* code_block, struct Heap_Block* data_block)
|
2024-08-05 00:59:07 +02:00
|
|
|
{
|
2025-07-01 12:48:05 +02:00
|
|
|
// TODO: Replace following lines with malloc calls and paging calls
|
2025-07-02 13:35:14 +02:00
|
|
|
memcpy(code_block->data, code, code_length);
|
|
|
|
memcpy(data_block->data, data, data_length);
|
2024-08-08 21:34:30 +02:00
|
|
|
|
2024-08-22 13:41:51 +02:00
|
|
|
struct CPUState target = {
|
2025-07-02 13:35:14 +02:00
|
|
|
.eip = (size_t) 0x00400000,
|
|
|
|
.esp = (size_t) 0x00801000,
|
|
|
|
.eax = (size_t) 0x00800000,
|
|
|
|
.ebx = data_length,
|
|
|
|
.ecx = 0x00400000,
|
2024-08-22 13:41:51 +02:00
|
|
|
.edx = 0,
|
|
|
|
.cs = 0x18 | 0x3,
|
|
|
|
.ds = 0x20 | 0x3,
|
2025-06-27 23:55:47 +02:00
|
|
|
/// .cs = 0x08,
|
|
|
|
// .ds = 0x10,
|
2024-08-22 13:41:51 +02:00
|
|
|
.eflags = 0x0200,
|
2025-02-26 01:42:35 +01:00
|
|
|
.ebp = 0,
|
2024-08-22 13:41:51 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
struct Task task = {
|
|
|
|
.state = target,
|
2025-07-02 13:35:14 +02:00
|
|
|
.needs_pages = true,
|
|
|
|
.code = code_block,
|
|
|
|
.data = data_block,
|
2024-08-22 13:41:51 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
add_task(task);
|
2024-08-05 00:59:07 +02:00
|
|
|
}
|