forked from suyu/suyu
c0a01f3adc
The use of a shared_ptr is an implementation detail of the VMManager itself when mapping memory. Because of that, we shouldn't require all users of the CodeSet to have to allocate the shared_ptr ahead of time. It's intended that CodeSet simply pass in the required direct data, and that the memory manager takes care of it from that point on. This means we just do the shared pointer allocation in a single place, when loading modules, as opposed to in each loader.
89 lines
2.1 KiB
C++
89 lines
2.1 KiB
C++
// Copyright 2019 yuzu emulator team
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#pragma once
|
|
|
|
#include <cstddef>
|
|
#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::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
|