Fix some minor inaccuracies in SVCs and Services

This commit fixes some minor inaccuracies in SVCs and some Service functions.
This commit is contained in:
◱ PixelyIon 2020-01-16 00:28:58 +05:30 committed by ◱ PixelyIon
parent 36f05ee7e0
commit b13002f0e1
11 changed files with 39 additions and 66 deletions

View File

@ -2,7 +2,7 @@
Checks: 'clang-diagnostic-*,clang-analyzer-*,*, android-*, -bugprone-bool-pointer-implicit-conversion, -cert-env33-c, -cert-dcl50-cpp, -cert-dcl59-cpp, -cppcoreguidelines-no-malloc, -cppcoreguidelines-owning-memory, -cppcoreguidelines-pro-bounds-array-to-pointer-decay, -cppcoreguidelines-pro-bounds-constant-array-index, -cppcoreguidelines-pro-bounds-pointer-arithmetic, -cppcoreguidelines-pro-type-const-cast, Checks: 'clang-diagnostic-*,clang-analyzer-*,*, android-*, -bugprone-bool-pointer-implicit-conversion, -cert-env33-c, -cert-dcl50-cpp, -cert-dcl59-cpp, -cppcoreguidelines-no-malloc, -cppcoreguidelines-owning-memory, -cppcoreguidelines-pro-bounds-array-to-pointer-decay, -cppcoreguidelines-pro-bounds-constant-array-index, -cppcoreguidelines-pro-bounds-pointer-arithmetic, -cppcoreguidelines-pro-type-const-cast,
-cppcoreguidelines-pro-type-cstyle-cast, -cppcoreguidelines-pro-type-reinterpret-cast, -cppcoreguidelines-pro-type-union-access, -cppcoreguidelines-pro-type-vararg, -cppcoreguidelines-special-member-functions, -fuchsia-*, -google-*, google-default-arguments, google-explicit-constructor, google-runtime-member-string-references, google-runtime-operator, -hicpp-braces-around-statements, -cppcoreguidelines-pro-type-cstyle-cast, -cppcoreguidelines-pro-type-reinterpret-cast, -cppcoreguidelines-pro-type-union-access, -cppcoreguidelines-pro-type-vararg, -cppcoreguidelines-special-member-functions, -fuchsia-*, -google-*, google-default-arguments, google-explicit-constructor, google-runtime-member-string-references, google-runtime-operator, -hicpp-braces-around-statements,
-hicpp-braces-around-statements, -hicpp-named-parameter, -hicpp-no-array-decay, -hicpp-no-assembler, -hicpp-no-malloc, -hicpp-function-size, -hicpp-special-member-functions, -hicpp-vararg, -llvm-*, -objc-*, -readability-else-after-return, -readability-implicit-bool-conversion, -readability-named-parameter, -readability-simplify-boolean-expr, -readability-braces-around-statements, -hicpp-braces-around-statements, -hicpp-named-parameter, -hicpp-no-array-decay, -hicpp-no-assembler, -hicpp-no-malloc, -hicpp-function-size, -hicpp-special-member-functions, -hicpp-vararg, -llvm-*, -objc-*, -readability-else-after-return, -readability-implicit-bool-conversion, -readability-named-parameter, -readability-simplify-boolean-expr, -readability-braces-around-statements,
-readability-identifier-naming, -readability-function-size, -readability-redundant-member-init, -misc-bool-pointer-implicit-conversion, -misc-definitions-in-headers, -misc-unused-alias-decls, -misc-unused-parameters, -misc-unused-using-decls, -modernize-use-using, -modernize-use-default-member-init, -clang-diagnostic-*, -clang-analyzer-*, -hicpp-signed-bitwise' -readability-identifier-naming, -readability-function-size, -readability-redundant-member-init, -misc-bool-pointer-implicit-conversion, -misc-definitions-in-headers, -misc-unused-alias-decls, -misc-unused-parameters, -misc-unused-using-decls, -modernize-use-using, -modernize-use-default-member-init, -clang-diagnostic-*, -clang-analyzer-*, -hicpp-signed-bitwise, -misc-non-private-member-variables-in-classes'
WarningsAsErrors: '' WarningsAsErrors: ''
HeaderFilterRegex: '' HeaderFilterRegex: ''
AnalyzeTemporaryDtors: false AnalyzeTemporaryDtors: false

