2020-04-08 23:11:25 +02:00
|
|
|
// Copyright 2020 yuzu Emulator Project
|
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "common/common_types.h"
|
2020-12-28 06:08:31 +01:00
|
|
|
#include "core/device_memory.h"
|
2020-04-08 23:11:25 +02:00
|
|
|
|
2021-02-13 01:02:35 +01:00
|
|
|
namespace Kernel {
|
2020-04-08 23:11:25 +02:00
|
|
|
|
2020-12-28 06:08:31 +01:00
|
|
|
constexpr std::size_t KernelAslrAlignment = 2 * 1024 * 1024;
|
|
|
|
constexpr std::size_t KernelVirtualAddressSpaceWidth = 1ULL << 39;
|
|
|
|
constexpr std::size_t KernelPhysicalAddressSpaceWidth = 1ULL << 48;
|
|
|
|
constexpr std::size_t KernelVirtualAddressSpaceBase = 0ULL - KernelVirtualAddressSpaceWidth;
|
|
|
|
constexpr std::size_t KernelVirtualAddressSpaceEnd =
|
|
|
|
KernelVirtualAddressSpaceBase + (KernelVirtualAddressSpaceWidth - KernelAslrAlignment);
|
|
|
|
constexpr std::size_t KernelVirtualAddressSpaceLast = KernelVirtualAddressSpaceEnd - 1;
|
|
|
|
constexpr std::size_t KernelVirtualAddressSpaceSize =
|
|
|
|
KernelVirtualAddressSpaceEnd - KernelVirtualAddressSpaceBase;
|
|
|
|
|
|
|
|
constexpr bool IsKernelAddressKey(VAddr key) {
|
|
|
|
return KernelVirtualAddressSpaceBase <= key && key <= KernelVirtualAddressSpaceLast;
|
|
|
|
}
|
|
|
|
|
|
|
|
constexpr bool IsKernelAddress(VAddr address) {
|
|
|
|
return KernelVirtualAddressSpaceBase <= address && address < KernelVirtualAddressSpaceEnd;
|
|
|
|
}
|
|
|
|
|
2021-02-13 01:02:35 +01:00
|
|
|
class KMemoryRegion final {
|
|
|
|
friend class KMemoryLayout;
|
2020-04-08 23:11:25 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
constexpr PAddr StartAddress() const {
|
|
|
|
return start_address;
|
|
|
|
}
|
|
|
|
|
|
|
|
constexpr PAddr EndAddress() const {
|
|
|
|
return end_address;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
2021-02-13 01:02:35 +01:00
|
|
|
constexpr KMemoryRegion() = default;
|
|
|
|
constexpr KMemoryRegion(PAddr start_address, PAddr end_address)
|
2020-04-08 23:11:25 +02:00
|
|
|
: start_address{start_address}, end_address{end_address} {}
|
|
|
|
|
|
|
|
const PAddr start_address{};
|
|
|
|
const PAddr end_address{};
|
|
|
|
};
|
|
|
|
|
2021-02-13 01:02:35 +01:00
|
|
|
class KMemoryLayout final {
|
2020-04-08 23:11:25 +02:00
|
|
|
public:
|
2021-02-13 01:02:35 +01:00
|
|
|
constexpr const KMemoryRegion& Application() const {
|
2020-04-08 23:11:25 +02:00
|
|
|
return application;
|
|
|
|
}
|
|
|
|
|
2021-02-13 01:02:35 +01:00
|
|
|
constexpr const KMemoryRegion& Applet() const {
|
2020-04-08 23:11:25 +02:00
|
|
|
return applet;
|
|
|
|
}
|
|
|
|
|
2021-02-13 01:02:35 +01:00
|
|
|
constexpr const KMemoryRegion& System() const {
|
2020-04-08 23:11:25 +02:00
|
|
|
return system;
|
|
|
|
}
|
|
|
|
|
2021-02-13 01:02:35 +01:00
|
|
|
static constexpr KMemoryLayout GetDefaultLayout() {
|
2020-04-08 23:11:25 +02:00
|
|
|
constexpr std::size_t application_size{0xcd500000};
|
|
|
|
constexpr std::size_t applet_size{0x1fb00000};
|
|
|
|
constexpr PAddr application_start_address{Core::DramMemoryMap::End - application_size};
|
|
|
|
constexpr PAddr application_end_address{Core::DramMemoryMap::End};
|
|
|
|
constexpr PAddr applet_start_address{application_start_address - applet_size};
|
|
|
|
constexpr PAddr applet_end_address{applet_start_address + applet_size};
|
|
|
|
constexpr PAddr system_start_address{Core::DramMemoryMap::SlabHeapEnd};
|
|
|
|
constexpr PAddr system_end_address{applet_start_address};
|
|
|
|
return {application_start_address, application_end_address, applet_start_address,
|
|
|
|
applet_end_address, system_start_address, system_end_address};
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
2021-02-13 01:02:35 +01:00
|
|
|
constexpr KMemoryLayout(PAddr application_start_address, std::size_t application_size,
|
|
|
|
PAddr applet_start_address, std::size_t applet_size,
|
|
|
|
PAddr system_start_address, std::size_t system_size)
|
2020-04-08 23:11:25 +02:00
|
|
|
: application{application_start_address, application_size},
|
|
|
|
applet{applet_start_address, applet_size}, system{system_start_address, system_size} {}
|
|
|
|
|
2021-02-13 01:02:35 +01:00
|
|
|
const KMemoryRegion application;
|
|
|
|
const KMemoryRegion applet;
|
|
|
|
const KMemoryRegion system;
|
2020-04-08 23:11:25 +02:00
|
|
|
};
|
|
|
|
|
2021-02-13 01:02:35 +01:00
|
|
|
} // namespace Kernel
|