mirror of
https://github.com/skyline-emu/skyline.git
synced 2024-11-29 22:34:16 +01:00
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:
parent
36f05ee7e0
commit
b13002f0e1
@ -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
|
||||||
|
@ -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"
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
@ -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 &) {
|
||||||
|
@ -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);
|
||||||
|
@ -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"
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user