2023-03-16 22:44:58 +01:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "ELF.h"
|
|
|
|
#include "arch/CPU.h"
|
|
|
|
#include "arch/MMU.h"
|
|
|
|
#include "fs/VFS.h"
|
2023-07-09 20:38:04 +02:00
|
|
|
#include "memory/AddressSpace.h"
|
2023-03-18 23:45:48 +01:00
|
|
|
#include "thread/Thread.h"
|
2023-03-16 22:44:58 +01:00
|
|
|
#include <luna/LinkedList.h>
|
|
|
|
#include <luna/OwnedPtr.h>
|
|
|
|
#include <luna/Result.h>
|
|
|
|
#include <luna/Stack.h>
|
2023-04-07 14:37:06 +02:00
|
|
|
#include <luna/String.h>
|
2023-04-07 14:36:24 +02:00
|
|
|
#include <luna/Vector.h>
|
2023-03-16 22:44:58 +01:00
|
|
|
|
|
|
|
class Thread;
|
|
|
|
|
|
|
|
class ThreadImage
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
static Result<OwnedPtr<ThreadImage>> try_load_from_elf(SharedPtr<VFS::Inode> inode);
|
|
|
|
|
2023-03-18 23:45:48 +01:00
|
|
|
static Result<OwnedPtr<ThreadImage>> clone_from_thread(Thread* parent);
|
|
|
|
|
2023-03-18 22:25:19 +01:00
|
|
|
Result<u64> push_mem_on_stack(const u8* mem, usize size);
|
2023-04-07 14:36:24 +02:00
|
|
|
Result<u64> push_string_vector_on_stack(const Vector<String>& vec);
|
2023-03-18 22:25:19 +01:00
|
|
|
|
2023-03-16 22:44:58 +01:00
|
|
|
void apply(Thread* thread);
|
|
|
|
|
|
|
|
private:
|
2023-07-09 20:38:04 +02:00
|
|
|
OwnedPtr<AddressSpace> m_address_space;
|
2023-03-16 22:44:58 +01:00
|
|
|
Stack m_user_stack;
|
|
|
|
Stack m_kernel_stack;
|
|
|
|
ELFData m_loaded_image_data;
|
2023-03-18 22:25:19 +01:00
|
|
|
u64 m_sp;
|
2023-03-16 22:44:58 +01:00
|
|
|
};
|