Address CR Comments + Fix Clock Rescaling

This commit is contained in:
◱ PixelyIon 2020-11-22 15:11:01 +05:30 committed by ◱ PixelyIon
parent a3dd759a1c
commit fbf9f06244
26 changed files with 73 additions and 66 deletions

View File

@ -92,9 +92,9 @@ namespace skyline {
namespace util {
/**
* @brief A way to implicitly cast all pointers to u64s, this is used for {fmt} as we use 0x{:X} to print pointers
* @brief A way to implicitly cast all pointers to uintptr_t, this is used for {fmt} as we use 0x{:X} to print pointers
* @note There's the exception of signed char pointers as they represent C Strings
* @note This does not cover std::shared_ptr or std::unique_ptr and those will have to be explicitly casted to u64 or passed through fmt::ptr
* @note This does not cover std::shared_ptr or std::unique_ptr and those will have to be explicitly casted to uintptr_t or passed through fmt::ptr
*/
template<class T>
constexpr auto FmtCast(T object) {
@ -102,7 +102,7 @@ namespace skyline {
if constexpr (std::is_same<char, typename std::remove_cv<typename std::remove_pointer<T>::type>::type>::value)
return reinterpret_cast<typename std::common_type<char *, T>::type>(object);
else
return reinterpret_cast<const u64>(object);
return reinterpret_cast<const uintptr_t>(object);
else
return object;
}
@ -153,7 +153,7 @@ namespace skyline {
}
template<class T>
size_t PointerValue(T *item) {
uintptr_t PointerValue(T *item) {
return reinterpret_cast<uintptr_t>(item);
}
@ -244,7 +244,7 @@ namespace skyline {
template<size_t Size>
constexpr std::array<u8, Size> HexStringToArray(std::string_view string) {
if (string.size() != Size * 2)
throw exception("Invalid size");
throw exception("String size: {} (Expected {})", string.size(), Size);
std::array<u8, Size> result;
for (size_t i{}; i < Size; i++) {
size_t index{i * 2};
@ -255,9 +255,11 @@ namespace skyline {
template<class Type>
constexpr Type HexStringToInt(std::string_view string) {
if (string.size() > sizeof(Type) * 2)
throw exception("String size larger than type: {} (sizeof(Type): {})", string.size(), sizeof(Type));
Type result{};
size_t offset{(sizeof(Type) * 8) - 4};
for (size_t index{}; index < std::min(sizeof(Type) * 2, string.size()); index++, offset -= 4) {
for (size_t index{}; index < string.size(); index++, offset -= 4) {
char digit{string[index]};
if (digit >= '0' && digit <= '9')
result |= static_cast<Type>(digit - '0') << offset;

View File

@ -23,6 +23,16 @@ namespace skyline {
public:
inline CircularQueue(size_t size) : vector((size + 1) * sizeof(Type)) {}
inline CircularQueue(const CircularQueue &) = delete;
inline CircularQueue &operator=(const CircularQueue &) = delete;
inline CircularQueue(CircularQueue &&other) : vector(std::move(other.vector)), consumptionMutex(std::move(other.consumptionMutex)), consumeCondition(std::move(other.consumeCondition)), productionMutex(std::move(other.productionMutex)), produceCondition(std::move(other.produceCondition)) {
this->start = other.start;
this->end = other.end;
other.start = other.end = nullptr;
}
inline ~CircularQueue() {
while (start != end) {
auto next{start + 1};
@ -68,7 +78,7 @@ namespace skyline {
inline void Append(span <Type> buffer) {
std::unique_lock lock(productionMutex);
for (auto &item : buffer) {
for (const auto &item : buffer) {
auto next{end + 1};
next = (next == reinterpret_cast<Type *>(vector.end().base())) ? reinterpret_cast<Type *>(vector.begin().base()) : next;
if (next == start) {
@ -88,7 +98,7 @@ namespace skyline {
template<typename TransformedType, typename Transformation>
inline void AppendTranform(span <TransformedType> buffer, Transformation transformation) {
std::unique_lock lock(productionMutex);
for (auto &item : buffer) {
for (const auto &item : buffer) {
auto next{end + 1};
next = (next == reinterpret_cast<Type *>(vector.end().base())) ? reinterpret_cast<Type *>(vector.begin().base()) : next;
if (next == start) {

View File

@ -48,7 +48,7 @@ namespace skyline::signal {
signalException.signal = signal;
signalException.pc = context->uc_mcontext.pc;
if (signal == SIGSEGV)
signalException.faultAddress = info->si_addr;
signalException.fault = info->si_addr;
SignalExceptionPtr = std::make_exception_ptr(signalException);
context->uc_mcontext.pc = reinterpret_cast<u64>(&ExceptionThrow);

View File

@ -15,13 +15,13 @@ namespace skyline::signal {
public:
int signal{};
u64 pc{};
void *faultAddress{};
void *fault{};
inline std::string what() const {
if (!faultAddress)
if (!fault)
return fmt::format("Signal: {} (PC: 0x{:X})", strsignal(signal), pc);
else
return fmt::format("Signal: {} @ 0x{:X} (PC: 0x{:X})", strsignal(signal), reinterpret_cast<u64>(faultAddress), pc);
return fmt::format("Signal: {} @ 0x{:X} (PC: 0x{:X})", strsignal(signal), reinterpret_cast<uintptr_t>(fault), pc);
}
};

View File

@ -99,7 +99,6 @@ namespace skyline {
*/
bool Unmap(u64 virtAddr, u64 size);
void Read(u8 *destination, u64 virtAddr, u64 size) const;
/**

View File

@ -41,7 +41,7 @@ namespace skyline::kernel {
// Search for a suitable carveout in host AS to fit the guest AS inside of
std::ifstream mapsFile("/proc/self/maps");
std::string maps((std::istreambuf_iterator<char>(mapsFile)), std::istreambuf_iterator<char>());
size_t line{}, start{1ULL << 35}, alignedStart{1ULL << 35}; // 1 << 35 is where QC KGSL (Kernel Graphic Support Layer) maps down from, we skip over this or KGSL goes OOM
size_t line{}, start{1ULL << 35}, alignedStart{1ULL << 35}; // Qualcomm KGSL (Kernel Graphic Support Layer/Kernel GPU driver) maps below 35-bits, reserving it causes KGSL to go OOM
do {
auto end{util::HexStringToInt<u64>(std::string_view(maps.data() + line, sizeof(u64) * 2))};
if (end < start)

View File

@ -186,12 +186,6 @@ namespace skyline {
};
}
namespace loader {
class NroLoader;
class NsoLoader;
class NcaLoader;
}
namespace kernel {
struct ChunkDescriptor {
u8 *ptr;

View File

@ -113,7 +113,7 @@ namespace skyline::kernel::svc {
}
state.process->NewHandle<type::KPrivateMemory>(destination, size, chunk->permission, memory::states::Stack);
memcpy(destination, source, size);
std::memcpy(destination, source, size);
auto object{state.process->GetMemoryObject(source)};
if (!object)
@ -281,12 +281,11 @@ namespace skyline::kernel::svc {
}
void SleepThread(const DeviceState &state) {
u64 in{state.ctx->gpr.x0};
i64 in{static_cast<i64>(state.ctx->gpr.x0)};
switch (in) {
case 0:
case 1:
case 2:
case -1:
case -2:
state.logger->Debug("svcSleepThread: Yielding thread: {}", in);
break;
default:
@ -553,7 +552,7 @@ namespace skyline::kernel::svc {
break;
}
uint index{};
u32 index{};
for (const auto &object : objectTable) {
if (object->signalled) {
state.logger->Debug("svcWaitSynchronization: Signalled handle: 0x{:X}", waitHandles[index]);

View File

@ -2,6 +2,7 @@
// Copyright © 2020 Skyline Team and Contributors (https://github.com/skyline-emu/)
#include <kernel/types/KProcess.h>
#include <vfs/npdm.h>
#include "nso.h"
#include "nca.h"
@ -19,7 +20,7 @@ namespace skyline::loader {
if (nsoFile == nullptr)
throw exception("Cannot load an ExeFS that doesn't contain rtld");
state.process->memory.InitializeVmm(memory::AddressSpaceType::AddressSpace39Bit);
state.process->memory.InitializeVmm(process->npdm.meta.flags.type);
auto loadInfo{NsoLoader::LoadNso(nsoFile, process, state)};
u64 offset{loadInfo.size};

View File

@ -270,7 +270,7 @@ namespace skyline::nce {
*instruction = instr::B((end - patch) + offset, true).raw;
/* Rescale host clock */
std::memcpy(patch, reinterpret_cast<void *>(&guest::RescaleClock), guest::RescaleClockSize);
std::memcpy(patch, reinterpret_cast<void *>(&guest::RescaleClock), guest::RescaleClockSize * sizeof(u32));
patch += guest::RescaleClockSize;
/* Load result from stack into destination register */

View File

@ -38,4 +38,5 @@ namespace skyline::vfs {
OsFileSystemDirectory(const std::string &path, ListMode listMode);
std::vector<Entry> Read();
};}
};
}

View File

@ -8,7 +8,8 @@
android:clickable="true"
android:focusable="true"
android:orientation="vertical"
android:padding="16dp">
android:paddingVertical="8dp"
android:paddingHorizontal="16dp">
<TextView
android:id="@+id/text_title"