View File

@ -12,7 +12,7 @@
<application <application
android:allowBackup="true" android:allowBackup="true"
android:extractNativeLibs="false" android:extractNativeLibs="true"
android:fullBackupContent="@xml/backup_descriptor" android:fullBackupContent="@xml/backup_descriptor"
android:icon="@drawable/logo_skyline" android:icon="@drawable/logo_skyline"
android:label="@string/app_name" android:label="@string/app_name"

View File

@ -163,6 +163,11 @@ namespace skyline::kernel::svc {
state.logger->Debug("svcSleepThread: Yielding thread: {}", in); state.logger->Debug("svcSleepThread: Yielding thread: {}", in);
break; break;
default: default:
struct timespec spec = {
.tv_sec = static_cast<time_t>(state.ctx->registers.x0 / 1000000000),
.tv_nsec = static_cast<long>(state.ctx->registers.x0 % 1000000000)
};
nanosleep(&spec, nullptr);
state.logger->Debug("svcSleepThread: Thread sleeping for {} ns", in); state.logger->Debug("svcSleepThread: Thread sleeping for {} ns", in);
} }
} }

View File

@ -19,10 +19,6 @@ namespace skyline::kernel::type {
this->address = fregs.x0; this->address = fregs.x0;
} }
u64 RemapPrivateFunc(u64 address, size_t oldSize, size_t size, u64 flags) {
return reinterpret_cast<u64>(mremap(reinterpret_cast<void *>(address), oldSize, size, static_cast<int>(flags)));
}
u64 KPrivateMemory::Resize(size_t newSize, bool canMove) { u64 KPrivateMemory::Resize(size_t newSize, bool canMove) {
Registers fregs{}; Registers fregs{};
fregs.x0 = address; fregs.x0 = address;
@ -38,10 +34,6 @@ namespace skyline::kernel::type {
return address; return address;
} }
u64 UpdatePermissionPrivateFunc(u64 address, size_t size, u64 perms) {
return static_cast<u64>(mprotect(reinterpret_cast<void *>(address), size, static_cast<int>(perms)));
}
void KPrivateMemory::UpdatePermission(memory::Permission permission) { void KPrivateMemory::UpdatePermission(memory::Permission permission) {
Registers fregs{}; Registers fregs{};
fregs.x0 = address; fregs.x0 = address;
@ -73,10 +65,6 @@ namespace skyline::kernel::type {
return info; return info;
} }
u64 UnmapPrivateFunc(u64 address, size_t size) {
return static_cast<u64>(munmap(reinterpret_cast<void *>(address), size));
}
KPrivateMemory::~KPrivateMemory() { KPrivateMemory::~KPrivateMemory() {
try { try {
if (state.process) { if (state.process) {

View File

@ -6,10 +6,6 @@
#include <asm/unistd.h> #include <asm/unistd.h>
namespace skyline::kernel::type { namespace skyline::kernel::type {
u64 MapSharedFunc(u64 address, size_t size, u64 perms, u64 fd) {
return reinterpret_cast<u64>(mmap(reinterpret_cast<void *>(address), size, static_cast<int>(perms), MAP_SHARED | ((address) ? MAP_FIXED : 0), static_cast<int>(fd), 0));
}
KSharedMemory::KSharedMemory(const DeviceState &state, u64 address, size_t size, const memory::Permission permission, memory::Type type) : type(type), KObject(state, KType::KSharedMemory) { KSharedMemory::KSharedMemory(const DeviceState &state, u64 address, size_t size, const memory::Permission permission, memory::Type type) : type(type), KObject(state, KType::KSharedMemory) {
fd = ASharedMemory_create("", size); fd = ASharedMemory_create("", size);
if (fd < 0) if (fd < 0)
@ -35,36 +31,13 @@ namespace skyline::kernel::type {
return fregs.x0; return fregs.x0;
} }
u64 UnmapSharedFunc(u64 address, size_t size) {
return static_cast<u64>(munmap(reinterpret_cast<void *>(address), size));
}
KSharedMemory::~KSharedMemory() {
try {
if (guest.valid() && state.process) {
Registers fregs{};
fregs.x0 = guest.address;
fregs.x1 = guest.size;
fregs.x8 = __NR_munmap;
state.nce->ExecuteFunction(ThreadCall::Syscall, fregs, state.process->pid);
}
if (kernel.valid())
UnmapSharedFunc(kernel.address, kernel.size);
} catch (const std::exception &) {
}
close(fd);
}
u64 RemapSharedFunc(u64 address, size_t oldSize, size_t size) {
return reinterpret_cast<u64>(mremap(reinterpret_cast<void *>(address), oldSize, size, 0));
}
void KSharedMemory::Resize(size_t size) { void KSharedMemory::Resize(size_t size) {
if (guest.valid()) { if (guest.valid()) {
Registers fregs{}; Registers fregs{};
fregs.x0 = guest.address; fregs.x0 = guest.address;
fregs.x1 = guest.size; fregs.x1 = guest.size;
fregs.x2 = size; fregs.x2 = size;
fregs.x8 = __NR_mremap;
state.nce->ExecuteFunction(ThreadCall::Syscall, fregs, state.thread->pid); state.nce->ExecuteFunction(ThreadCall::Syscall, fregs, state.thread->pid);
if (fregs.x0 < 0) if (fregs.x0 < 0)
throw exception("An error occurred while remapping shared region in child process"); throw exception("An error occurred while remapping shared region in child process");
@ -77,16 +50,13 @@ namespace skyline::kernel::type {
} }
} }
u64 UpdatePermissionSharedFunc(u64 address, size_t size, u64 perms) {
return static_cast<u64>(mprotect(reinterpret_cast<void *>(address), size, static_cast<int>(perms)));
}
void KSharedMemory::UpdatePermission(memory::Permission permission, bool host) { void KSharedMemory::UpdatePermission(memory::Permission permission, bool host) {
if (guest.valid() && !host) { if (guest.valid() && !host) {
Registers fregs{}; Registers fregs{};
fregs.x0 = guest.address; fregs.x0 = guest.address;
fregs.x1 = guest.size; fregs.x1 = guest.size;
fregs.x2 = static_cast<u64>(guest.permission.Get()); fregs.x2 = static_cast<u64>(guest.permission.Get());
fregs.x8 = __NR_mprotect;
state.nce->ExecuteFunction(ThreadCall::Syscall, fregs, state.thread->pid); state.nce->ExecuteFunction(ThreadCall::Syscall, fregs, state.thread->pid);
if (fregs.x0 < 0) if (fregs.x0 < 0)
throw exception("An error occurred while updating shared region's permissions in child process"); throw exception("An error occurred while updating shared region's permissions in child process");
@ -113,4 +83,20 @@ namespace skyline::kernel::type {
info.deviceRefCount = deviceRefCount; info.deviceRefCount = deviceRefCount;
return info; return info;
} }
KSharedMemory::~KSharedMemory() {
try {
if (guest.valid() && state.process) {
Registers fregs{};
fregs.x0 = guest.address;
fregs.x1 = guest.size;
fregs.x8 = __NR_munmap;
state.nce->ExecuteFunction(ThreadCall::Syscall, fregs, state.process->pid);
}
if (kernel.valid())
munmap(reinterpret_cast<void *>(kernel.address), kernel.size);
} catch (const std::exception &) {
}
close(fd);
}
}; };

View File

@ -4,10 +4,6 @@
#include <asm/unistd.h> #include <asm/unistd.h>
namespace skyline::kernel::type { namespace skyline::kernel::type {
u64 MapTransferFunc(u64 address, size_t size, u64 perms) {
return reinterpret_cast<u64>(mmap(reinterpret_cast<void *>(address), size, static_cast<int>(perms), MAP_ANONYMOUS | MAP_PRIVATE | ((address) ? MAP_FIXED : 0), -1, 0));
}
KTransferMemory::KTransferMemory(const DeviceState &state, pid_t pid, u64 address, size_t size, const memory::Permission permission) : owner(pid), cSize(size), permission(permission), KObject(state, KType::KTransferMemory) { KTransferMemory::KTransferMemory(const DeviceState &state, pid_t pid, u64 address, size_t size, const memory::Permission permission) : owner(pid), cSize(size), permission(permission), KObject(state, KType::KTransferMemory) {
if (pid) { if (pid) {
Registers fregs{}; Registers fregs{};
@ -43,7 +39,7 @@ namespace skyline::kernel::type {
throw exception("An error occurred while mapping transfer memory in child process"); throw exception("An error occurred while mapping transfer memory in child process");
address = fregs.x0; address = fregs.x0;
} else { } else {
address = MapTransferFunc(address, size, static_cast<u64>(permission.Get())); address = reinterpret_cast<u64>(mmap(reinterpret_cast<void *>(address), size, permission.Get(), MAP_ANONYMOUS | MAP_PRIVATE | ((address) ? MAP_FIXED : 0), -1, 0));
if (reinterpret_cast<void *>(address) == MAP_FAILED) if (reinterpret_cast<void *>(address) == MAP_FAILED)
throw exception("An error occurred while mapping transfer memory in kernel"); throw exception("An error occurred while mapping transfer memory in kernel");
} }
@ -94,6 +90,7 @@ namespace skyline::kernel::type {
Registers fregs{}; Registers fregs{};
fregs.x0 = cAddress; fregs.x0 = cAddress;
fregs.x1 = cSize; fregs.x1 = cSize;
fregs.x8 = __NR_munmap;
state.nce->ExecuteFunction(ThreadCall::Syscall, fregs, state.process->pid); state.nce->ExecuteFunction(ThreadCall::Syscall, fregs, state.process->pid);
} }
} catch (const std::exception &) { } catch (const std::exception &) {

View File

@ -139,7 +139,8 @@ namespace skyline {
if (ctx->sp) if (ctx->sp)
regStr += fmt::format("\nStack Pointer: 0x{:X}", ctx->sp); regStr += fmt::format("\nStack Pointer: 0x{:X}", ctx->sp);
for (u16 index = 0; index < constant::NumRegs - 1; index += 2) { for (u16 index = 0; index < constant::NumRegs - 1; index += 2) {
regStr += fmt::format("\nX{}: 0x{:X}, X{}: 0x{:X}", index, ctx->registers.regs[index], index + 1, ctx->registers.regs[index + 1]); auto xStr = index < 10 ? " X" : "X";
regStr += fmt::format("\n{}{}: 0x{:<16X} {}{}: 0x{:X}", xStr, index, ctx->registers.regs[index], xStr, index + 1, ctx->registers.regs[index + 1]);
} }
if (numHist) { if (numHist) {
state.logger->Debug("Process Trace:{}", trace); state.logger->Debug("Process Trace:{}", trace);

View File

@ -112,7 +112,7 @@ namespace skyline::guest {
"MOV LR, SP\n\t" "MOV LR, SP\n\t"
"SVC #0\n\t" "SVC #0\n\t"
"MOV SP, LR\n\t" "MOV SP, LR\n\t"
"LDR LR, [SP], #16":: : "x0", "x1", "x2", "x3", "x4", "x5", "x8"); "LDR LR, [SP], #16" :: : "x0", "x1", "x2", "x3", "x4", "x5", "x8");
break; break;
} }
default: { default: {
@ -120,8 +120,8 @@ namespace skyline::guest {
.tv_sec = static_cast<time_t>(ctx->registers.x0 / 1000000000), .tv_sec = static_cast<time_t>(ctx->registers.x0 / 1000000000),
.tv_nsec = static_cast<long>(ctx->registers.x0 % 1000000000) .tv_nsec = static_cast<long>(ctx->registers.x0 % 1000000000)
}; };
volatile register __unused timespec *specPtr asm("x0") = &spec; asm("MOV X0, %0\n\t"
asm("MOV X1, XZR\n\t" "MOV X1, XZR\n\t"
"MOV X2, XZR\n\t" "MOV X2, XZR\n\t"
"MOV X3, XZR\n\t" "MOV X3, XZR\n\t"
"MOV X4, XZR\n\t" "MOV X4, XZR\n\t"
@ -131,11 +131,11 @@ namespace skyline::guest {
"MOV LR, SP\n\t" "MOV LR, SP\n\t"
"SVC #0\n\t" "SVC #0\n\t"
"MOV SP, LR\n\t" "MOV SP, LR\n\t"
"LDR LR, [SP], #16":: : "x0", "x1", "x2", "x3", "x4", "x5", "x8"); "LDR LR, [SP], #16" :: "r"(&spec) : "x0", "x1", "x2", "x3", "x4", "x5", "x8");
} }
} }
return; return;
} else if (svc == 0x1E) { } else if (svc == 0x1E) { // svcGetSystemTick
asm("STP X1, X2, [SP, #-16]!\n\t" asm("STP X1, X2, [SP, #-16]!\n\t"
"STR Q0, [SP, #-16]!\n\t" "STR Q0, [SP, #-16]!\n\t"
"STR Q1, [SP, #-16]!\n\t" "STR Q1, [SP, #-16]!\n\t"
@ -153,7 +153,7 @@ namespace skyline::guest {
"LDR Q2, [SP], #16\n\t" "LDR Q2, [SP], #16\n\t"
"LDR Q1, [SP], #16\n\t" "LDR Q1, [SP], #16\n\t"
"LDR Q0, [SP], #16\n\t" "LDR Q0, [SP], #16\n\t"
"LDP X1, X2, [SP], #16"::"r"(ctx->registers.x0)); "LDP X1, X2, [SP], #16" :: "r"(ctx->registers.x0));
return; return;
} }
while (true) { while (true) {

View File

@ -21,7 +21,7 @@ namespace skyline::service::am {
void ICommonStateGetter::GetEventHandle(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { void ICommonStateGetter::GetEventHandle(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
auto handle = state.process->InsertItem(messageEvent); auto handle = state.process->InsertItem(messageEvent);
state.logger->Debug("Event Handle: 0x{:X}", handle); state.logger->Debug("Applet Event Handle: 0x{:X}", handle);
response.copyHandles.push_back(handle); response.copyHandles.push_back(handle);
} }

View File

@ -63,7 +63,7 @@ namespace skyline::service::nvnflinger {
void dispdrv::GetNativeHandle(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { void dispdrv::GetNativeHandle(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
handle_t handle = state.process->InsertItem(state.gpu->bufferEvent); handle_t handle = state.process->InsertItem(state.gpu->bufferEvent);
state.logger->Debug("BufferEvent Handle: 0x{:X}", handle); state.logger->Debug("Display Buffer Event Handle: 0x{:X}", handle);
response.copyHandles.push_back(handle); response.copyHandles.push_back(handle);
response.Push<u32>(constant::status::Success); response.Push<u32>(constant::status::Success);
} }

View File

@ -115,9 +115,7 @@ namespace skyline::service::vi {
{0x908, SFUNC(IDisplayService::CreateStrayLayer)} {0x908, SFUNC(IDisplayService::CreateStrayLayer)}
}) {} }) {}
void ISystemDisplayService::SetLayerZ(skyline::kernel::type::KSession &session, skyline::kernel::ipc::IpcRequest &request, skyline::kernel::ipc::IpcResponse &response) { void ISystemDisplayService::SetLayerZ(skyline::kernel::type::KSession &session, skyline::kernel::ipc::IpcRequest &request, skyline::kernel::ipc::IpcResponse &response) {}
response.Push<u32>(constant::status::Success);
}
IManagerDisplayService::IManagerDisplayService(const DeviceState &state, ServiceManager &manager) : IDisplayService(state, manager, Service::vi_IManagerDisplayService, { IManagerDisplayService::IManagerDisplayService(const DeviceState &state, ServiceManager &manager) : IDisplayService(state, manager, Service::vi_IManagerDisplayService, {
{0x7DA, SFUNC(IManagerDisplayService::CreateManagedLayer)}, {0x7DA, SFUNC(IManagerDisplayService::CreateManagedLayer)},
@ -144,7 +142,5 @@ namespace skyline::service::vi {
response.Push<u32>(constant::status::Success); response.Push<u32>(constant::status::Success);
} }
void IManagerDisplayService::AddToLayerStack(skyline::kernel::type::KSession &session, skyline::kernel::ipc::IpcRequest &request, skyline::kernel::ipc::IpcResponse &response) { void IManagerDisplayService::AddToLayerStack(skyline::kernel::type::KSession &session, skyline::kernel::ipc::IpcRequest &request, skyline::kernel::ipc::IpcResponse &response) {}
response.Push<u32>(constant::status::Success);
}
} }