kernel: Move CodeSet structure to its own source files
Given this is utilized by the loaders, this allows avoiding inclusion of the kernel process definitions where avoidable. This also keeps the loading format for all executable data separate from the kernel objects.
This commit is contained in:
parent
9d11303a36
commit
1b6bd9d6df
8 changed files with 110 additions and 44 deletions
|
@ -107,6 +107,8 @@ add_library(core STATIC
|
||||||
hle/kernel/client_port.h
|
hle/kernel/client_port.h
|
||||||
hle/kernel/client_session.cpp
|
hle/kernel/client_session.cpp
|
||||||
hle/kernel/client_session.h
|
hle/kernel/client_session.h
|
||||||
|
hle/kernel/code_set.cpp
|
||||||
|
hle/kernel/code_set.h
|
||||||
hle/kernel/errors.h
|
hle/kernel/errors.h
|
||||||
hle/kernel/handle_table.cpp
|
hle/kernel/handle_table.cpp
|
||||||
hle/kernel/handle_table.h
|
hle/kernel/handle_table.h
|
||||||
|
|
12
src/core/hle/kernel/code_set.cpp
Normal file
12
src/core/hle/kernel/code_set.cpp
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
// Copyright 2019 yuzu emulator team
|
||||||
|
// Licensed under GPLv2 or any later version
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include "core/hle/kernel/code_set.h"
|
||||||
|
|
||||||
|
namespace Kernel {
|
||||||
|
|
||||||
|
CodeSet::CodeSet() = default;
|
||||||
|
CodeSet::~CodeSet() = default;
|
||||||
|
|
||||||
|
} // namespace Kernel
|
90
src/core/hle/kernel/code_set.h
Normal file
90
src/core/hle/kernel/code_set.h
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
// Copyright 2019 yuzu emulator team
|
||||||
|
// Licensed under GPLv2 or any later version
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <memory>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "common/common_types.h"
|
||||||
|
|
||||||
|
namespace Kernel {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents executable data that may be loaded into a kernel process.
|
||||||
|
*
|
||||||
|
* A code set consists of three basic segments:
|
||||||
|
* - A code (AKA text) segment,
|
||||||
|
* - A read-only data segment (rodata)
|
||||||
|
* - A data segment
|
||||||
|
*
|
||||||
|
* The code segment is the portion of the object file that contains
|
||||||
|
* executable instructions.
|
||||||
|
*
|
||||||
|
* The read-only data segment in the portion of the object file that
|
||||||
|
* contains (as one would expect) read-only data, such as fixed constant
|
||||||
|
* values and data structures.
|
||||||
|
*
|
||||||
|
* The data segment is similar to the read-only data segment -- it contains
|
||||||
|
* variables and data structures that have predefined values, however,
|
||||||
|
* entities within this segment can be modified.
|
||||||
|
*/
|
||||||
|
struct CodeSet final {
|
||||||
|
/// A single segment within a code set.
|
||||||
|
struct Segment final {
|
||||||
|
/// The byte offset that this segment is located at.
|
||||||
|
std::size_t offset = 0;
|
||||||
|
|
||||||
|
/// The address to map this segment to.
|
||||||
|
VAddr addr = 0;
|
||||||
|
|
||||||
|
/// The size of this segment in bytes.
|
||||||
|
u32 size = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
explicit CodeSet();
|
||||||
|
~CodeSet();
|
||||||
|
|
||||||
|
CodeSet(const CodeSet&) = delete;
|
||||||
|
CodeSet& operator=(const CodeSet&) = delete;
|
||||||
|
|
||||||
|
CodeSet(CodeSet&&) = default;
|
||||||
|
CodeSet& operator=(CodeSet&&) = default;
|
||||||
|
|
||||||
|
Segment& CodeSegment() {
|
||||||
|
return segments[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
const Segment& CodeSegment() const {
|
||||||
|
return segments[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
Segment& RODataSegment() {
|
||||||
|
return segments[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
const Segment& RODataSegment() const {
|
||||||
|
return segments[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
Segment& DataSegment() {
|
||||||
|
return segments[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
const Segment& DataSegment() const {
|
||||||
|
return segments[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The overall data that backs this code set.
|
||||||
|
std::shared_ptr<std::vector<u8>> memory;
|
||||||
|
|
||||||
|
/// The segments that comprise this code set.
|
||||||
|
std::array<Segment, 3> segments;
|
||||||
|
|
||||||
|
/// The entry point address for this code set.
|
||||||
|
VAddr entrypoint = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Kernel
|
|
@ -9,6 +9,7 @@
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/file_sys/program_metadata.h"
|
#include "core/file_sys/program_metadata.h"
|
||||||
|
#include "core/hle/kernel/code_set.h"
|
||||||
#include "core/hle/kernel/errors.h"
|
#include "core/hle/kernel/errors.h"
|
||||||
#include "core/hle/kernel/kernel.h"
|
#include "core/hle/kernel/kernel.h"
|
||||||
#include "core/hle/kernel/process.h"
|
#include "core/hle/kernel/process.h"
|
||||||
|
@ -50,9 +51,6 @@ void SetupMainThread(Process& owner_process, KernelCore& kernel, VAddr entry_poi
|
||||||
}
|
}
|
||||||
} // Anonymous namespace
|
} // Anonymous namespace
|
||||||
|
|
||||||
CodeSet::CodeSet() = default;
|
|
||||||
CodeSet::~CodeSet() = default;
|
|
||||||
|
|
||||||
SharedPtr<Process> Process::Create(Core::System& system, std::string&& name) {
|
SharedPtr<Process> Process::Create(Core::System& system, std::string&& name) {
|
||||||
auto& kernel = system.Kernel();
|
auto& kernel = system.Kernel();
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <bitset>
|
#include <bitset>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <memory>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <boost/container/static_vector.hpp>
|
#include <boost/container/static_vector.hpp>
|
||||||
|
@ -33,6 +32,8 @@ class KernelCore;
|
||||||
class ResourceLimit;
|
class ResourceLimit;
|
||||||
class Thread;
|
class Thread;
|
||||||
|
|
||||||
|
struct CodeSet;
|
||||||
|
|
||||||
struct AddressMapping {
|
struct AddressMapping {
|
||||||
// Address and size must be page-aligned
|
// Address and size must be page-aligned
|
||||||
VAddr address;
|
VAddr address;
|
||||||
|
@ -65,46 +66,6 @@ enum class ProcessStatus {
|
||||||
DebugBreak,
|
DebugBreak,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CodeSet final {
|
|
||||||
struct Segment {
|
|
||||||
std::size_t offset = 0;
|
|
||||||
VAddr addr = 0;
|
|
||||||
u32 size = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
explicit CodeSet();
|
|
||||||
~CodeSet();
|
|
||||||
|
|
||||||
Segment& CodeSegment() {
|
|
||||||
return segments[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
const Segment& CodeSegment() const {
|
|
||||||
return segments[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
Segment& RODataSegment() {
|
|
||||||
return segments[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
const Segment& RODataSegment() const {
|
|
||||||
return segments[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
Segment& DataSegment() {
|
|
||||||
return segments[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
const Segment& DataSegment() const {
|
|
||||||
return segments[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<std::vector<u8>> memory;
|
|
||||||
|
|
||||||
std::array<Segment, 3> segments;
|
|
||||||
VAddr entrypoint = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
class Process final : public WaitObject {
|
class Process final : public WaitObject {
|
||||||
public:
|
public:
|
||||||
enum : u64 {
|
enum : u64 {
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "common/file_util.h"
|
#include "common/file_util.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
|
#include "core/hle/kernel/code_set.h"
|
||||||
#include "core/hle/kernel/process.h"
|
#include "core/hle/kernel/process.h"
|
||||||
#include "core/hle/kernel/vm_manager.h"
|
#include "core/hle/kernel/vm_manager.h"
|
||||||
#include "core/loader/elf.h"
|
#include "core/loader/elf.h"
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include "core/file_sys/romfs_factory.h"
|
#include "core/file_sys/romfs_factory.h"
|
||||||
#include "core/file_sys/vfs_offset.h"
|
#include "core/file_sys/vfs_offset.h"
|
||||||
#include "core/gdbstub/gdbstub.h"
|
#include "core/gdbstub/gdbstub.h"
|
||||||
|
#include "core/hle/kernel/code_set.h"
|
||||||
#include "core/hle/kernel/process.h"
|
#include "core/hle/kernel/process.h"
|
||||||
#include "core/hle/kernel/vm_manager.h"
|
#include "core/hle/kernel/vm_manager.h"
|
||||||
#include "core/hle/service/filesystem/filesystem.h"
|
#include "core/hle/service/filesystem/filesystem.h"
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include "common/swap.h"
|
#include "common/swap.h"
|
||||||
#include "core/file_sys/patch_manager.h"
|
#include "core/file_sys/patch_manager.h"
|
||||||
#include "core/gdbstub/gdbstub.h"
|
#include "core/gdbstub/gdbstub.h"
|
||||||
|
#include "core/hle/kernel/code_set.h"
|
||||||
#include "core/hle/kernel/process.h"
|
#include "core/hle/kernel/process.h"
|
||||||
#include "core/hle/kernel/vm_manager.h"
|
#include "core/hle/kernel/vm_manager.h"
|
||||||
#include "core/loader/nso.h"
|
#include "core/loader/nso.h"
|
||||||
|
|
Loading…
Reference in a new issue