Compare commits

..

9 Commits

Author SHA1 Message Date
486c3db222 Android 208 2024-01-25 01:01:12 +00:00
f286c2fde3 Merge yuzu-emu#12769 2024-01-25 01:01:11 +00:00
34fb9081e7 Merge yuzu-emu#12759 2024-01-25 01:01:11 +00:00
1fc82b84c7 Merge yuzu-emu#12749 2024-01-25 01:01:11 +00:00
3ab0600904 Merge yuzu-emu#12499 2024-01-25 01:01:11 +00:00
a76f6a2775 Merge pull request #12763 from liamwhite/fix-hbl-again
loader: also register fs process for raw exefs partition
2024-01-23 13:31:41 -05:00
ba518f6899 Merge pull request #12768 from german77/wrong_conversion
service: properly convert buffers to strings
2024-01-23 13:31:27 -05:00
fc5d76e6e2 service: properly convert buffers to strings 2024-01-23 10:24:05 -06:00
5f9a45ada9 loader: also register fs process for raw exefs partition 2024-01-23 00:01:38 -05:00
19 changed files with 75 additions and 46 deletions

View File

@ -1,7 +1,9 @@
| Pull Request | Commit | Title | Author | Merged? | | Pull Request | Commit | Title | Author | Merged? |
|----|----|----|----|----| |----|----|----|----|----|
| [12499](https://github.com/yuzu-emu/yuzu-android//pull/12499) | [`fc30a84fc`](https://github.com/yuzu-emu/yuzu-android//pull/12499/files) | Rework time services | [Kelebek1](https://github.com/Kelebek1/) | Yes | | [12499](https://github.com/yuzu-emu/yuzu-android//pull/12499) | [`e4915fb7d`](https://github.com/yuzu-emu/yuzu-android//pull/12499/files) | Rework time services | [Kelebek1](https://github.com/Kelebek1/) | Yes |
| [12749](https://github.com/yuzu-emu/yuzu-android//pull/12749) | [`e3171486d`](https://github.com/yuzu-emu/yuzu-android//pull/12749/files) | general: workarounds for SMMU syncing issues | [liamwhite](https://github.com/liamwhite/) | Yes | | [12749](https://github.com/yuzu-emu/yuzu-android//pull/12749) | [`e3171486d`](https://github.com/yuzu-emu/yuzu-android//pull/12749/files) | general: workarounds for SMMU syncing issues | [liamwhite](https://github.com/liamwhite/) | Yes |
| [12759](https://github.com/yuzu-emu/yuzu-android//pull/12759) | [`a120f8ff4`](https://github.com/yuzu-emu/yuzu-android//pull/12759/files) | core: miscellaneous fixes | [liamwhite](https://github.com/liamwhite/) | Yes |
| [12769](https://github.com/yuzu-emu/yuzu-android//pull/12769) | [`ad4622da2`](https://github.com/yuzu-emu/yuzu-android//pull/12769/files) | core: hid: Reduce controller requests | [german77](https://github.com/german77/) | Yes |
End of merge log. You can find the original README.md below the break. End of merge log. You can find the original README.md below the break.

View File

@ -29,10 +29,6 @@ NativeClock::NativeClock() {
gputick_cntfrq_factor = GetFixedPointFactor(GPUTickFreq, host_cntfrq); gputick_cntfrq_factor = GetFixedPointFactor(GPUTickFreq, host_cntfrq);
} }
void NativeClock::Reset() {
start_ticks = GetUptime();
}
std::chrono::nanoseconds NativeClock::GetTimeNS() const { std::chrono::nanoseconds NativeClock::GetTimeNS() const {
return std::chrono::nanoseconds{MultiplyHigh(GetUptime(), ns_cntfrq_factor)}; return std::chrono::nanoseconds{MultiplyHigh(GetUptime(), ns_cntfrq_factor)};
} }
@ -46,11 +42,11 @@ std::chrono::milliseconds NativeClock::GetTimeMS() const {
} }
s64 NativeClock::GetCNTPCT() const { s64 NativeClock::GetCNTPCT() const {
return MultiplyHigh(GetUptime() - start_ticks, guest_cntfrq_factor); return MultiplyHigh(GetUptime(), guest_cntfrq_factor);
} }
s64 NativeClock::GetGPUTick() const { s64 NativeClock::GetGPUTick() const {
return MultiplyHigh(GetUptime() - start_ticks, gputick_cntfrq_factor); return MultiplyHigh(GetUptime(), gputick_cntfrq_factor);
} }
s64 NativeClock::GetUptime() const { s64 NativeClock::GetUptime() const {

View File

@ -11,8 +11,6 @@ class NativeClock final : public WallClock {
public: public:
explicit NativeClock(); explicit NativeClock();
void Reset() override;
std::chrono::nanoseconds GetTimeNS() const override; std::chrono::nanoseconds GetTimeNS() const override;
std::chrono::microseconds GetTimeUS() const override; std::chrono::microseconds GetTimeUS() const override;
@ -42,7 +40,6 @@ private:
FactorType ms_cntfrq_factor; FactorType ms_cntfrq_factor;
FactorType guest_cntfrq_factor; FactorType guest_cntfrq_factor;
FactorType gputick_cntfrq_factor; FactorType gputick_cntfrq_factor;
s64 start_ticks;
}; };
} // namespace Common::Arm64 } // namespace Common::Arm64

View File

@ -20,10 +20,6 @@ class StandardWallClock final : public WallClock {
public: public:
explicit StandardWallClock() {} explicit StandardWallClock() {}
void Reset() override {
start_time = std::chrono::system_clock::now();
}
std::chrono::nanoseconds GetTimeNS() const override { std::chrono::nanoseconds GetTimeNS() const override {
return std::chrono::duration_cast<std::chrono::nanoseconds>( return std::chrono::duration_cast<std::chrono::nanoseconds>(
std::chrono::system_clock::now().time_since_epoch()); std::chrono::system_clock::now().time_since_epoch());
@ -49,16 +45,13 @@ public:
s64 GetUptime() const override { s64 GetUptime() const override {
return std::chrono::duration_cast<std::chrono::nanoseconds>( return std::chrono::duration_cast<std::chrono::nanoseconds>(
std::chrono::system_clock::now() - start_time) std::chrono::steady_clock::now().time_since_epoch())
.count(); .count();
} }
bool IsNative() const override { bool IsNative() const override {
return false; return false;
} }
private:
std::chrono::system_clock::time_point start_time{};
}; };
std::unique_ptr<WallClock> CreateOptimalClock() { std::unique_ptr<WallClock> CreateOptimalClock() {

View File

@ -19,8 +19,6 @@ public:
virtual ~WallClock() = default; virtual ~WallClock() = default;
virtual void Reset() = 0;
/// @returns The time in nanoseconds since the construction of this clock. /// @returns The time in nanoseconds since the construction of this clock.
virtual std::chrono::nanoseconds GetTimeNS() const = 0; virtual std::chrono::nanoseconds GetTimeNS() const = 0;

View File

@ -15,10 +15,6 @@ NativeClock::NativeClock(u64 rdtsc_frequency_)
cntpct_rdtsc_factor{GetFixedPoint64Factor(CNTFRQ, rdtsc_frequency)}, cntpct_rdtsc_factor{GetFixedPoint64Factor(CNTFRQ, rdtsc_frequency)},
gputick_rdtsc_factor{GetFixedPoint64Factor(GPUTickFreq, rdtsc_frequency)} {} gputick_rdtsc_factor{GetFixedPoint64Factor(GPUTickFreq, rdtsc_frequency)} {}
void NativeClock::Reset() {
start_ticks = FencedRDTSC();
}
std::chrono::nanoseconds NativeClock::GetTimeNS() const { std::chrono::nanoseconds NativeClock::GetTimeNS() const {
return std::chrono::nanoseconds{MultiplyHigh(GetUptime(), ns_rdtsc_factor)}; return std::chrono::nanoseconds{MultiplyHigh(GetUptime(), ns_rdtsc_factor)};
} }
@ -32,11 +28,11 @@ std::chrono::milliseconds NativeClock::GetTimeMS() const {
} }
s64 NativeClock::GetCNTPCT() const { s64 NativeClock::GetCNTPCT() const {
return MultiplyHigh(GetUptime() - start_ticks, cntpct_rdtsc_factor); return MultiplyHigh(GetUptime(), cntpct_rdtsc_factor);
} }
s64 NativeClock::GetGPUTick() const { s64 NativeClock::GetGPUTick() const {
return MultiplyHigh(GetUptime() - start_ticks, gputick_rdtsc_factor); return MultiplyHigh(GetUptime(), gputick_rdtsc_factor);
} }
s64 NativeClock::GetUptime() const { s64 NativeClock::GetUptime() const {

View File

@ -11,8 +11,6 @@ class NativeClock final : public WallClock {
public: public:
explicit NativeClock(u64 rdtsc_frequency_); explicit NativeClock(u64 rdtsc_frequency_);
void Reset() override;
std::chrono::nanoseconds GetTimeNS() const override; std::chrono::nanoseconds GetTimeNS() const override;
std::chrono::microseconds GetTimeUS() const override; std::chrono::microseconds GetTimeUS() const override;
@ -28,7 +26,6 @@ public:
bool IsNative() const override; bool IsNative() const override;
private: private:
u64 start_ticks;
u64 rdtsc_frequency; u64 rdtsc_frequency;
u64 ns_rdtsc_factor; u64 ns_rdtsc_factor;

View File

@ -66,7 +66,6 @@ void CoreTiming::Initialize(std::function<void()>&& on_thread_init_) {
event_fifo_id = 0; event_fifo_id = 0;
shutting_down = false; shutting_down = false;
cpu_ticks = 0; cpu_ticks = 0;
clock->Reset();
if (is_multicore) { if (is_multicore) {
timer_thread = std::make_unique<std::jthread>(ThreadEntry, std::ref(*this)); timer_thread = std::make_unique<std::jthread>(ThreadEntry, std::ref(*this));
} }

View File

@ -69,9 +69,14 @@ public:
}; };
template <typename AddressType> template <typename AddressType>
void InvalidateInstructionCache(KernelCore& kernel, AddressType addr, u64 size) { void InvalidateInstructionCache(KernelCore& kernel, KPageTableBase* table, AddressType addr,
u64 size) {
// TODO: lock the process list // TODO: lock the process list
for (auto& process : kernel.GetProcessList()) { for (auto& process : kernel.GetProcessList()) {
if (std::addressof(process->GetPageTable().GetBasePageTable()) != table) {
continue;
}
for (size_t i = 0; i < Core::Hardware::NUM_CPU_CORES; i++) { for (size_t i = 0; i < Core::Hardware::NUM_CPU_CORES; i++) {
auto* interface = process->GetArmInterface(i); auto* interface = process->GetArmInterface(i);
if (interface) { if (interface) {
@ -1302,7 +1307,7 @@ Result KPageTableBase::UnmapCodeMemory(KProcessAddress dst_address, KProcessAddr
bool reprotected_pages = false; bool reprotected_pages = false;
SCOPE_EXIT({ SCOPE_EXIT({
if (reprotected_pages && any_code_pages) { if (reprotected_pages && any_code_pages) {
InvalidateInstructionCache(m_kernel, dst_address, size); InvalidateInstructionCache(m_kernel, this, dst_address, size);
} }
}); });
@ -2036,7 +2041,7 @@ Result KPageTableBase::SetProcessMemoryPermission(KProcessAddress addr, size_t s
for (const auto& block : pg) { for (const auto& block : pg) {
StoreDataCache(GetHeapVirtualPointer(m_kernel, block.GetAddress()), block.GetSize()); StoreDataCache(GetHeapVirtualPointer(m_kernel, block.GetAddress()), block.GetSize());
} }
InvalidateInstructionCache(m_kernel, addr, size); InvalidateInstructionCache(m_kernel, this, addr, size);
} }
R_SUCCEED(); R_SUCCEED();
@ -3277,7 +3282,7 @@ Result KPageTableBase::WriteDebugMemory(KProcessAddress dst_address, KProcessAdd
R_TRY(PerformCopy()); R_TRY(PerformCopy());
// Invalidate the instruction cache, as this svc allows modifying executable pages. // Invalidate the instruction cache, as this svc allows modifying executable pages.
InvalidateInstructionCache(m_kernel, dst_address, size); InvalidateInstructionCache(m_kernel, this, dst_address, size);
R_SUCCEED(); R_SUCCEED();
} }

View File

@ -112,6 +112,7 @@ SessionId Container::OpenSession(Kernel::KProcess* process) {
void Container::CloseSession(SessionId session_id) { void Container::CloseSession(SessionId session_id) {
std::scoped_lock lk(impl->session_guard); std::scoped_lock lk(impl->session_guard);
impl->file.UnmapAllHandles(session_id);
auto& session = impl->sessions[session_id.id]; auto& session = impl->sessions[session_id.id];
auto& smmu = impl->host1x.MemoryManager(); auto& smmu = impl->host1x.MemoryManager();
if (session.has_preallocated_area) { if (session.has_preallocated_area) {

View File

@ -326,4 +326,17 @@ std::optional<NvMap::FreeInfo> NvMap::FreeHandle(Handle::Id handle, bool interna
return freeInfo; return freeInfo;
} }
void NvMap::UnmapAllHandles(NvCore::SessionId session_id) {
auto handles_copy = [&] {
std::scoped_lock lk{handles_lock};
return handles;
}();
for (auto& [id, handle] : handles_copy) {
if (handle->session_id.id == session_id.id) {
FreeHandle(id, false);
}
}
}
} // namespace Service::Nvidia::NvCore } // namespace Service::Nvidia::NvCore

View File

@ -152,6 +152,8 @@ public:
*/ */
std::optional<FreeInfo> FreeHandle(Handle::Id handle, bool internal_session); std::optional<FreeInfo> FreeHandle(Handle::Id handle, bool internal_session);
void UnmapAllHandles(NvCore::SessionId session_id);
private: private:
std::list<std::shared_ptr<Handle>> unmap_queue{}; std::list<std::shared_ptr<Handle>> unmap_queue{};
std::mutex unmap_queue_lock{}; //!< Protects access to `unmap_queue` std::mutex unmap_queue_lock{}; //!< Protects access to `unmap_queue`

View File

@ -4,6 +4,7 @@
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/scope_exit.h" #include "common/scope_exit.h"
#include "common/string_util.h"
#include "core/core.h" #include "core/core.h"
#include "core/hle/kernel/k_event.h" #include "core/hle/kernel/k_event.h"
#include "core/hle/kernel/k_process.h" #include "core/hle/kernel/k_process.h"
@ -29,7 +30,7 @@ void NVDRV::Open(HLERequestContext& ctx) {
} }
const auto& buffer = ctx.ReadBuffer(); const auto& buffer = ctx.ReadBuffer();
const std::string device_name(buffer.begin(), buffer.end()); const std::string device_name(Common::StringFromBuffer(buffer));
if (device_name == "/dev/nvhost-prof-gpu") { if (device_name == "/dev/nvhost-prof-gpu") {
rb.Push<DeviceFD>(0); rb.Push<DeviceFD>(0);

View File

@ -709,12 +709,12 @@ void ISystemSettingsServer::GetSettingsItemValueSize(HLERequestContext& ctx) {
// The category of the setting. This corresponds to the top-level keys of // The category of the setting. This corresponds to the top-level keys of
// system_settings.ini. // system_settings.ini.
const auto setting_category_buf{ctx.ReadBuffer(0)}; const auto setting_category_buf{ctx.ReadBuffer(0)};
const std::string setting_category{setting_category_buf.begin(), setting_category_buf.end()}; const std::string setting_category{Common::StringFromBuffer(setting_category_buf)};
// The name of the setting. This corresponds to the second-level keys of // The name of the setting. This corresponds to the second-level keys of
// system_settings.ini. // system_settings.ini.
const auto setting_name_buf{ctx.ReadBuffer(1)}; const auto setting_name_buf{ctx.ReadBuffer(1)};
const std::string setting_name{setting_name_buf.begin(), setting_name_buf.end()}; const std::string setting_name{Common::StringFromBuffer(setting_name_buf)};
auto settings{GetSettings()}; auto settings{GetSettings()};
u64 response_size{0}; u64 response_size{0};
@ -732,12 +732,12 @@ void ISystemSettingsServer::GetSettingsItemValue(HLERequestContext& ctx) {
// The category of the setting. This corresponds to the top-level keys of // The category of the setting. This corresponds to the top-level keys of
// system_settings.ini. // system_settings.ini.
const auto setting_category_buf{ctx.ReadBuffer(0)}; const auto setting_category_buf{ctx.ReadBuffer(0)};
const std::string setting_category{setting_category_buf.begin(), setting_category_buf.end()}; const std::string setting_category{Common::StringFromBuffer(setting_category_buf)};
// The name of the setting. This corresponds to the second-level keys of // The name of the setting. This corresponds to the second-level keys of
// system_settings.ini. // system_settings.ini.
const auto setting_name_buf{ctx.ReadBuffer(1)}; const auto setting_name_buf{ctx.ReadBuffer(1)};
const std::string setting_name{setting_name_buf.begin(), setting_name_buf.end()}; const std::string setting_name{Common::StringFromBuffer(setting_name_buf)};
std::vector<u8> value; std::vector<u8> value;
auto response = GetSettingsItemValue(value, setting_category, setting_name); auto response = GetSettingsItemValue(value, setting_category, setting_name);

View File

@ -15,6 +15,7 @@
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/math_util.h" #include "common/math_util.h"
#include "common/settings.h" #include "common/settings.h"
#include "common/string_util.h"
#include "common/swap.h" #include "common/swap.h"
#include "core/core_timing.h" #include "core/core_timing.h"
#include "core/hle/kernel/k_readable_event.h" #include "core/hle/kernel/k_readable_event.h"
@ -694,9 +695,7 @@ private:
void OpenLayer(HLERequestContext& ctx) { void OpenLayer(HLERequestContext& ctx) {
IPC::RequestParser rp{ctx}; IPC::RequestParser rp{ctx};
const auto name_buf = rp.PopRaw<std::array<u8, 0x40>>(); const auto name_buf = rp.PopRaw<std::array<u8, 0x40>>();
const auto end = std::find(name_buf.begin(), name_buf.end(), '\0'); const std::string display_name(Common::StringFromBuffer(name_buf));
const std::string display_name(name_buf.begin(), end);
const u64 layer_id = rp.Pop<u64>(); const u64 layer_id = rp.Pop<u64>();
const u64 aruid = rp.Pop<u64>(); const u64 aruid = rp.Pop<u64>();

View File

@ -10,6 +10,7 @@
#include "core/file_sys/nca_metadata.h" #include "core/file_sys/nca_metadata.h"
#include "core/file_sys/patch_manager.h" #include "core/file_sys/patch_manager.h"
#include "core/file_sys/registered_cache.h" #include "core/file_sys/registered_cache.h"
#include "core/file_sys/romfs_factory.h"
#include "core/file_sys/submission_package.h" #include "core/file_sys/submission_package.h"
#include "core/hle/kernel/k_process.h" #include "core/hle/kernel/k_process.h"
#include "core/hle/service/filesystem/filesystem.h" #include "core/hle/service/filesystem/filesystem.h"
@ -109,6 +110,13 @@ AppLoader_NSP::LoadResult AppLoader_NSP::Load(Kernel::KProcess& process, Core::S
return result; return result;
} }
if (nsp->IsExtractedType()) {
system.GetFileSystemController().RegisterProcess(
process.GetProcessId(), {},
std::make_shared<FileSys::RomFSFactory>(*this, system.GetContentProvider(),
system.GetFileSystemController()));
}
FileSys::VirtualFile update_raw; FileSys::VirtualFile update_raw;
if (ReadUpdateRaw(update_raw) == ResultStatus::Success && update_raw != nullptr) { if (ReadUpdateRaw(update_raw) == ResultStatus::Success && update_raw != nullptr) {
system.GetFileSystemController().SetPackedUpdate(process.GetProcessId(), system.GetFileSystemController().SetPackedUpdate(process.GetProcessId(),

View File

@ -110,7 +110,11 @@ void EmulatedController::ReloadFromSettings() {
original_npad_type = npad_type; original_npad_type = npad_type;
} }
SetPollingMode(EmulatedDeviceIndex::RightIndex, Common::Input::PollingMode::Active); // Disable special features before disconnecting
if (controller.right_polling_mode != Common::Input::PollingMode::Active) {
SetPollingMode(EmulatedDeviceIndex::RightIndex, Common::Input::PollingMode::Active);
}
Disconnect(); Disconnect();
if (player.connected) { if (player.connected) {
Connect(); Connect();
@ -1241,7 +1245,12 @@ bool EmulatedController::SetVibration(DeviceIndex device_index, const VibrationV
return false; return false;
} }
last_vibration_value = vibration; // Skip duplicated vibrations
if (last_vibration_value[index] == vibration) {
return Settings::values.vibration_enabled.GetValue();
}
last_vibration_value[index] = vibration;
if (!Settings::values.vibration_enabled) { if (!Settings::values.vibration_enabled) {
return false; return false;
@ -1272,7 +1281,10 @@ bool EmulatedController::SetVibration(DeviceIndex device_index, const VibrationV
} }
VibrationValue EmulatedController::GetActualVibrationValue(DeviceIndex device_index) const { VibrationValue EmulatedController::GetActualVibrationValue(DeviceIndex device_index) const {
return last_vibration_value; if (device_index >= DeviceIndex::MaxDeviceIndex) {
return Core::HID::DEFAULT_VIBRATION_VALUE;
}
return last_vibration_value[static_cast<std::size_t>(device_index)];
} }
bool EmulatedController::IsVibrationEnabled(std::size_t device_index) { bool EmulatedController::IsVibrationEnabled(std::size_t device_index) {

View File

@ -581,7 +581,8 @@ private:
f32 motion_sensitivity{Core::HID::MotionInput::IsAtRestStandard}; f32 motion_sensitivity{Core::HID::MotionInput::IsAtRestStandard};
u32 turbo_button_state{0}; u32 turbo_button_state{0};
std::size_t nfc_handles{0}; std::size_t nfc_handles{0};
VibrationValue last_vibration_value{DEFAULT_VIBRATION_VALUE}; std::array<VibrationValue, 2> last_vibration_value{DEFAULT_VIBRATION_VALUE,
DEFAULT_VIBRATION_VALUE};
// Temporary values to avoid doing changes while the controller is in configuring mode // Temporary values to avoid doing changes while the controller is in configuring mode
NpadStyleIndex tmp_npad_type{NpadStyleIndex::None}; NpadStyleIndex tmp_npad_type{NpadStyleIndex::None};

View File

@ -639,6 +639,15 @@ struct VibrationValue {
f32 low_frequency{}; f32 low_frequency{};
f32 high_amplitude{}; f32 high_amplitude{};
f32 high_frequency{}; f32 high_frequency{};
bool operator==(const VibrationValue& b) {
if (low_amplitude != b.low_amplitude || high_amplitude != b.high_amplitude) {
return false;
}
if (low_frequency != b.low_amplitude || high_frequency != b.high_frequency) {
return false;
}
return true;
}
}; };
static_assert(sizeof(VibrationValue) == 0x10, "VibrationValue has incorrect size."); static_assert(sizeof(VibrationValue) == 0x10, "VibrationValue has incorrect size.");