Kernel: Introduce skeleton Process class to hold process data
This commit is contained in:
parent
8809d02db3
commit
6d60acf0f1
13 changed files with 191 additions and 48 deletions
|
@ -10,6 +10,7 @@
|
|||
#include "core/arm/arm_interface.h"
|
||||
#include "core/core.h"
|
||||
#include "core/hle/kernel/kernel.h"
|
||||
#include "core/hle/kernel/process.h"
|
||||
#include "core/hle/kernel/thread.h"
|
||||
#include "core/hle/kernel/timer.h"
|
||||
|
||||
|
@ -149,18 +150,7 @@ void Shutdown() {
|
|||
Kernel::ThreadingShutdown();
|
||||
Kernel::TimersShutdown();
|
||||
g_handle_table.Clear(); // Free all kernel objects
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads executable stored at specified address
|
||||
* @entry_point Entry point in memory of loaded executable
|
||||
* @return True on success, otherwise false
|
||||
*/
|
||||
bool LoadExec(u32 entry_point) {
|
||||
// 0x30 is the typical main thread priority I've seen used so far
|
||||
g_main_thread = Kernel::SetupMainThread(Kernel::DEFAULT_STACK_SIZE, entry_point, THREADPRIO_DEFAULT);
|
||||
|
||||
return true;
|
||||
g_current_process = nullptr;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include <boost/intrusive_ptr.hpp>
|
||||
|
||||
#include <array>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
|
@ -15,6 +16,8 @@
|
|||
#include "core/hle/hle.h"
|
||||
#include "core/hle/result.h"
|
||||
|
||||
struct ApplicationInfo;
|
||||
|
||||
namespace Kernel {
|
||||
|
||||
class Thread;
|
||||
|
@ -282,11 +285,4 @@ void Init();
|
|||
/// Shutdown the kernel
|
||||
void Shutdown();
|
||||
|
||||
/**
|
||||
* Loads executable stored at specified address
|
||||
* @entry_point Entry point in memory of loaded executable
|
||||
* @return True on success, otherwise false
|
||||
*/
|
||||
bool LoadExec(u32 entry_point);
|
||||
|
||||
} // namespace
|
||||
|
|
35
src/core/hle/kernel/process.cpp
Normal file
35
src/core/hle/kernel/process.cpp
Normal file
|
@ -0,0 +1,35 @@
|
|||
// Copyright 2015 Citra Emulator Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#include "common/assert.h"
|
||||
|
||||
#include "core/hle/kernel/process.h"
|
||||
#include "core/hle/kernel/thread.h"
|
||||
|
||||
namespace Kernel {
|
||||
|
||||
SharedPtr<Process> Process::Create(std::string name, u64 program_id) {
|
||||
SharedPtr<Process> process(new Process);
|
||||
|
||||
process->svc_access_mask.set();
|
||||
process->name = std::move(name);
|
||||
process->program_id = program_id;
|
||||
|
||||
return process;
|
||||
}
|
||||
|
||||
void Process::ParseKernelCaps(const u32 * kernel_caps, size_t len) {
|
||||
//UNIMPLEMENTED();
|
||||
}
|
||||
|
||||
void Process::Run(VAddr entry_point, s32 main_thread_priority, u32 stack_size) {
|
||||
g_main_thread = Kernel::SetupMainThread(stack_size, entry_point, main_thread_priority);
|
||||
}
|
||||
|
||||
Kernel::Process::Process() {}
|
||||
Kernel::Process::~Process() {}
|
||||
|
||||
SharedPtr<Process> g_current_process;
|
||||
|
||||
}
|
61
src/core/hle/kernel/process.h
Normal file
61
src/core/hle/kernel/process.h
Normal file
|
@ -0,0 +1,61 @@
|
|||
// Copyright 2015 Citra Emulator Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <bitset>
|
||||
|
||||
#include <boost/container/static_vector.hpp>
|
||||
|
||||
#include "core/hle/kernel/kernel.h"
|
||||
#include "core/hle/result.h"
|
||||
|
||||
namespace Kernel {
|
||||
|
||||
struct StaticAddressMapping {
|
||||
// Address and size must be 4K-aligned
|
||||
VAddr address;
|
||||
u32 size;
|
||||
bool writable;
|
||||
};
|
||||
|
||||
enum class MemoryRegion {
|
||||
APPLICATION = 1,
|
||||
SYSTEM = 2,
|
||||
BASE = 3,
|
||||
};
|
||||
|
||||
class Process final : public Object {
|
||||
public:
|
||||
static SharedPtr<Process> Create(std::string name, u64 program_id);
|
||||
|
||||
std::string GetTypeName() const override { return "Process"; }
|
||||
std::string GetName() const override { return name; }
|
||||
|
||||
static const HandleType HANDLE_TYPE = HandleType::Process;
|
||||
HandleType GetHandleType() const override { return HANDLE_TYPE; }
|
||||
|
||||
std::string name; ///< Name of the process
|
||||
u64 program_id;
|
||||
|
||||
std::bitset<0x80> svc_access_mask;
|
||||
unsigned int handle_table_size = 0x200;
|
||||
boost::container::static_vector<StaticAddressMapping, 8> static_address_mappings; // TODO: Determine a good upper limit
|
||||
|
||||
bool loaded_high = false; // Application loaded high (not at 0x00100000)
|
||||
bool shared_page_writable = false;
|
||||
bool privileged_priority = false; // Can use priority levels higher than 24
|
||||
MemoryRegion memory_region = MemoryRegion::APPLICATION;
|
||||
|
||||
void ParseKernelCaps(const u32* kernel_caps, size_t len);
|
||||
void Run(VAddr entry_point, s32 main_thread_priority, u32 stack_size);
|
||||
|
||||
private:
|
||||
Process();
|
||||
~Process() override;
|
||||
};
|
||||
|
||||
extern SharedPtr<Process> g_current_process;
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue