summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/audio_core/CMakeLists.txt5
-rw-r--r--src/audio_core/algorithm/interpolate.cpp6
-rw-r--r--src/audio_core/audio_renderer.cpp4
-rw-r--r--src/audio_core/codec.cpp6
-rw-r--r--src/audio_core/command_generator.cpp212
-rw-r--r--src/audio_core/command_generator.h4
-rw-r--r--src/audio_core/cubeb_sink.cpp2
-rw-r--r--src/audio_core/cubeb_sink.h2
-rw-r--r--src/audio_core/info_updater.cpp4
-rw-r--r--src/audio_core/mix_context.cpp17
-rw-r--r--src/audio_core/sink_context.cpp5
-rw-r--r--src/audio_core/splitter_context.cpp60
-rw-r--r--src/audio_core/time_stretch.h10
-rw-r--r--src/audio_core/voice_context.cpp47
-rw-r--r--src/common/fiber.h4
-rw-r--r--src/common/file_util.h3
-rw-r--r--src/common/math_util.h4
-rw-r--r--src/common/multi_level_queue.h2
-rw-r--r--src/common/spin_lock.h8
-rw-r--r--src/common/swap.h10
-rw-r--r--src/common/thread_queue_list.h4
-rw-r--r--src/core/CMakeLists.txt5
-rw-r--r--src/core/arm/arm_interface.cpp24
-rw-r--r--src/core/arm/arm_interface.h8
-rw-r--r--src/core/arm/cpu_interrupt_handler.h4
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.cpp10
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.h8
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp10
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.h8
-rw-r--r--src/core/arm/unicorn/arm_unicorn.cpp42
-rw-r--r--src/core/arm/unicorn/arm_unicorn.h8
-rw-r--r--src/core/core_timing.cpp13
-rw-r--r--src/core/core_timing_util.cpp42
-rw-r--r--src/core/core_timing_util.h4
-rw-r--r--src/core/crypto/key_manager.cpp7
-rw-r--r--src/core/crypto/partition_data_manager.cpp2
-rw-r--r--src/core/file_sys/content_archive.cpp4
-rw-r--r--src/core/file_sys/fsmitm_romfsbuild.cpp2
-rw-r--r--src/core/file_sys/ips_layer.cpp41
-rw-r--r--src/core/file_sys/kernel_executable.cpp6
-rw-r--r--src/core/file_sys/nca_patch.cpp7
-rw-r--r--src/core/frontend/applets/controller.cpp2
-rw-r--r--src/core/frontend/applets/profile_select.cpp3
-rw-r--r--src/core/gdbstub/gdbstub.cpp47
-rw-r--r--src/core/gdbstub/gdbstub.h2
-rw-r--r--src/core/hle/ipc_helpers.h4
-rw-r--r--src/core/hle/kernel/address_arbiter.cpp4
-rw-r--r--src/core/hle/kernel/handle_table.cpp2
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp2
-rw-r--r--src/core/hle/kernel/kernel.cpp2
-rw-r--r--src/core/hle/kernel/memory/address_space_info.cpp2
-rw-r--r--src/core/hle/kernel/memory/memory_manager.cpp4
-rw-r--r--src/core/hle/kernel/memory/page_heap.cpp17
-rw-r--r--src/core/hle/kernel/memory/page_heap.h18
-rw-r--r--src/core/hle/kernel/memory/page_table.cpp6
-rw-r--r--src/core/hle/kernel/physical_core.h2
-rw-r--r--src/core/hle/kernel/process.cpp17
-rw-r--r--src/core/hle/kernel/resource_limit.cpp4
-rw-r--r--src/core/hle/kernel/scheduler.cpp72
-rw-r--r--src/core/hle/kernel/svc.cpp7
-rw-r--r--src/core/hle/kernel/svc_wrap.h17
-rw-r--r--src/core/hle/kernel/synchronization.cpp4
-rw-r--r--src/core/hle/kernel/thread.cpp2
-rw-r--r--src/core/hle/kernel/thread.h6
-rw-r--r--src/core/hle/service/acc/profile_manager.cpp13
-rw-r--r--src/core/hle/service/am/am.cpp2
-rw-r--r--src/core/hle/service/am/applets/controller.cpp26
-rw-r--r--src/core/hle/service/audio/audout_u.cpp7
-rw-r--r--src/core/hle/service/audio/hwopus.cpp29
-rw-r--r--src/core/hle/service/bcat/backend/backend.h8
-rw-r--r--src/core/hle/service/bcat/backend/boxcat.cpp9
-rw-r--r--src/core/hle/service/bcat/module.cpp3
-rw-r--r--src/core/hle/service/filesystem/fsp_srv.cpp8
-rw-r--r--src/core/hle/service/hid/controllers/debug_pad.cpp8
-rw-r--r--src/core/hle/service/hid/controllers/gesture.cpp8
-rw-r--r--src/core/hle/service/hid/controllers/keyboard.cpp8
-rw-r--r--src/core/hle/service/hid/controllers/mouse.cpp8
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp69
-rw-r--r--src/core/hle/service/hid/controllers/stubbed.cpp12
-rw-r--r--src/core/hle/service/hid/controllers/touchscreen.cpp9
-rw-r--r--src/core/hle/service/hid/controllers/touchscreen.h2
-rw-r--r--src/core/hle/service/hid/controllers/xpad.cpp8
-rw-r--r--src/core/hle/service/ldr/ldr.cpp4
-rw-r--r--src/core/hle/service/mii/manager.cpp20
-rw-r--r--src/core/hle/service/nfp/nfp.cpp2
-rw-r--r--src/core/hle/service/ns/ns.cpp2
-rw-r--r--src/core/hle/service/ns/pl_u.cpp12
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp48
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp12
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp8
-rw-r--r--src/core/hle/service/nvdrv/interface.cpp8
-rw-r--r--src/core/hle/service/nvflinger/nvflinger.cpp2
-rw-r--r--src/core/hle/service/service.cpp4
-rw-r--r--src/core/hle/service/set/set.cpp6
-rw-r--r--src/core/hle/service/sockets/bsd.cpp72
-rw-r--r--src/core/hle/service/sockets/bsd.h3
-rw-r--r--src/core/hle/service/sockets/sockets_translate.cpp1
-rw-r--r--src/core/hle/service/time/time_zone_manager.cpp118
-rw-r--r--src/core/hle/service/time/time_zone_service.cpp4
-rw-r--r--src/core/loader/elf.cpp35
-rw-r--r--src/core/memory.cpp2
-rw-r--r--src/core/network/network.cpp31
-rw-r--r--src/core/network/network.h12
-rw-r--r--src/core/network/sockets.h6
104 files changed, 665 insertions, 904 deletions
diff --git a/src/audio_core/CMakeLists.txt b/src/audio_core/CMakeLists.txt
index 74c1453aa..54940a034 100644
--- a/src/audio_core/CMakeLists.txt
+++ b/src/audio_core/CMakeLists.txt
@@ -51,9 +51,8 @@ if (NOT MSVC)
51 -Werror=implicit-fallthrough 51 -Werror=implicit-fallthrough
52 -Werror=reorder 52 -Werror=reorder
53 -Werror=sign-compare 53 -Werror=sign-compare
54 -Werror=sign-conversion 54 -Werror=unused-but-set-parameter
55 $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-parameter> 55 -Werror=unused-but-set-variable
56 $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-variable>
57 -Werror=unused-variable 56 -Werror=unused-variable
58 ) 57 )
59endif() 58endif()
diff --git a/src/audio_core/algorithm/interpolate.cpp b/src/audio_core/algorithm/interpolate.cpp
index 587ee5b7b..699fcb84c 100644
--- a/src/audio_core/algorithm/interpolate.cpp
+++ b/src/audio_core/algorithm/interpolate.cpp
@@ -167,8 +167,8 @@ std::vector<s16> Interpolate(InterpolationState& state, std::vector<s16> input,
167 output.reserve(static_cast<std::size_t>(static_cast<double>(input.size()) / ratio + 167 output.reserve(static_cast<std::size_t>(static_cast<double>(input.size()) / ratio +
168 InterpolationState::taps)); 168 InterpolationState::taps));
169 169
170 for (std::size_t frame = 0; frame < num_frames; ++frame) { 170 for (std::size_t frame{}; frame < num_frames; ++frame) {
171 const auto lut_index{static_cast<size_t>(state.fraction >> 8) * InterpolationState::taps}; 171 const std::size_t lut_index{(state.fraction >> 8) * InterpolationState::taps};
172 172
173 std::rotate(state.history.begin(), state.history.end() - 1, state.history.end()); 173 std::rotate(state.history.begin(), state.history.end() - 1, state.history.end());
174 state.history[0][0] = input[frame * 2 + 0]; 174 state.history[0][0] = input[frame * 2 + 0];
@@ -225,7 +225,7 @@ void Resample(s32* output, const s32* input, s32 pitch, s32& fraction, std::size
225 225
226 output[i] = (l0 * s0 + l1 * s1 + l2 * s2 + l3 * s3) >> 15; 226 output[i] = (l0 * s0 + l1 * s1 + l2 * s2 + l3 * s3) >> 15;
227 fraction += pitch; 227 fraction += pitch;
228 index += static_cast<size_t>(fraction >> 15); 228 index += (fraction >> 15);
229 fraction &= 0x7fff; 229 fraction &= 0x7fff;
230 } 230 }
231} 231}
diff --git a/src/audio_core/audio_renderer.cpp b/src/audio_core/audio_renderer.cpp
index 094bace9c..a7e851bb8 100644
--- a/src/audio_core/audio_renderer.cpp
+++ b/src/audio_core/audio_renderer.cpp
@@ -187,8 +187,8 @@ void AudioRenderer::QueueMixedBuffer(Buffer::Tag tag) {
187 const auto& in_params = final_mix.GetInParams(); 187 const auto& in_params = final_mix.GetInParams();
188 std::vector<s32*> mix_buffers(channel_count); 188 std::vector<s32*> mix_buffers(channel_count);
189 for (std::size_t i = 0; i < channel_count; i++) { 189 for (std::size_t i = 0; i < channel_count; i++) {
190 mix_buffers[i] = command_generator.GetMixBuffer( 190 mix_buffers[i] =
191 static_cast<u32>(in_params.buffer_offset) + buffer_offsets[i]); 191 command_generator.GetMixBuffer(in_params.buffer_offset + buffer_offsets[i]);
192 } 192 }
193 193
194 for (std::size_t i = 0; i < BUFFER_SIZE; i++) { 194 for (std::size_t i = 0; i < BUFFER_SIZE; i++) {
diff --git a/src/audio_core/codec.cpp b/src/audio_core/codec.cpp
index d89f94ea2..2fb91c13a 100644
--- a/src/audio_core/codec.cpp
+++ b/src/audio_core/codec.cpp
@@ -32,7 +32,7 @@ std::vector<s16> DecodeADPCM(const u8* const data, std::size_t size, const ADPCM
32 for (std::size_t framei = 0; framei < NUM_FRAMES; framei++) { 32 for (std::size_t framei = 0; framei < NUM_FRAMES; framei++) {
33 const int frame_header = data[framei * FRAME_LEN]; 33 const int frame_header = data[framei * FRAME_LEN];
34 const int scale = 1 << (frame_header & 0xF); 34 const int scale = 1 << (frame_header & 0xF);
35 const auto idx = static_cast<size_t>((frame_header >> 4) & 0x7); 35 const int idx = (frame_header >> 4) & 0x7;
36 36
37 // Coefficients are fixed point with 11 bits fractional part. 37 // Coefficients are fixed point with 11 bits fractional part.
38 const int coef1 = coeff[idx * 2 + 0]; 38 const int coef1 = coeff[idx * 2 + 0];
@@ -57,11 +57,11 @@ std::vector<s16> DecodeADPCM(const u8* const data, std::size_t size, const ADPCM
57 std::size_t outputi = framei * SAMPLES_PER_FRAME; 57 std::size_t outputi = framei * SAMPLES_PER_FRAME;
58 std::size_t datai = framei * FRAME_LEN + 1; 58 std::size_t datai = framei * FRAME_LEN + 1;
59 for (std::size_t i = 0; i < SAMPLES_PER_FRAME && outputi < sample_count; i += 2) { 59 for (std::size_t i = 0; i < SAMPLES_PER_FRAME && outputi < sample_count; i += 2) {
60 const s16 sample1 = decode_sample(SIGNED_NIBBLES[static_cast<u32>(data[datai] >> 4)]); 60 const s16 sample1 = decode_sample(SIGNED_NIBBLES[data[datai] >> 4]);
61 ret[outputi] = sample1; 61 ret[outputi] = sample1;
62 outputi++; 62 outputi++;
63 63
64 const s16 sample2 = decode_sample(SIGNED_NIBBLES[static_cast<u32>(data[datai] & 0xF)]); 64 const s16 sample2 = decode_sample(SIGNED_NIBBLES[data[datai] & 0xF]);
65 ret[outputi] = sample2; 65 ret[outputi] = sample2;
66 outputi++; 66 outputi++;
67 67
diff --git a/src/audio_core/command_generator.cpp b/src/audio_core/command_generator.cpp
index c0edb625d..fb8700ccf 100644
--- a/src/audio_core/command_generator.cpp
+++ b/src/audio_core/command_generator.cpp
@@ -15,8 +15,8 @@ constexpr std::size_t MIX_BUFFER_SIZE = 0x3f00;
15constexpr std::size_t SCALED_MIX_BUFFER_SIZE = MIX_BUFFER_SIZE << 15ULL; 15constexpr std::size_t SCALED_MIX_BUFFER_SIZE = MIX_BUFFER_SIZE << 15ULL;
16 16
17template <std::size_t N> 17template <std::size_t N>
18void ApplyMix(s32* output, const s32* input, s32 gain, std::size_t sample_count) { 18void ApplyMix(s32* output, const s32* input, s32 gain, s32 sample_count) {
19 for (std::size_t i = 0; i < sample_count; i += N) { 19 for (std::size_t i = 0; i < static_cast<std::size_t>(sample_count); i += N) {
20 for (std::size_t j = 0; j < N; j++) { 20 for (std::size_t j = 0; j < N; j++) {
21 output[i + j] += 21 output[i + j] +=
22 static_cast<s32>((static_cast<s64>(input[i + j]) * gain + 0x4000) >> 15); 22 static_cast<s32>((static_cast<s64>(input[i + j]) * gain + 0x4000) >> 15);
@@ -111,8 +111,7 @@ void CommandGenerator::GenerateVoiceCommand(ServerVoiceInfo& voice_info) {
111 const auto channel_count = in_params.channel_count; 111 const auto channel_count = in_params.channel_count;
112 112
113 for (s32 channel = 0; channel < channel_count; channel++) { 113 for (s32 channel = 0; channel < channel_count; channel++) {
114 const auto resource_id = 114 const auto resource_id = in_params.voice_channel_resource_id[channel];
115 static_cast<u32>(in_params.voice_channel_resource_id[static_cast<u32>(channel)]);
116 auto& dsp_state = voice_context.GetDspSharedState(resource_id); 115 auto& dsp_state = voice_context.GetDspSharedState(resource_id);
117 auto& channel_resource = voice_context.GetChannelResource(resource_id); 116 auto& channel_resource = voice_context.GetChannelResource(resource_id);
118 117
@@ -133,15 +132,14 @@ void CommandGenerator::GenerateVoiceCommand(ServerVoiceInfo& voice_info) {
133 132
134 if (in_params.mix_id != AudioCommon::NO_MIX) { 133 if (in_params.mix_id != AudioCommon::NO_MIX) {
135 // If we're using a mix id 134 // If we're using a mix id
136 auto& mix_info = mix_context.GetInfo(static_cast<u32>(in_params.mix_id)); 135 auto& mix_info = mix_context.GetInfo(in_params.mix_id);
137 const auto& dest_mix_params = mix_info.GetInParams(); 136 const auto& dest_mix_params = mix_info.GetInParams();
138 137
139 // Voice Mixing 138 // Voice Mixing
140 GenerateVoiceMixCommand( 139 GenerateVoiceMixCommand(
141 channel_resource.GetCurrentMixVolume(), channel_resource.GetLastMixVolume(), 140 channel_resource.GetCurrentMixVolume(), channel_resource.GetLastMixVolume(),
142 dsp_state, static_cast<u32>(dest_mix_params.buffer_offset), 141 dsp_state, dest_mix_params.buffer_offset, dest_mix_params.buffer_count,
143 static_cast<u32>(dest_mix_params.buffer_count), 142 worker_params.mix_buffer_count + channel, in_params.node_id);
144 worker_params.mix_buffer_count + static_cast<u32>(channel), in_params.node_id);
145 143
146 // Update last mix volumes 144 // Update last mix volumes
147 channel_resource.UpdateLastMixVolumes(); 145 channel_resource.UpdateLastMixVolumes();
@@ -158,15 +156,12 @@ void CommandGenerator::GenerateVoiceCommand(ServerVoiceInfo& voice_info) {
158 continue; 156 continue;
159 } 157 }
160 158
161 const auto& mix_info = 159 const auto& mix_info = mix_context.GetInfo(destination_data->GetMixId());
162 mix_context.GetInfo(static_cast<u32>(destination_data->GetMixId()));
163 const auto& dest_mix_params = mix_info.GetInParams(); 160 const auto& dest_mix_params = mix_info.GetInParams();
164 GenerateVoiceMixCommand( 161 GenerateVoiceMixCommand(
165 destination_data->CurrentMixVolumes(), destination_data->LastMixVolumes(), 162 destination_data->CurrentMixVolumes(), destination_data->LastMixVolumes(),
166 dsp_state, static_cast<u32>(dest_mix_params.buffer_offset), 163 dsp_state, dest_mix_params.buffer_offset, dest_mix_params.buffer_count,
167 static_cast<u32>(dest_mix_params.buffer_count), 164 worker_params.mix_buffer_count + channel, in_params.node_id);
168 worker_params.mix_buffer_count + static_cast<u32>(channel),
169 in_params.node_id);
170 destination_data->MarkDirty(); 165 destination_data->MarkDirty();
171 } 166 }
172 } 167 }
@@ -224,10 +219,9 @@ void CommandGenerator::GenerateDataSourceCommand(ServerVoiceInfo& voice_info, Vo
224 219
225 if (depop) { 220 if (depop) {
226 if (in_params.mix_id != AudioCommon::NO_MIX) { 221 if (in_params.mix_id != AudioCommon::NO_MIX) {
227 auto& mix_info = mix_context.GetInfo(static_cast<u32>(in_params.mix_id)); 222 auto& mix_info = mix_context.GetInfo(in_params.mix_id);
228 const auto& mix_in = mix_info.GetInParams(); 223 const auto& mix_in = mix_info.GetInParams();
229 GenerateDepopPrepareCommand(dsp_state, static_cast<u32>(mix_in.buffer_count), 224 GenerateDepopPrepareCommand(dsp_state, mix_in.buffer_count, mix_in.buffer_offset);
230 static_cast<u32>(mix_in.buffer_offset));
231 } else if (in_params.splitter_info_id != AudioCommon::NO_SPLITTER) { 225 } else if (in_params.splitter_info_id != AudioCommon::NO_SPLITTER) {
232 s32 index{}; 226 s32 index{};
233 while (const auto* destination = 227 while (const auto* destination =
@@ -235,24 +229,23 @@ void CommandGenerator::GenerateDataSourceCommand(ServerVoiceInfo& voice_info, Vo
235 if (!destination->IsConfigured()) { 229 if (!destination->IsConfigured()) {
236 continue; 230 continue;
237 } 231 }
238 auto& mix_info = mix_context.GetInfo(static_cast<u32>(destination->GetMixId())); 232 auto& mix_info = mix_context.GetInfo(destination->GetMixId());
239 const auto& mix_in = mix_info.GetInParams(); 233 const auto& mix_in = mix_info.GetInParams();
240 GenerateDepopPrepareCommand(dsp_state, static_cast<u32>(mix_in.buffer_count), 234 GenerateDepopPrepareCommand(dsp_state, mix_in.buffer_count, mix_in.buffer_offset);
241 static_cast<u32>(mix_in.buffer_offset));
242 } 235 }
243 } 236 }
244 } else { 237 } else {
245 switch (in_params.sample_format) { 238 switch (in_params.sample_format) {
246 case SampleFormat::Pcm16: 239 case SampleFormat::Pcm16:
247 DecodeFromWaveBuffers(voice_info, GetChannelMixBuffer(channel), dsp_state, channel, 240 DecodeFromWaveBuffers(voice_info, GetChannelMixBuffer(channel), dsp_state, channel,
248 static_cast<s32>(worker_params.sample_rate), 241 worker_params.sample_rate, worker_params.sample_count,
249 static_cast<s32>(worker_params.sample_count), in_params.node_id); 242 in_params.node_id);
250 break; 243 break;
251 case SampleFormat::Adpcm: 244 case SampleFormat::Adpcm:
252 ASSERT(channel == 0 && in_params.channel_count == 1); 245 ASSERT(channel == 0 && in_params.channel_count == 1);
253 DecodeFromWaveBuffers(voice_info, GetChannelMixBuffer(0), dsp_state, 0, 246 DecodeFromWaveBuffers(voice_info, GetChannelMixBuffer(0), dsp_state, 0,
254 static_cast<s32>(worker_params.sample_rate), 247 worker_params.sample_rate, worker_params.sample_count,
255 static_cast<s32>(worker_params.sample_count), in_params.node_id); 248 in_params.node_id);
256 break; 249 break;
257 default: 250 default:
258 UNREACHABLE_MSG("Unimplemented sample format={}", in_params.sample_format); 251 UNREACHABLE_MSG("Unimplemented sample format={}", in_params.sample_format);
@@ -262,7 +255,7 @@ void CommandGenerator::GenerateDataSourceCommand(ServerVoiceInfo& voice_info, Vo
262 255
263void CommandGenerator::GenerateBiquadFilterCommandForVoice(ServerVoiceInfo& voice_info, 256void CommandGenerator::GenerateBiquadFilterCommandForVoice(ServerVoiceInfo& voice_info,
264 VoiceState& dsp_state, 257 VoiceState& dsp_state,
265 u32 mix_buffer_count, s32 channel) { 258 s32 mix_buffer_count, s32 channel) {
266 for (std::size_t i = 0; i < AudioCommon::MAX_BIQUAD_FILTERS; i++) { 259 for (std::size_t i = 0; i < AudioCommon::MAX_BIQUAD_FILTERS; i++) {
267 const auto& in_params = voice_info.GetInParams(); 260 const auto& in_params = voice_info.GetInParams();
268 auto& biquad_filter = in_params.biquad_filter[i]; 261 auto& biquad_filter = in_params.biquad_filter[i];
@@ -342,8 +335,8 @@ void CommandGenerator::GenerateDepopForMixBuffersCommand(std::size_t mix_buffer_
342 continue; 335 continue;
343 } 336 }
344 337
345 depop_buffer[i] = ApplyMixDepop(GetMixBuffer(i), depop_buffer[i], delta, 338 depop_buffer[i] =
346 static_cast<s32>(worker_params.sample_count)); 339 ApplyMixDepop(GetMixBuffer(i), depop_buffer[i], delta, worker_params.sample_count);
347 } 340 }
348} 341}
349 342
@@ -355,7 +348,7 @@ void CommandGenerator::GenerateEffectCommand(ServerMixInfo& mix_info) {
355 if (index == AudioCommon::NO_EFFECT_ORDER) { 348 if (index == AudioCommon::NO_EFFECT_ORDER) {
356 break; 349 break;
357 } 350 }
358 auto* info = effect_context.GetInfo(static_cast<u32>(index)); 351 auto* info = effect_context.GetInfo(index);
359 const auto type = info->GetType(); 352 const auto type = info->GetType();
360 353
361 // TODO(ogniK): Finish remaining effects 354 // TODO(ogniK): Finish remaining effects
@@ -384,11 +377,11 @@ void CommandGenerator::GenerateI3dl2ReverbEffectCommand(s32 mix_buffer_offset, E
384 } 377 }
385 const auto& params = dynamic_cast<EffectI3dl2Reverb*>(info)->GetParams(); 378 const auto& params = dynamic_cast<EffectI3dl2Reverb*>(info)->GetParams();
386 const auto channel_count = params.channel_count; 379 const auto channel_count = params.channel_count;
387 for (size_t i = 0; i < channel_count; i++) { 380 for (s32 i = 0; i < channel_count; i++) {
388 // TODO(ogniK): Actually implement reverb 381 // TODO(ogniK): Actually implement reverb
389 if (params.input[i] != params.output[i]) { 382 if (params.input[i] != params.output[i]) {
390 const auto* input = GetMixBuffer(static_cast<u32>(mix_buffer_offset + params.input[i])); 383 const auto* input = GetMixBuffer(mix_buffer_offset + params.input[i]);
391 auto* output = GetMixBuffer(static_cast<u32>(mix_buffer_offset + params.output[i])); 384 auto* output = GetMixBuffer(mix_buffer_offset + params.output[i]);
392 ApplyMix<1>(output, input, 32768, worker_params.sample_count); 385 ApplyMix<1>(output, input, 32768, worker_params.sample_count);
393 } 386 }
394 } 387 }
@@ -399,14 +392,13 @@ void CommandGenerator::GenerateBiquadFilterEffectCommand(s32 mix_buffer_offset,
399 if (!enabled) { 392 if (!enabled) {
400 return; 393 return;
401 } 394 }
402
403 const auto& params = dynamic_cast<EffectBiquadFilter*>(info)->GetParams(); 395 const auto& params = dynamic_cast<EffectBiquadFilter*>(info)->GetParams();
404 const auto channel_count = static_cast<u32>(params.channel_count); 396 const auto channel_count = params.channel_count;
405 for (size_t i = 0; i < channel_count; i++) { 397 for (s32 i = 0; i < channel_count; i++) {
406 // TODO(ogniK): Actually implement biquad filter 398 // TODO(ogniK): Actually implement biquad filter
407 if (params.input[i] != params.output[i]) { 399 if (params.input[i] != params.output[i]) {
408 const auto* input = GetMixBuffer(static_cast<u32>(mix_buffer_offset + params.input[i])); 400 const auto* input = GetMixBuffer(mix_buffer_offset + params.input[i]);
409 auto* output = GetMixBuffer(static_cast<u32>(mix_buffer_offset + params.output[i])); 401 auto* output = GetMixBuffer(mix_buffer_offset + params.output[i]);
410 ApplyMix<1>(output, input, 32768, worker_params.sample_count); 402 ApplyMix<1>(output, input, 32768, worker_params.sample_count);
411 } 403 }
412 } 404 }
@@ -433,30 +425,26 @@ void CommandGenerator::GenerateAuxCommand(s32 mix_buffer_offset, EffectBase* inf
433 memory.ReadBlock(aux->GetSendInfo(), &send_info, sizeof(AuxInfoDSP)); 425 memory.ReadBlock(aux->GetSendInfo(), &send_info, sizeof(AuxInfoDSP));
434 memory.ReadBlock(aux->GetRecvInfo(), &recv_info, sizeof(AuxInfoDSP)); 426 memory.ReadBlock(aux->GetRecvInfo(), &recv_info, sizeof(AuxInfoDSP));
435 427
436 WriteAuxBuffer(send_info, aux->GetSendBuffer(), 428 WriteAuxBuffer(send_info, aux->GetSendBuffer(), params.sample_count,
437 static_cast<u32>(params.sample_count), 429 GetMixBuffer(input_index), worker_params.sample_count, offset,
438 GetMixBuffer(static_cast<u32>(input_index)), 430 write_count);
439 worker_params.sample_count, offset, write_count);
440 memory.WriteBlock(aux->GetSendInfo(), &send_info, sizeof(AuxInfoDSP)); 431 memory.WriteBlock(aux->GetSendInfo(), &send_info, sizeof(AuxInfoDSP));
441 432
442 const auto samples_read = ReadAuxBuffer( 433 const auto samples_read = ReadAuxBuffer(
443 recv_info, aux->GetRecvBuffer(), static_cast<u32>(params.sample_count), 434 recv_info, aux->GetRecvBuffer(), params.sample_count,
444 GetMixBuffer(static_cast<u32>(output_index)), worker_params.sample_count, 435 GetMixBuffer(output_index), worker_params.sample_count, offset, write_count);
445 offset, write_count);
446 memory.WriteBlock(aux->GetRecvInfo(), &recv_info, sizeof(AuxInfoDSP)); 436 memory.WriteBlock(aux->GetRecvInfo(), &recv_info, sizeof(AuxInfoDSP));
447 437
448 if (samples_read != static_cast<int>(worker_params.sample_count) && 438 if (samples_read != static_cast<int>(worker_params.sample_count) &&
449 samples_read <= params.sample_count) { 439 samples_read <= params.sample_count) {
450 std::memset(GetMixBuffer(static_cast<u32>(output_index)), 0, 440 std::memset(GetMixBuffer(output_index), 0, params.sample_count - samples_read);
451 static_cast<size_t>(params.sample_count - samples_read));
452 } 441 }
453 } else { 442 } else {
454 AuxInfoDSP empty{}; 443 AuxInfoDSP empty{};
455 memory.WriteBlock(aux->GetSendInfo(), &empty, sizeof(AuxInfoDSP)); 444 memory.WriteBlock(aux->GetSendInfo(), &empty, sizeof(AuxInfoDSP));
456 memory.WriteBlock(aux->GetRecvInfo(), &empty, sizeof(AuxInfoDSP)); 445 memory.WriteBlock(aux->GetRecvInfo(), &empty, sizeof(AuxInfoDSP));
457 if (output_index != input_index) { 446 if (output_index != input_index) {
458 std::memcpy(GetMixBuffer(static_cast<u32>(output_index)), 447 std::memcpy(GetMixBuffer(output_index), GetMixBuffer(input_index),
459 GetMixBuffer(static_cast<u32>(input_index)),
460 worker_params.sample_count * sizeof(s32)); 448 worker_params.sample_count * sizeof(s32));
461 } 449 }
462 } 450 }
@@ -470,8 +458,7 @@ ServerSplitterDestinationData* CommandGenerator::GetDestinationData(s32 splitter
470 if (splitter_id == AudioCommon::NO_SPLITTER) { 458 if (splitter_id == AudioCommon::NO_SPLITTER) {
471 return nullptr; 459 return nullptr;
472 } 460 }
473 return splitter_context.GetDestinationData(static_cast<u32>(splitter_id), 461 return splitter_context.GetDestinationData(splitter_id, index);
474 static_cast<u32>(index));
475} 462}
476 463
477s32 CommandGenerator::WriteAuxBuffer(AuxInfoDSP& dsp_info, VAddr send_buffer, u32 max_samples, 464s32 CommandGenerator::WriteAuxBuffer(AuxInfoDSP& dsp_info, VAddr send_buffer, u32 max_samples,
@@ -501,7 +488,7 @@ s32 CommandGenerator::WriteAuxBuffer(AuxInfoDSP& dsp_info, VAddr send_buffer, u3
501 if (write_count != 0) { 488 if (write_count != 0) {
502 dsp_info.write_offset = (dsp_info.write_offset + write_count) % max_samples; 489 dsp_info.write_offset = (dsp_info.write_offset + write_count) % max_samples;
503 } 490 }
504 return static_cast<s32>(sample_count); 491 return sample_count;
505} 492}
506 493
507s32 CommandGenerator::ReadAuxBuffer(AuxInfoDSP& recv_info, VAddr recv_buffer, u32 max_samples, 494s32 CommandGenerator::ReadAuxBuffer(AuxInfoDSP& recv_info, VAddr recv_buffer, u32 max_samples,
@@ -531,7 +518,7 @@ s32 CommandGenerator::ReadAuxBuffer(AuxInfoDSP& recv_info, VAddr recv_buffer, u3
531 if (read_count != 0) { 518 if (read_count != 0) {
532 recv_info.read_offset = (recv_info.read_offset + read_count) % max_samples; 519 recv_info.read_offset = (recv_info.read_offset + read_count) % max_samples;
533 } 520 }
534 return static_cast<s32>(sample_count); 521 return sample_count;
535} 522}
536 523
537void CommandGenerator::GenerateVolumeRampCommand(float last_volume, float current_volume, 524void CommandGenerator::GenerateVolumeRampCommand(float last_volume, float current_volume,
@@ -550,15 +537,15 @@ void CommandGenerator::GenerateVolumeRampCommand(float last_volume, float curren
550 } 537 }
551 // Apply generic gain on samples 538 // Apply generic gain on samples
552 ApplyGain(GetChannelMixBuffer(channel), GetChannelMixBuffer(channel), last, delta, 539 ApplyGain(GetChannelMixBuffer(channel), GetChannelMixBuffer(channel), last, delta,
553 static_cast<s32>(worker_params.sample_count)); 540 worker_params.sample_count);
554} 541}
555 542
556void CommandGenerator::GenerateVoiceMixCommand(const MixVolumeBuffer& mix_volumes, 543void CommandGenerator::GenerateVoiceMixCommand(const MixVolumeBuffer& mix_volumes,
557 const MixVolumeBuffer& last_mix_volumes, 544 const MixVolumeBuffer& last_mix_volumes,
558 VoiceState& dsp_state, u32 mix_buffer_offset, 545 VoiceState& dsp_state, s32 mix_buffer_offset,
559 u32 mix_buffer_count, u32 voice_index, s32 node_id) { 546 s32 mix_buffer_count, s32 voice_index, s32 node_id) {
560 // Loop all our mix buffers 547 // Loop all our mix buffers
561 for (size_t i = 0; i < mix_buffer_count; i++) { 548 for (s32 i = 0; i < mix_buffer_count; i++) {
562 if (last_mix_volumes[i] != 0.0f || mix_volumes[i] != 0.0f) { 549 if (last_mix_volumes[i] != 0.0f || mix_volumes[i] != 0.0f) {
563 const auto delta = static_cast<float>((mix_volumes[i] - last_mix_volumes[i])) / 550 const auto delta = static_cast<float>((mix_volumes[i] - last_mix_volumes[i])) /
564 static_cast<float>(worker_params.sample_count); 551 static_cast<float>(worker_params.sample_count);
@@ -571,9 +558,9 @@ void CommandGenerator::GenerateVoiceMixCommand(const MixVolumeBuffer& mix_volume
571 mix_volumes[i]); 558 mix_volumes[i]);
572 } 559 }
573 560
574 dsp_state.previous_samples[i] = ApplyMixRamp( 561 dsp_state.previous_samples[i] =
575 GetMixBuffer(mix_buffer_offset + i), GetMixBuffer(voice_index), last_mix_volumes[i], 562 ApplyMixRamp(GetMixBuffer(mix_buffer_offset + i), GetMixBuffer(voice_index),
576 delta, static_cast<s32>(worker_params.sample_count)); 563 last_mix_volumes[i], delta, worker_params.sample_count);
577 } else { 564 } else {
578 dsp_state.previous_samples[i] = 0; 565 dsp_state.previous_samples[i] = 0;
579 } 566 }
@@ -585,8 +572,7 @@ void CommandGenerator::GenerateSubMixCommand(ServerMixInfo& mix_info) {
585 LOG_DEBUG(Audio, "(DSP_TRACE) GenerateSubMixCommand"); 572 LOG_DEBUG(Audio, "(DSP_TRACE) GenerateSubMixCommand");
586 } 573 }
587 const auto& in_params = mix_info.GetInParams(); 574 const auto& in_params = mix_info.GetInParams();
588 GenerateDepopForMixBuffersCommand(static_cast<u32>(in_params.buffer_count), 575 GenerateDepopForMixBuffersCommand(in_params.buffer_count, in_params.buffer_offset,
589 static_cast<u32>(in_params.buffer_offset),
590 in_params.sample_rate); 576 in_params.sample_rate);
591 577
592 GenerateEffectCommand(mix_info); 578 GenerateEffectCommand(mix_info);
@@ -600,18 +586,18 @@ void CommandGenerator::GenerateMixCommands(ServerMixInfo& mix_info) {
600 } 586 }
601 const auto& in_params = mix_info.GetInParams(); 587 const auto& in_params = mix_info.GetInParams();
602 if (in_params.dest_mix_id != AudioCommon::NO_MIX) { 588 if (in_params.dest_mix_id != AudioCommon::NO_MIX) {
603 const auto& dest_mix = mix_context.GetInfo(static_cast<u32>(in_params.dest_mix_id)); 589 const auto& dest_mix = mix_context.GetInfo(in_params.dest_mix_id);
604 const auto& dest_in_params = dest_mix.GetInParams(); 590 const auto& dest_in_params = dest_mix.GetInParams();
605 591
606 const auto buffer_count = static_cast<u32>(in_params.buffer_count); 592 const auto buffer_count = in_params.buffer_count;
607 593
608 for (u32 i = 0; i < buffer_count; i++) { 594 for (s32 i = 0; i < buffer_count; i++) {
609 for (u32 j = 0; j < static_cast<u32>(dest_in_params.buffer_count); j++) { 595 for (s32 j = 0; j < dest_in_params.buffer_count; j++) {
610 const auto mixed_volume = in_params.volume * in_params.mix_volume[i][j]; 596 const auto mixed_volume = in_params.volume * in_params.mix_volume[i][j];
611 if (mixed_volume != 0.0f) { 597 if (mixed_volume != 0.0f) {
612 GenerateMixCommand(static_cast<size_t>(dest_in_params.buffer_offset) + j, 598 GenerateMixCommand(dest_in_params.buffer_offset + j,
613 static_cast<size_t>(in_params.buffer_offset) + i, 599 in_params.buffer_offset + i, mixed_volume,
614 mixed_volume, static_cast<s32>(in_params.node_id)); 600 in_params.node_id);
615 } 601 }
616 } 602 }
617 } 603 }
@@ -622,17 +608,15 @@ void CommandGenerator::GenerateMixCommands(ServerMixInfo& mix_info) {
622 continue; 608 continue;
623 } 609 }
624 610
625 const auto& dest_mix = 611 const auto& dest_mix = mix_context.GetInfo(destination_data->GetMixId());
626 mix_context.GetInfo(static_cast<u32>(destination_data->GetMixId()));
627 const auto& dest_in_params = dest_mix.GetInParams(); 612 const auto& dest_in_params = dest_mix.GetInParams();
628 const auto mix_index = (base - 1) % in_params.buffer_count + in_params.buffer_offset; 613 const auto mix_index = (base - 1) % in_params.buffer_count + in_params.buffer_offset;
629 for (std::size_t i = 0; i < static_cast<std::size_t>(dest_in_params.buffer_count); 614 for (std::size_t i = 0; i < static_cast<std::size_t>(dest_in_params.buffer_count);
630 i++) { 615 i++) {
631 const auto mixed_volume = in_params.volume * destination_data->GetMixVolume(i); 616 const auto mixed_volume = in_params.volume * destination_data->GetMixVolume(i);
632 if (mixed_volume != 0.0f) { 617 if (mixed_volume != 0.0f) {
633 GenerateMixCommand(static_cast<size_t>(dest_in_params.buffer_offset) + i, 618 GenerateMixCommand(dest_in_params.buffer_offset + i, mix_index, mixed_volume,
634 static_cast<size_t>(mix_index), mixed_volume, 619 in_params.node_id);
635 static_cast<s32>(in_params.node_id));
636 } 620 }
637 } 621 }
638 } 622 }
@@ -651,8 +635,7 @@ void CommandGenerator::GenerateMixCommand(std::size_t output_offset, std::size_t
651 auto* output = GetMixBuffer(output_offset); 635 auto* output = GetMixBuffer(output_offset);
652 const auto* input = GetMixBuffer(input_offset); 636 const auto* input = GetMixBuffer(input_offset);
653 637
654 const auto gain = static_cast<s32>(volume * 32768.0f); 638 const s32 gain = static_cast<s32>(volume * 32768.0f);
655
656 // Mix with loop unrolling 639 // Mix with loop unrolling
657 if (worker_params.sample_count % 4 == 0) { 640 if (worker_params.sample_count % 4 == 0) {
658 ApplyMix<4>(output, input, gain, worker_params.sample_count); 641 ApplyMix<4>(output, input, gain, worker_params.sample_count);
@@ -670,8 +653,7 @@ void CommandGenerator::GenerateFinalMixCommand() {
670 auto& mix_info = mix_context.GetFinalMixInfo(); 653 auto& mix_info = mix_context.GetFinalMixInfo();
671 const auto& in_params = mix_info.GetInParams(); 654 const auto& in_params = mix_info.GetInParams();
672 655
673 GenerateDepopForMixBuffersCommand(static_cast<u32>(in_params.buffer_count), 656 GenerateDepopForMixBuffersCommand(in_params.buffer_count, in_params.buffer_offset,
674 static_cast<u32>(in_params.buffer_offset),
675 in_params.sample_rate); 657 in_params.sample_rate);
676 658
677 GenerateEffectCommand(mix_info); 659 GenerateEffectCommand(mix_info);
@@ -685,16 +667,16 @@ void CommandGenerator::GenerateFinalMixCommand() {
685 in_params.node_id, in_params.buffer_offset + i, in_params.buffer_offset + i, 667 in_params.node_id, in_params.buffer_offset + i, in_params.buffer_offset + i,
686 in_params.volume); 668 in_params.volume);
687 } 669 }
688 ApplyGainWithoutDelta(GetMixBuffer(static_cast<size_t>(in_params.buffer_offset + i)), 670 ApplyGainWithoutDelta(GetMixBuffer(in_params.buffer_offset + i),
689 GetMixBuffer(static_cast<size_t>(in_params.buffer_offset + i)), gain, 671 GetMixBuffer(in_params.buffer_offset + i), gain,
690 static_cast<s32>(worker_params.sample_count)); 672 worker_params.sample_count);
691 } 673 }
692} 674}
693 675
694s32 CommandGenerator::DecodePcm16(ServerVoiceInfo& voice_info, VoiceState& dsp_state, 676s32 CommandGenerator::DecodePcm16(ServerVoiceInfo& voice_info, VoiceState& dsp_state,
695 s32 sample_count, s32 channel, std::size_t mix_offset) { 677 s32 sample_count, s32 channel, std::size_t mix_offset) {
696 const auto& in_params = voice_info.GetInParams(); 678 const auto& in_params = voice_info.GetInParams();
697 const auto& wave_buffer = in_params.wave_buffer[static_cast<u32>(dsp_state.wave_buffer_index)]; 679 const auto& wave_buffer = in_params.wave_buffer[dsp_state.wave_buffer_index];
698 if (wave_buffer.buffer_address == 0) { 680 if (wave_buffer.buffer_address == 0) {
699 return 0; 681 return 0;
700 } 682 }
@@ -707,26 +689,24 @@ s32 CommandGenerator::DecodePcm16(ServerVoiceInfo& voice_info, VoiceState& dsp_s
707 const auto samples_remaining = 689 const auto samples_remaining =
708 (wave_buffer.end_sample_offset - wave_buffer.start_sample_offset) - dsp_state.offset; 690 (wave_buffer.end_sample_offset - wave_buffer.start_sample_offset) - dsp_state.offset;
709 const auto start_offset = 691 const auto start_offset =
710 static_cast<size_t>((wave_buffer.start_sample_offset + dsp_state.offset) * 692 ((wave_buffer.start_sample_offset + dsp_state.offset) * in_params.channel_count) *
711 in_params.channel_count) *
712 sizeof(s16); 693 sizeof(s16);
713 const auto buffer_pos = wave_buffer.buffer_address + start_offset; 694 const auto buffer_pos = wave_buffer.buffer_address + start_offset;
714 const auto samples_processed = std::min(sample_count, samples_remaining); 695 const auto samples_processed = std::min(sample_count, samples_remaining);
715 696
716 if (in_params.channel_count == 1) { 697 if (in_params.channel_count == 1) {
717 std::vector<s16> buffer(static_cast<size_t>(samples_processed)); 698 std::vector<s16> buffer(samples_processed);
718 memory.ReadBlock(buffer_pos, buffer.data(), buffer.size() * sizeof(s16)); 699 memory.ReadBlock(buffer_pos, buffer.data(), buffer.size() * sizeof(s16));
719 for (std::size_t i = 0; i < buffer.size(); i++) { 700 for (std::size_t i = 0; i < buffer.size(); i++) {
720 sample_buffer[mix_offset + i] = buffer[i]; 701 sample_buffer[mix_offset + i] = buffer[i];
721 } 702 }
722 } else { 703 } else {
723 const auto channel_count = in_params.channel_count; 704 const auto channel_count = in_params.channel_count;
724 std::vector<s16> buffer(static_cast<size_t>(samples_processed * channel_count)); 705 std::vector<s16> buffer(samples_processed * channel_count);
725 memory.ReadBlock(buffer_pos, buffer.data(), buffer.size() * sizeof(s16)); 706 memory.ReadBlock(buffer_pos, buffer.data(), buffer.size() * sizeof(s16));
726 707
727 for (std::size_t i = 0; i < static_cast<std::size_t>(samples_processed); i++) { 708 for (std::size_t i = 0; i < static_cast<std::size_t>(samples_processed); i++) {
728 sample_buffer[mix_offset + i] = 709 sample_buffer[mix_offset + i] = buffer[i * channel_count + channel];
729 buffer[i * static_cast<u32>(channel_count) + static_cast<u32>(channel)];
730 } 710 }
731 } 711 }
732 712
@@ -736,7 +716,7 @@ s32 CommandGenerator::DecodePcm16(ServerVoiceInfo& voice_info, VoiceState& dsp_s
736s32 CommandGenerator::DecodeAdpcm(ServerVoiceInfo& voice_info, VoiceState& dsp_state, 716s32 CommandGenerator::DecodeAdpcm(ServerVoiceInfo& voice_info, VoiceState& dsp_state,
737 s32 sample_count, s32 channel, std::size_t mix_offset) { 717 s32 sample_count, s32 channel, std::size_t mix_offset) {
738 const auto& in_params = voice_info.GetInParams(); 718 const auto& in_params = voice_info.GetInParams();
739 const auto& wave_buffer = in_params.wave_buffer[static_cast<u32>(dsp_state.wave_buffer_index)]; 719 const auto& wave_buffer = in_params.wave_buffer[dsp_state.wave_buffer_index];
740 if (wave_buffer.buffer_address == 0) { 720 if (wave_buffer.buffer_address == 0) {
741 return 0; 721 return 0;
742 } 722 }
@@ -756,7 +736,7 @@ s32 CommandGenerator::DecodeAdpcm(ServerVoiceInfo& voice_info, VoiceState& dsp_s
756 constexpr std::size_t SAMPLES_PER_FRAME = 14; 736 constexpr std::size_t SAMPLES_PER_FRAME = 14;
757 737
758 auto frame_header = dsp_state.context.header; 738 auto frame_header = dsp_state.context.header;
759 auto idx = static_cast<size_t>((frame_header >> 4) & 0xf); 739 s32 idx = (frame_header >> 4) & 0xf;
760 s32 scale = frame_header & 0xf; 740 s32 scale = frame_header & 0xf;
761 s16 yn1 = dsp_state.context.yn1; 741 s16 yn1 = dsp_state.context.yn1;
762 s16 yn2 = dsp_state.context.yn2; 742 s16 yn2 = dsp_state.context.yn2;
@@ -773,10 +753,9 @@ s32 CommandGenerator::DecodeAdpcm(ServerVoiceInfo& voice_info, VoiceState& dsp_s
773 const auto samples_processed = std::min(sample_count, samples_remaining); 753 const auto samples_processed = std::min(sample_count, samples_remaining);
774 const auto sample_pos = wave_buffer.start_sample_offset + dsp_state.offset; 754 const auto sample_pos = wave_buffer.start_sample_offset + dsp_state.offset;
775 755
776 const auto samples_remaining_in_frame = static_cast<u32>(sample_pos) % SAMPLES_PER_FRAME; 756 const auto samples_remaining_in_frame = sample_pos % SAMPLES_PER_FRAME;
777 auto position_in_frame = 757 auto position_in_frame = ((sample_pos / SAMPLES_PER_FRAME) * NIBBLES_PER_SAMPLE) +
778 ((static_cast<u32>(sample_pos) / SAMPLES_PER_FRAME) * NIBBLES_PER_SAMPLE) + 758 samples_remaining_in_frame + (samples_remaining_in_frame != 0 ? 2 : 0);
779 samples_remaining_in_frame + (samples_remaining_in_frame != 0 ? 2 : 0);
780 759
781 const auto decode_sample = [&](const int nibble) -> s16 { 760 const auto decode_sample = [&](const int nibble) -> s16 {
782 const int xn = nibble * (1 << scale); 761 const int xn = nibble * (1 << scale);
@@ -795,7 +774,7 @@ s32 CommandGenerator::DecodeAdpcm(ServerVoiceInfo& voice_info, VoiceState& dsp_s
795 774
796 std::size_t buffer_offset{}; 775 std::size_t buffer_offset{};
797 std::vector<u8> buffer( 776 std::vector<u8> buffer(
798 std::max((static_cast<u32>(samples_processed) / FRAME_LEN) * SAMPLES_PER_FRAME, FRAME_LEN)); 777 std::max((samples_processed / FRAME_LEN) * SAMPLES_PER_FRAME, FRAME_LEN));
799 memory.ReadBlock(wave_buffer.buffer_address + (position_in_frame / 2), buffer.data(), 778 memory.ReadBlock(wave_buffer.buffer_address + (position_in_frame / 2), buffer.data(),
800 buffer.size()); 779 buffer.size());
801 std::size_t cur_mix_offset = mix_offset; 780 std::size_t cur_mix_offset = mix_offset;
@@ -805,7 +784,7 @@ s32 CommandGenerator::DecodeAdpcm(ServerVoiceInfo& voice_info, VoiceState& dsp_s
805 if (position_in_frame % NIBBLES_PER_SAMPLE == 0) { 784 if (position_in_frame % NIBBLES_PER_SAMPLE == 0) {
806 // Read header 785 // Read header
807 frame_header = buffer[buffer_offset++]; 786 frame_header = buffer[buffer_offset++];
808 idx = static_cast<size_t>((frame_header >> 4) & 0xf); 787 idx = (frame_header >> 4) & 0xf;
809 scale = frame_header & 0xf; 788 scale = frame_header & 0xf;
810 coef1 = coeffs[idx * 2]; 789 coef1 = coeffs[idx * 2];
811 coef2 = coeffs[idx * 2 + 1]; 790 coef2 = coeffs[idx * 2 + 1];
@@ -815,8 +794,8 @@ s32 CommandGenerator::DecodeAdpcm(ServerVoiceInfo& voice_info, VoiceState& dsp_s
815 if (remaining_samples >= static_cast<int>(SAMPLES_PER_FRAME)) { 794 if (remaining_samples >= static_cast<int>(SAMPLES_PER_FRAME)) {
816 for (std::size_t i = 0; i < SAMPLES_PER_FRAME / 2; i++) { 795 for (std::size_t i = 0; i < SAMPLES_PER_FRAME / 2; i++) {
817 // Sample 1 796 // Sample 1
818 const s32 s0 = SIGNED_NIBBLES[static_cast<u32>(buffer[buffer_offset] >> 4)]; 797 const s32 s0 = SIGNED_NIBBLES[buffer[buffer_offset] >> 4];
819 const s32 s1 = SIGNED_NIBBLES[static_cast<u32>(buffer[buffer_offset++] & 0xf)]; 798 const s32 s1 = SIGNED_NIBBLES[buffer[buffer_offset++] & 0xf];
820 const s16 sample_1 = decode_sample(s0); 799 const s16 sample_1 = decode_sample(s0);
821 const s16 sample_2 = decode_sample(s1); 800 const s16 sample_2 = decode_sample(s1);
822 sample_buffer[cur_mix_offset++] = sample_1; 801 sample_buffer[cur_mix_offset++] = sample_1;
@@ -828,14 +807,14 @@ s32 CommandGenerator::DecodeAdpcm(ServerVoiceInfo& voice_info, VoiceState& dsp_s
828 } 807 }
829 } 808 }
830 // Decode mid frame 809 // Decode mid frame
831 auto current_nibble = static_cast<s32>(buffer[buffer_offset]); 810 s32 current_nibble = buffer[buffer_offset];
832 if ((position_in_frame++ & 1) != 0) { 811 if (position_in_frame++ & 0x1) {
833 current_nibble &= 0xf; 812 current_nibble &= 0xf;
834 buffer_offset++; 813 buffer_offset++;
835 } else { 814 } else {
836 current_nibble >>= 4; 815 current_nibble >>= 4;
837 } 816 }
838 const s16 sample = decode_sample(SIGNED_NIBBLES[static_cast<u32>(current_nibble)]); 817 const s16 sample = decode_sample(SIGNED_NIBBLES[current_nibble]);
839 sample_buffer[cur_mix_offset++] = sample; 818 sample_buffer[cur_mix_offset++] = sample;
840 remaining_samples--; 819 remaining_samples--;
841 } 820 }
@@ -856,7 +835,7 @@ const s32* CommandGenerator::GetMixBuffer(std::size_t index) const {
856} 835}
857 836
858std::size_t CommandGenerator::GetMixChannelBufferOffset(s32 channel) const { 837std::size_t CommandGenerator::GetMixChannelBufferOffset(s32 channel) const {
859 return worker_params.mix_buffer_count + static_cast<u32>(channel); 838 return worker_params.mix_buffer_count + channel;
860} 839}
861 840
862std::size_t CommandGenerator::GetTotalMixBufferCount() const { 841std::size_t CommandGenerator::GetTotalMixBufferCount() const {
@@ -864,11 +843,11 @@ std::size_t CommandGenerator::GetTotalMixBufferCount() const {
864} 843}
865 844
866s32* CommandGenerator::GetChannelMixBuffer(s32 channel) { 845s32* CommandGenerator::GetChannelMixBuffer(s32 channel) {
867 return GetMixBuffer(worker_params.mix_buffer_count + static_cast<u32>(channel)); 846 return GetMixBuffer(worker_params.mix_buffer_count + channel);
868} 847}
869 848
870const s32* CommandGenerator::GetChannelMixBuffer(s32 channel) const { 849const s32* CommandGenerator::GetChannelMixBuffer(s32 channel) const {
871 return GetMixBuffer(worker_params.mix_buffer_count + static_cast<u32>(channel)); 850 return GetMixBuffer(worker_params.mix_buffer_count + channel);
872} 851}
873 852
874void CommandGenerator::DecodeFromWaveBuffers(ServerVoiceInfo& voice_info, s32* output, 853void CommandGenerator::DecodeFromWaveBuffers(ServerVoiceInfo& voice_info, s32* output,
@@ -916,10 +895,9 @@ void CommandGenerator::DecodeFromWaveBuffers(ServerVoiceInfo& voice_info, s32* o
916 895
917 s32 samples_read{}; 896 s32 samples_read{};
918 while (samples_read < samples_to_read) { 897 while (samples_read < samples_to_read) {
919 const auto& wave_buffer = 898 const auto& wave_buffer = in_params.wave_buffer[dsp_state.wave_buffer_index];
920 in_params.wave_buffer[static_cast<u32>(dsp_state.wave_buffer_index)];
921 // No more data can be read 899 // No more data can be read
922 if (!dsp_state.is_wave_buffer_valid[static_cast<u32>(dsp_state.wave_buffer_index)]) { 900 if (!dsp_state.is_wave_buffer_valid[dsp_state.wave_buffer_index]) {
923 is_buffer_completed = true; 901 is_buffer_completed = true;
924 break; 902 break;
925 } 903 }
@@ -943,7 +921,7 @@ void CommandGenerator::DecodeFromWaveBuffers(ServerVoiceInfo& voice_info, s32* o
943 UNREACHABLE_MSG("Unimplemented sample format={}", in_params.sample_format); 921 UNREACHABLE_MSG("Unimplemented sample format={}", in_params.sample_format);
944 } 922 }
945 923
946 temp_mix_offset += static_cast<size_t>(samples_decoded); 924 temp_mix_offset += samples_decoded;
947 samples_read += samples_decoded; 925 samples_read += samples_decoded;
948 dsp_state.offset += samples_decoded; 926 dsp_state.offset += samples_decoded;
949 dsp_state.played_sample_count += samples_decoded; 927 dsp_state.played_sample_count += samples_decoded;
@@ -966,12 +944,10 @@ void CommandGenerator::DecodeFromWaveBuffers(ServerVoiceInfo& voice_info, s32* o
966 } else { 944 } else {
967 945
968 // Update our wave buffer states 946 // Update our wave buffer states
969 dsp_state.is_wave_buffer_valid[static_cast<u32>(dsp_state.wave_buffer_index)] = 947 dsp_state.is_wave_buffer_valid[dsp_state.wave_buffer_index] = false;
970 false;
971 dsp_state.wave_buffer_consumed++; 948 dsp_state.wave_buffer_consumed++;
972 dsp_state.wave_buffer_index = 949 dsp_state.wave_buffer_index =
973 static_cast<u32>(dsp_state.wave_buffer_index + 1) % 950 (dsp_state.wave_buffer_index + 1) % AudioCommon::MAX_WAVE_BUFFERS;
974 AudioCommon::MAX_WAVE_BUFFERS;
975 if (wave_buffer.end_of_stream) { 951 if (wave_buffer.end_of_stream) {
976 dsp_state.played_sample_count = 0; 952 dsp_state.played_sample_count = 0;
977 } 953 }
@@ -981,20 +957,16 @@ void CommandGenerator::DecodeFromWaveBuffers(ServerVoiceInfo& voice_info, s32* o
981 957
982 if (in_params.behavior_flags.is_pitch_and_src_skipped.Value()) { 958 if (in_params.behavior_flags.is_pitch_and_src_skipped.Value()) {
983 // No need to resample 959 // No need to resample
984 std::memcpy(output, sample_buffer.data(), 960 std::memcpy(output, sample_buffer.data(), samples_read * sizeof(s32));
985 static_cast<size_t>(samples_read) * sizeof(s32));
986 } else { 961 } else {
987 { 962 std::fill(sample_buffer.begin() + temp_mix_offset,
988 const auto begin = sample_buffer.begin() + static_cast<ptrdiff_t>(temp_mix_offset); 963 sample_buffer.begin() + temp_mix_offset + (samples_to_read - samples_read),
989 const auto end = begin + (samples_to_read - samples_read); 964 0);
990 std::fill(begin, end, 0);
991 }
992 AudioCore::Resample(output, sample_buffer.data(), resample_rate, dsp_state.fraction, 965 AudioCore::Resample(output, sample_buffer.data(), resample_rate, dsp_state.fraction,
993 static_cast<size_t>(samples_to_output)); 966 samples_to_output);
994 // Resample 967 // Resample
995 for (std::size_t i = 0; i < AudioCommon::MAX_SAMPLE_HISTORY; i++) { 968 for (std::size_t i = 0; i < AudioCommon::MAX_SAMPLE_HISTORY; i++) {
996 dsp_state.sample_history[i] = 969 dsp_state.sample_history[i] = sample_buffer[samples_to_read + i];
997 sample_buffer[static_cast<size_t>(samples_to_read) + i];
998 } 970 }
999 } 971 }
1000 output += samples_to_output; 972 output += samples_to_output;
diff --git a/src/audio_core/command_generator.h b/src/audio_core/command_generator.h
index 6cba70ae3..53e57748b 100644
--- a/src/audio_core/command_generator.h
+++ b/src/audio_core/command_generator.h
@@ -50,12 +50,12 @@ public:
50private: 50private:
51 void GenerateDataSourceCommand(ServerVoiceInfo& voice_info, VoiceState& dsp_state, s32 channel); 51 void GenerateDataSourceCommand(ServerVoiceInfo& voice_info, VoiceState& dsp_state, s32 channel);
52 void GenerateBiquadFilterCommandForVoice(ServerVoiceInfo& voice_info, VoiceState& dsp_state, 52 void GenerateBiquadFilterCommandForVoice(ServerVoiceInfo& voice_info, VoiceState& dsp_state,
53 u32 mix_buffer_count, s32 channel); 53 s32 mix_buffer_count, s32 channel);
54 void GenerateVolumeRampCommand(float last_volume, float current_volume, s32 channel, 54 void GenerateVolumeRampCommand(float last_volume, float current_volume, s32 channel,
55 s32 node_id); 55 s32 node_id);
56 void GenerateVoiceMixCommand(const MixVolumeBuffer& mix_volumes, 56 void GenerateVoiceMixCommand(const MixVolumeBuffer& mix_volumes,
57 const MixVolumeBuffer& last_mix_volumes, VoiceState& dsp_state, 57 const MixVolumeBuffer& last_mix_volumes, VoiceState& dsp_state,
58 u32 mix_buffer_offset, u32 mix_buffer_count, u32 voice_index, 58 s32 mix_buffer_offset, s32 mix_buffer_count, s32 voice_index,
59 s32 node_id); 59 s32 node_id);
60 void GenerateSubMixCommand(ServerMixInfo& mix_info); 60 void GenerateSubMixCommand(ServerMixInfo& mix_info);
61 void GenerateMixCommands(ServerMixInfo& mix_info); 61 void GenerateMixCommands(ServerMixInfo& mix_info);
diff --git a/src/audio_core/cubeb_sink.cpp b/src/audio_core/cubeb_sink.cpp
index a20b6ad5f..6eaa60815 100644
--- a/src/audio_core/cubeb_sink.cpp
+++ b/src/audio_core/cubeb_sink.cpp
@@ -202,7 +202,7 @@ long CubebSinkStream::DataCallback(cubeb_stream* stream, void* user_data, const
202 } 202 }
203 203
204 const std::size_t num_channels = impl->GetNumChannels(); 204 const std::size_t num_channels = impl->GetNumChannels();
205 const std::size_t samples_to_write = num_channels * static_cast<u64>(num_frames); 205 const std::size_t samples_to_write = num_channels * num_frames;
206 std::size_t samples_written; 206 std::size_t samples_written;
207 207
208 /* 208 /*
diff --git a/src/audio_core/cubeb_sink.h b/src/audio_core/cubeb_sink.h
index c50d0b7bd..7ce850f47 100644
--- a/src/audio_core/cubeb_sink.h
+++ b/src/audio_core/cubeb_sink.h
@@ -27,7 +27,7 @@ private:
27 std::vector<SinkStreamPtr> sink_streams; 27 std::vector<SinkStreamPtr> sink_streams;
28 28
29#ifdef _WIN32 29#ifdef _WIN32
30 s32 com_init_result = 0; 30 u32 com_init_result = 0;
31#endif 31#endif
32}; 32};
33 33
diff --git a/src/audio_core/info_updater.cpp b/src/audio_core/info_updater.cpp
index f999a8b17..2940e53a9 100644
--- a/src/audio_core/info_updater.cpp
+++ b/src/audio_core/info_updater.cpp
@@ -350,7 +350,7 @@ ResultCode InfoUpdater::UpdateMixes(MixContext& mix_context, std::size_t mix_buf
350 std::size_t total_buffer_count{}; 350 std::size_t total_buffer_count{};
351 for (std::size_t i = 0; i < mix_count; i++) { 351 for (std::size_t i = 0; i < mix_count; i++) {
352 const auto& in = mix_in_params[i]; 352 const auto& in = mix_in_params[i];
353 total_buffer_count += static_cast<size_t>(in.buffer_count); 353 total_buffer_count += in.buffer_count;
354 if (static_cast<std::size_t>(in.dest_mix_id) > mix_count && 354 if (static_cast<std::size_t>(in.dest_mix_id) > mix_count &&
355 in.dest_mix_id != AudioCommon::NO_MIX && in.mix_id != AudioCommon::FINAL_MIX) { 355 in.dest_mix_id != AudioCommon::NO_MIX && in.mix_id != AudioCommon::FINAL_MIX) {
356 LOG_ERROR( 356 LOG_ERROR(
@@ -379,7 +379,7 @@ ResultCode InfoUpdater::UpdateMixes(MixContext& mix_context, std::size_t mix_buf
379 const auto& mix_in = mix_in_params[i]; 379 const auto& mix_in = mix_in_params[i];
380 std::size_t target_mix{}; 380 std::size_t target_mix{};
381 if (behavior_info.IsMixInParameterDirtyOnlyUpdateSupported()) { 381 if (behavior_info.IsMixInParameterDirtyOnlyUpdateSupported()) {
382 target_mix = static_cast<size_t>(mix_in.mix_id); 382 target_mix = mix_in.mix_id;
383 } else { 383 } else {
384 // Non dirty supported games just use i instead of the actual mix_id 384 // Non dirty supported games just use i instead of the actual mix_id
385 target_mix = i; 385 target_mix = i;
diff --git a/src/audio_core/mix_context.cpp b/src/audio_core/mix_context.cpp
index c28bee453..4bca72eb0 100644
--- a/src/audio_core/mix_context.cpp
+++ b/src/audio_core/mix_context.cpp
@@ -62,7 +62,7 @@ void MixContext::UpdateDistancesFromFinalMix() {
62 distance_to_final_mix = AudioCommon::NO_FINAL_MIX; 62 distance_to_final_mix = AudioCommon::NO_FINAL_MIX;
63 break; 63 break;
64 } else { 64 } else {
65 const auto& dest_mix = GetInfo(static_cast<u32>(mix_id)); 65 const auto& dest_mix = GetInfo(mix_id);
66 const auto dest_mix_distance = dest_mix.GetInParams().final_mix_distance; 66 const auto dest_mix_distance = dest_mix.GetInParams().final_mix_distance;
67 67
68 if (dest_mix_distance == AudioCommon::NO_FINAL_MIX) { 68 if (dest_mix_distance == AudioCommon::NO_FINAL_MIX) {
@@ -129,7 +129,7 @@ bool MixContext::TsortInfo(SplitterContext& splitter_context) {
129 std::size_t info_id{}; 129 std::size_t info_id{};
130 for (auto itr = sorted_list.rbegin(); itr != sorted_list.rend(); ++itr) { 130 for (auto itr = sorted_list.rbegin(); itr != sorted_list.rend(); ++itr) {
131 // Set our sorted info 131 // Set our sorted info
132 sorted_info[info_id++] = &GetInfo(static_cast<u32>(*itr)); 132 sorted_info[info_id++] = &GetInfo(*itr);
133 } 133 }
134 134
135 // Calculate the mix buffer offset 135 // Calculate the mix buffer offset
@@ -218,8 +218,7 @@ bool ServerMixInfo::Update(EdgeMatrix& edge_matrix, const MixInfo::InParams& mix
218 for (std::size_t i = 0; i < effect_count; i++) { 218 for (std::size_t i = 0; i < effect_count; i++) {
219 auto* effect_info = effect_context.GetInfo(i); 219 auto* effect_info = effect_context.GetInfo(i);
220 if (effect_info->GetMixID() == in_params.mix_id) { 220 if (effect_info->GetMixID() == in_params.mix_id) {
221 const auto processing_order = static_cast<u32>(effect_info->GetProcessingOrder()); 221 effect_processing_order[effect_info->GetProcessingOrder()] = static_cast<s32>(i);
222 effect_processing_order[processing_order] = static_cast<s32>(i);
223 } 222 }
224 } 223 }
225 224
@@ -266,7 +265,7 @@ bool ServerMixInfo::UpdateConnection(EdgeMatrix& edge_matrix, const MixInfo::InP
266 if (in_params.dest_mix_id == mix_in.dest_mix_id && 265 if (in_params.dest_mix_id == mix_in.dest_mix_id &&
267 in_params.splitter_id == mix_in.splitter_id && 266 in_params.splitter_id == mix_in.splitter_id &&
268 ((in_params.splitter_id == AudioCommon::NO_SPLITTER) || 267 ((in_params.splitter_id == AudioCommon::NO_SPLITTER) ||
269 !splitter_context.GetInfo(static_cast<u32>(in_params.splitter_id)).HasNewConnection())) { 268 !splitter_context.GetInfo(in_params.splitter_id).HasNewConnection())) {
270 return false; 269 return false;
271 } 270 }
272 // Remove current edges for mix id 271 // Remove current edges for mix id
@@ -276,11 +275,11 @@ bool ServerMixInfo::UpdateConnection(EdgeMatrix& edge_matrix, const MixInfo::InP
276 edge_matrix.Connect(in_params.mix_id, mix_in.dest_mix_id); 275 edge_matrix.Connect(in_params.mix_id, mix_in.dest_mix_id);
277 } else if (mix_in.splitter_id != AudioCommon::NO_SPLITTER) { 276 } else if (mix_in.splitter_id != AudioCommon::NO_SPLITTER) {
278 // Recurse our splitter linked and set our edges 277 // Recurse our splitter linked and set our edges
279 auto& splitter_info = splitter_context.GetInfo(static_cast<u32>(mix_in.splitter_id)); 278 auto& splitter_info = splitter_context.GetInfo(mix_in.splitter_id);
280 const auto length = static_cast<size_t>(splitter_info.GetLength()); 279 const auto length = splitter_info.GetLength();
281 for (size_t i = 0; i < length; i++) { 280 for (s32 i = 0; i < length; i++) {
282 const auto* splitter_destination = 281 const auto* splitter_destination =
283 splitter_context.GetDestinationData(static_cast<u32>(mix_in.splitter_id), i); 282 splitter_context.GetDestinationData(mix_in.splitter_id, i);
284 if (splitter_destination == nullptr) { 283 if (splitter_destination == nullptr) {
285 continue; 284 continue;
286 } 285 }
diff --git a/src/audio_core/sink_context.cpp b/src/audio_core/sink_context.cpp
index 3d713814a..0882b411a 100644
--- a/src/audio_core/sink_context.cpp
+++ b/src/audio_core/sink_context.cpp
@@ -23,9 +23,8 @@ bool SinkContext::InUse() const {
23} 23}
24 24
25std::vector<u8> SinkContext::OutputBuffers() const { 25std::vector<u8> SinkContext::OutputBuffers() const {
26 const auto output_use_count = static_cast<size_t>(use_count); 26 std::vector<u8> buffer_ret(use_count);
27 std::vector<u8> buffer_ret(output_use_count); 27 std::memcpy(buffer_ret.data(), buffers.data(), use_count);
28 std::memcpy(buffer_ret.data(), buffers.data(), output_use_count);
29 return buffer_ret; 28 return buffer_ret;
30} 29}
31 30
diff --git a/src/audio_core/splitter_context.cpp b/src/audio_core/splitter_context.cpp
index f3e870648..f21b53147 100644
--- a/src/audio_core/splitter_context.cpp
+++ b/src/audio_core/splitter_context.cpp
@@ -109,7 +109,7 @@ std::size_t ServerSplitterInfo::Update(SplitterInfo::InInfoPrams& header) {
109 new_connection = true; 109 new_connection = true;
110 // We need to update the size here due to the splitter bug being present and providing an 110 // We need to update the size here due to the splitter bug being present and providing an
111 // incorrect size. We're suppose to also update the header here but we just ignore and continue 111 // incorrect size. We're suppose to also update the header here but we just ignore and continue
112 return (sizeof(s32_le) * static_cast<size_t>(header.length - 1)) + (sizeof(s32_le) * 3); 112 return (sizeof(s32_le) * (header.length - 1)) + (sizeof(s32_le) * 3);
113} 113}
114 114
115ServerSplitterDestinationData* ServerSplitterInfo::GetHead() { 115ServerSplitterDestinationData* ServerSplitterInfo::GetHead() {
@@ -306,14 +306,13 @@ bool SplitterContext::UpdateInfo(const std::vector<u8>& input, std::size_t& inpu
306 break; 306 break;
307 } 307 }
308 308
309 const auto send_id = static_cast<std::size_t>(header.send_id); 309 if (header.send_id < 0 || static_cast<std::size_t>(header.send_id) > info_count) {
310 if (header.send_id < 0 || send_id > info_count) {
311 LOG_ERROR(Audio, "Bad splitter data id"); 310 LOG_ERROR(Audio, "Bad splitter data id");
312 break; 311 break;
313 } 312 }
314 313
315 UpdateOffsets(sizeof(SplitterInfo::InInfoPrams)); 314 UpdateOffsets(sizeof(SplitterInfo::InInfoPrams));
316 auto& info = GetInfo(send_id); 315 auto& info = GetInfo(header.send_id);
317 if (!RecomposeDestination(info, header, input, input_offset)) { 316 if (!RecomposeDestination(info, header, input, input_offset)) {
318 LOG_ERROR(Audio, "Failed to recompose destination for splitter!"); 317 LOG_ERROR(Audio, "Failed to recompose destination for splitter!");
319 return false; 318 return false;
@@ -349,12 +348,11 @@ bool SplitterContext::UpdateData(const std::vector<u8>& input, std::size_t& inpu
349 break; 348 break;
350 } 349 }
351 350
352 const auto splitter_id = static_cast<std::size_t>(header.splitter_id); 351 if (header.splitter_id < 0 || static_cast<std::size_t>(header.splitter_id) > data_count) {
353 if (header.splitter_id < 0 || splitter_id > data_count) {
354 LOG_ERROR(Audio, "Bad splitter data id"); 352 LOG_ERROR(Audio, "Bad splitter data id");
355 break; 353 break;
356 } 354 }
357 GetData(splitter_id).Update(header); 355 GetData(header.splitter_id).Update(header);
358 } 356 }
359 return true; 357 return true;
360} 358}
@@ -388,9 +386,9 @@ bool SplitterContext::RecomposeDestination(ServerSplitterInfo& info,
388 return true; 386 return true;
389 } 387 }
390 388
391 auto* start_head = &GetData(static_cast<u32>(header.resource_id_base)); 389 auto* start_head = &GetData(header.resource_id_base);
392 current_head = start_head; 390 current_head = start_head;
393 std::vector<s32_le> resource_ids(static_cast<size_t>(size - 1)); 391 std::vector<s32_le> resource_ids(size - 1);
394 if (!AudioCommon::CanConsumeBuffer(input.size(), input_offset, 392 if (!AudioCommon::CanConsumeBuffer(input.size(), input_offset,
395 resource_ids.size() * sizeof(s32_le))) { 393 resource_ids.size() * sizeof(s32_le))) {
396 LOG_ERROR(Audio, "Buffer is an invalid size!"); 394 LOG_ERROR(Audio, "Buffer is an invalid size!");
@@ -399,8 +397,8 @@ bool SplitterContext::RecomposeDestination(ServerSplitterInfo& info,
399 std::memcpy(resource_ids.data(), input.data() + input_offset, 397 std::memcpy(resource_ids.data(), input.data() + input_offset,
400 resource_ids.size() * sizeof(s32_le)); 398 resource_ids.size() * sizeof(s32_le));
401 399
402 for (const auto resource_id : resource_ids) { 400 for (auto resource_id : resource_ids) {
403 auto* head = &GetData(static_cast<u32>(resource_id)); 401 auto* head = &GetData(resource_id);
404 current_head->SetNextDestination(head); 402 current_head->SetNextDestination(head);
405 current_head = head; 403 current_head = head;
406 } 404 }
@@ -446,7 +444,7 @@ bool NodeStates::DepthFirstSearch(EdgeMatrix& edge_matrix) {
446 const auto node_id = static_cast<s32>(i); 444 const auto node_id = static_cast<s32>(i);
447 445
448 // If we don't have a state, send to our index stack for work 446 // If we don't have a state, send to our index stack for work
449 if (GetState(i) == State::NoState) { 447 if (GetState(i) == NodeStates::State::NoState) {
450 index_stack.push(node_id); 448 index_stack.push(node_id);
451 } 449 }
452 450
@@ -455,19 +453,19 @@ bool NodeStates::DepthFirstSearch(EdgeMatrix& edge_matrix) {
455 // Get the current node 453 // Get the current node
456 const auto current_stack_index = index_stack.top(); 454 const auto current_stack_index = index_stack.top();
457 // Check if we've seen the node yet 455 // Check if we've seen the node yet
458 const auto index_state = GetState(static_cast<u32>(current_stack_index)); 456 const auto index_state = GetState(current_stack_index);
459 if (index_state == State::NoState) { 457 if (index_state == NodeStates::State::NoState) {
460 // Mark the node as seen 458 // Mark the node as seen
461 UpdateState(State::InFound, static_cast<u32>(current_stack_index)); 459 UpdateState(NodeStates::State::InFound, current_stack_index);
462 } else if (index_state == State::InFound) { 460 } else if (index_state == NodeStates::State::InFound) {
463 // We've seen this node before, mark it as completed 461 // We've seen this node before, mark it as completed
464 UpdateState(State::InCompleted, static_cast<u32>(current_stack_index)); 462 UpdateState(NodeStates::State::InCompleted, current_stack_index);
465 // Update our index list 463 // Update our index list
466 PushTsortResult(current_stack_index); 464 PushTsortResult(current_stack_index);
467 // Pop the stack 465 // Pop the stack
468 index_stack.pop(); 466 index_stack.pop();
469 continue; 467 continue;
470 } else if (index_state == State::InCompleted) { 468 } else if (index_state == NodeStates::State::InCompleted) {
471 // If our node is already sorted, clear it 469 // If our node is already sorted, clear it
472 index_stack.pop(); 470 index_stack.pop();
473 continue; 471 continue;
@@ -481,11 +479,11 @@ bool NodeStates::DepthFirstSearch(EdgeMatrix& edge_matrix) {
481 } 479 }
482 480
483 // Check if our node exists 481 // Check if our node exists
484 const auto node_state = GetState(static_cast<u32>(j)); 482 const auto node_state = GetState(j);
485 if (node_state == State::NoState) { 483 if (node_state == NodeStates::State::NoState) {
486 // Add more work 484 // Add more work
487 index_stack.push(j); 485 index_stack.push(j);
488 } else if (node_state == State::InFound) { 486 } else if (node_state == NodeStates::State::InFound) {
489 UNREACHABLE_MSG("Node start marked as found"); 487 UNREACHABLE_MSG("Node start marked as found");
490 ResetState(); 488 ResetState();
491 return false; 489 return false;
@@ -509,17 +507,17 @@ void NodeStates::ResetState() {
509 } 507 }
510} 508}
511 509
512void NodeStates::UpdateState(State state, std::size_t i) { 510void NodeStates::UpdateState(NodeStates::State state, std::size_t i) {
513 switch (state) { 511 switch (state) {
514 case State::NoState: 512 case NodeStates::State::NoState:
515 was_node_found[i] = false; 513 was_node_found[i] = false;
516 was_node_completed[i] = false; 514 was_node_completed[i] = false;
517 break; 515 break;
518 case State::InFound: 516 case NodeStates::State::InFound:
519 was_node_found[i] = true; 517 was_node_found[i] = true;
520 was_node_completed[i] = false; 518 was_node_completed[i] = false;
521 break; 519 break;
522 case State::InCompleted: 520 case NodeStates::State::InCompleted:
523 was_node_found[i] = false; 521 was_node_found[i] = false;
524 was_node_completed[i] = true; 522 was_node_completed[i] = true;
525 break; 523 break;
@@ -530,13 +528,13 @@ NodeStates::State NodeStates::GetState(std::size_t i) {
530 ASSERT(i < node_count); 528 ASSERT(i < node_count);
531 if (was_node_found[i]) { 529 if (was_node_found[i]) {
532 // If our node exists in our found list 530 // If our node exists in our found list
533 return State::InFound; 531 return NodeStates::State::InFound;
534 } else if (was_node_completed[i]) { 532 } else if (was_node_completed[i]) {
535 // If node is in the completed list 533 // If node is in the completed list
536 return State::InCompleted; 534 return NodeStates::State::InCompleted;
537 } else { 535 } else {
538 // If in neither 536 // If in neither
539 return State::NoState; 537 return NodeStates::State::NoState;
540 } 538 }
541} 539}
542 540
@@ -603,16 +601,16 @@ std::size_t EdgeMatrix::GetNodeCount() const {
603 601
604void EdgeMatrix::SetState(s32 a, s32 b, bool state) { 602void EdgeMatrix::SetState(s32 a, s32 b, bool state) {
605 ASSERT(InRange(a, b)); 603 ASSERT(InRange(a, b));
606 edge_matrix.at(static_cast<u32>(a) * node_count + static_cast<u32>(b)) = state; 604 edge_matrix.at(a * node_count + b) = state;
607} 605}
608 606
609bool EdgeMatrix::GetState(s32 a, s32 b) { 607bool EdgeMatrix::GetState(s32 a, s32 b) {
610 ASSERT(InRange(a, b)); 608 ASSERT(InRange(a, b));
611 return edge_matrix.at(static_cast<u32>(a) * node_count + static_cast<u32>(b)); 609 return edge_matrix.at(a * node_count + b);
612} 610}
613 611
614bool EdgeMatrix::InRange(s32 a, s32 b) const { 612bool EdgeMatrix::InRange(s32 a, s32 b) const {
615 const std::size_t pos = static_cast<u32>(a) * node_count + static_cast<u32>(b); 613 const std::size_t pos = a * node_count + b;
616 return pos < (node_count * node_count); 614 return pos < (node_count * node_count);
617} 615}
618 616
diff --git a/src/audio_core/time_stretch.h b/src/audio_core/time_stretch.h
index 3808e554d..bb2270b96 100644
--- a/src/audio_core/time_stretch.h
+++ b/src/audio_core/time_stretch.h
@@ -5,16 +5,8 @@
5#pragma once 5#pragma once
6 6
7#include <cstddef> 7#include <cstddef>
8#include "common/common_types.h"
9
10#if defined(__GNUC__)
11#pragma GCC diagnostic push
12#pragma GCC diagnostic ignored "-Wsign-conversion"
13#endif
14#include <SoundTouch.h> 8#include <SoundTouch.h>
15#if defined(__GNUC__) 9#include "common/common_types.h"
16#pragma GCC diagnostic pop
17#endif
18 10
19namespace AudioCore { 11namespace AudioCore {
20 12
diff --git a/src/audio_core/voice_context.cpp b/src/audio_core/voice_context.cpp
index 276b96ca4..c46ee55f1 100644
--- a/src/audio_core/voice_context.cpp
+++ b/src/audio_core/voice_context.cpp
@@ -98,7 +98,7 @@ void ServerVoiceInfo::UpdateParameters(const VoiceInfo::InParams& voice_in,
98 BehaviorInfo& behavior_info) { 98 BehaviorInfo& behavior_info) {
99 in_params.in_use = voice_in.is_in_use; 99 in_params.in_use = voice_in.is_in_use;
100 in_params.id = voice_in.id; 100 in_params.id = voice_in.id;
101 in_params.node_id = static_cast<s32>(voice_in.node_id); 101 in_params.node_id = voice_in.node_id;
102 in_params.last_playstate = in_params.current_playstate; 102 in_params.last_playstate = in_params.current_playstate;
103 switch (voice_in.play_state) { 103 switch (voice_in.play_state) {
104 case PlayState::Paused: 104 case PlayState::Paused:
@@ -220,10 +220,8 @@ void ServerVoiceInfo::UpdateWaveBuffer(ServerWaveBuffer& out_wavebuffer,
220 if (sample_format == SampleFormat::Pcm16) { 220 if (sample_format == SampleFormat::Pcm16) {
221 const auto buffer_size = in_wave_buffer.buffer_size; 221 const auto buffer_size = in_wave_buffer.buffer_size;
222 if (in_wave_buffer.start_sample_offset < 0 || in_wave_buffer.end_sample_offset < 0 || 222 if (in_wave_buffer.start_sample_offset < 0 || in_wave_buffer.end_sample_offset < 0 ||
223 (buffer_size < 223 (buffer_size < (sizeof(s16) * in_wave_buffer.start_sample_offset)) ||
224 (sizeof(s16) * static_cast<u32>(in_wave_buffer.start_sample_offset))) || 224 (buffer_size < (sizeof(s16) * in_wave_buffer.end_sample_offset))) {
225 (buffer_size <
226 (sizeof(s16) * static_cast<u32>(in_wave_buffer.end_sample_offset)))) {
227 // TODO(ogniK): Write error info 225 // TODO(ogniK): Write error info
228 return; 226 return;
229 } 227 }
@@ -256,8 +254,8 @@ void ServerVoiceInfo::WriteOutStatus(
256 voice_out.played_sample_count = 0; 254 voice_out.played_sample_count = 0;
257 voice_out.voice_dropped = false; 255 voice_out.voice_dropped = false;
258 } else if (!in_params.is_new) { 256 } else if (!in_params.is_new) {
259 voice_out.wave_buffer_consumed = static_cast<u32>(voice_states[0]->wave_buffer_consumed); 257 voice_out.wave_buffer_consumed = voice_states[0]->wave_buffer_consumed;
260 voice_out.played_sample_count = static_cast<u64>(voice_states[0]->played_sample_count); 258 voice_out.played_sample_count = voice_states[0]->played_sample_count;
261 voice_out.voice_dropped = in_params.voice_drop_flag; 259 voice_out.voice_dropped = in_params.voice_drop_flag;
262 } else { 260 } else {
263 voice_out.wave_buffer_consumed = 0; 261 voice_out.wave_buffer_consumed = 0;
@@ -295,8 +293,8 @@ bool ServerVoiceInfo::UpdateForCommandGeneration(VoiceContext& voice_context) {
295 in_params.is_new = false; 293 in_params.is_new = false;
296 } 294 }
297 295
298 const auto channel_count = static_cast<size_t>(in_params.channel_count); 296 const s32 channel_count = in_params.channel_count;
299 for (size_t i = 0; i < channel_count; i++) { 297 for (s32 i = 0; i < channel_count; i++) {
300 const auto channel_resource = in_params.voice_channel_resource_id[i]; 298 const auto channel_resource = in_params.voice_channel_resource_id[i];
301 dsp_voice_states[i] = 299 dsp_voice_states[i] =
302 &voice_context.GetDspSharedState(static_cast<std::size_t>(channel_resource)); 300 &voice_context.GetDspSharedState(static_cast<std::size_t>(channel_resource));
@@ -305,9 +303,8 @@ bool ServerVoiceInfo::UpdateForCommandGeneration(VoiceContext& voice_context) {
305} 303}
306 304
307void ServerVoiceInfo::ResetResources(VoiceContext& voice_context) { 305void ServerVoiceInfo::ResetResources(VoiceContext& voice_context) {
308 const auto channel_count = static_cast<size_t>(in_params.channel_count); 306 const s32 channel_count = in_params.channel_count;
309 307 for (s32 i = 0; i < channel_count; i++) {
310 for (size_t i = 0; i < channel_count; i++) {
311 const auto channel_resource = in_params.voice_channel_resource_id[i]; 308 const auto channel_resource = in_params.voice_channel_resource_id[i];
312 auto& dsp_state = 309 auto& dsp_state =
313 voice_context.GetDspSharedState(static_cast<std::size_t>(channel_resource)); 310 voice_context.GetDspSharedState(static_cast<std::size_t>(channel_resource));
@@ -328,9 +325,9 @@ bool ServerVoiceInfo::UpdateParametersForCommandGeneration(
328 325
329 switch (in_params.current_playstate) { 326 switch (in_params.current_playstate) {
330 case ServerPlayState::Play: { 327 case ServerPlayState::Play: {
331 for (size_t i = 0; i < AudioCommon::MAX_WAVE_BUFFERS; i++) { 328 for (std::size_t i = 0; i < AudioCommon::MAX_WAVE_BUFFERS; i++) {
332 if (!in_params.wave_buffer[i].sent_to_dsp) { 329 if (!in_params.wave_buffer[i].sent_to_dsp) {
333 for (size_t channel = 0; channel < static_cast<size_t>(channel_count); channel++) { 330 for (s32 channel = 0; channel < channel_count; channel++) {
334 dsp_voice_states[channel]->is_wave_buffer_valid[i] = true; 331 dsp_voice_states[channel]->is_wave_buffer_valid[i] = true;
335 } 332 }
336 in_params.wave_buffer[i].sent_to_dsp = true; 333 in_params.wave_buffer[i].sent_to_dsp = true;
@@ -347,13 +344,12 @@ bool ServerVoiceInfo::UpdateParametersForCommandGeneration(
347 case ServerPlayState::RequestStop: { 344 case ServerPlayState::RequestStop: {
348 for (std::size_t i = 0; i < AudioCommon::MAX_WAVE_BUFFERS; i++) { 345 for (std::size_t i = 0; i < AudioCommon::MAX_WAVE_BUFFERS; i++) {
349 in_params.wave_buffer[i].sent_to_dsp = true; 346 in_params.wave_buffer[i].sent_to_dsp = true;
350 for (std::size_t channel = 0; channel < static_cast<size_t>(channel_count); channel++) { 347 for (s32 channel = 0; channel < channel_count; channel++) {
351 auto* dsp_state = dsp_voice_states[channel]; 348 auto* dsp_state = dsp_voice_states[channel];
352 349
353 if (dsp_state->is_wave_buffer_valid[i]) { 350 if (dsp_state->is_wave_buffer_valid[i]) {
354 dsp_state->wave_buffer_index = 351 dsp_state->wave_buffer_index =
355 static_cast<s32>(static_cast<u32>(dsp_state->wave_buffer_index + 1) % 352 (dsp_state->wave_buffer_index + 1) % AudioCommon::MAX_WAVE_BUFFERS;
356 AudioCommon::MAX_WAVE_BUFFERS);
357 dsp_state->wave_buffer_consumed++; 353 dsp_state->wave_buffer_consumed++;
358 } 354 }
359 355
@@ -361,7 +357,7 @@ bool ServerVoiceInfo::UpdateParametersForCommandGeneration(
361 } 357 }
362 } 358 }
363 359
364 for (size_t channel = 0; channel < static_cast<size_t>(channel_count); channel++) { 360 for (s32 channel = 0; channel < channel_count; channel++) {
365 auto* dsp_state = dsp_voice_states[channel]; 361 auto* dsp_state = dsp_voice_states[channel];
366 dsp_state->offset = 0; 362 dsp_state->offset = 0;
367 dsp_state->played_sample_count = 0; 363 dsp_state->played_sample_count = 0;
@@ -387,16 +383,15 @@ void ServerVoiceInfo::FlushWaveBuffers(
387 auto wave_head = in_params.wave_bufffer_head; 383 auto wave_head = in_params.wave_bufffer_head;
388 384
389 for (u8 i = 0; i < flush_count; i++) { 385 for (u8 i = 0; i < flush_count; i++) {
390 in_params.wave_buffer[static_cast<u16>(wave_head)].sent_to_dsp = true; 386 in_params.wave_buffer[wave_head].sent_to_dsp = true;
391 for (size_t channel = 0; channel < static_cast<size_t>(channel_count); channel++) { 387 for (s32 channel = 0; channel < channel_count; channel++) {
392 auto* dsp_state = dsp_voice_states[channel]; 388 auto* dsp_state = dsp_voice_states[channel];
393 dsp_state->wave_buffer_consumed++; 389 dsp_state->wave_buffer_consumed++;
394 dsp_state->is_wave_buffer_valid[static_cast<u16>(wave_head)] = false; 390 dsp_state->is_wave_buffer_valid[wave_head] = false;
395 dsp_state->wave_buffer_index = static_cast<s32>( 391 dsp_state->wave_buffer_index =
396 static_cast<u32>(dsp_state->wave_buffer_index + 1) % AudioCommon::MAX_WAVE_BUFFERS); 392 (dsp_state->wave_buffer_index + 1) % AudioCommon::MAX_WAVE_BUFFERS;
397 } 393 }
398 wave_head = 394 wave_head = (wave_head + 1) % AudioCommon::MAX_WAVE_BUFFERS;
399 static_cast<s16>(static_cast<u32>(wave_head + 1) % AudioCommon::MAX_WAVE_BUFFERS);
400 } 395 }
401} 396}
402 397
@@ -488,7 +483,7 @@ s32 VoiceContext::DecodePcm16(s32* output_buffer, ServerWaveBuffer* wave_buffer,
488 const auto samples_remaining = 483 const auto samples_remaining =
489 (wave_buffer->end_sample_offset - wave_buffer->start_sample_offset) - buffer_offset; 484 (wave_buffer->end_sample_offset - wave_buffer->start_sample_offset) - buffer_offset;
490 const auto start_offset = (wave_buffer->start_sample_offset + buffer_offset) * channel_count; 485 const auto start_offset = (wave_buffer->start_sample_offset + buffer_offset) * channel_count;
491 const auto buffer_pos = wave_buffer->buffer_address + static_cast<VAddr>(start_offset); 486 const auto buffer_pos = wave_buffer->buffer_address + start_offset;
492 487
493 s16* buffer_data = reinterpret_cast<s16*>(memory.GetPointer(buffer_pos)); 488 s16* buffer_data = reinterpret_cast<s16*>(memory.GetPointer(buffer_pos));
494 489
diff --git a/src/common/fiber.h b/src/common/fiber.h
index bc1db1582..89dde5e36 100644
--- a/src/common/fiber.h
+++ b/src/common/fiber.h
@@ -41,8 +41,8 @@ public:
41 Fiber(const Fiber&) = delete; 41 Fiber(const Fiber&) = delete;
42 Fiber& operator=(const Fiber&) = delete; 42 Fiber& operator=(const Fiber&) = delete;
43 43
44 Fiber(Fiber&&) = delete; 44 Fiber(Fiber&&) = default;
45 Fiber& operator=(Fiber&&) = delete; 45 Fiber& operator=(Fiber&&) = default;
46 46
47 /// Yields control from Fiber 'from' to Fiber 'to' 47 /// Yields control from Fiber 'from' to Fiber 'to'
48 /// Fiber 'from' must be the currently running fiber. 48 /// Fiber 'from' must be the currently running fiber.
diff --git a/src/common/file_util.h b/src/common/file_util.h
index 508b7a10a..8b587320f 100644
--- a/src/common/file_util.h
+++ b/src/common/file_util.h
@@ -189,8 +189,7 @@ template <typename T>
189 return {}; 189 return {};
190 } 190 }
191 last = std::min<std::size_t>(last, vector.size()); 191 last = std::min<std::size_t>(last, vector.size());
192 return std::vector<T>(vector.begin() + static_cast<std::ptrdiff_t>(first), 192 return std::vector<T>(vector.begin() + first, vector.begin() + first + last);
193 vector.begin() + static_cast<std::ptrdiff_t>(first + last));
194} 193}
195 194
196enum class DirectorySeparator { 195enum class DirectorySeparator {
diff --git a/src/common/math_util.h b/src/common/math_util.h
index 4c38d8040..7cec80d57 100644
--- a/src/common/math_util.h
+++ b/src/common/math_util.h
@@ -27,7 +27,7 @@ struct Rectangle {
27 if constexpr (std::is_floating_point_v<T>) { 27 if constexpr (std::is_floating_point_v<T>) {
28 return std::abs(right - left); 28 return std::abs(right - left);
29 } else { 29 } else {
30 return static_cast<T>(std::abs(static_cast<std::make_signed_t<T>>(right - left))); 30 return std::abs(static_cast<std::make_signed_t<T>>(right - left));
31 } 31 }
32 } 32 }
33 33
@@ -35,7 +35,7 @@ struct Rectangle {
35 if constexpr (std::is_floating_point_v<T>) { 35 if constexpr (std::is_floating_point_v<T>) {
36 return std::abs(bottom - top); 36 return std::abs(bottom - top);
37 } else { 37 } else {
38 return static_cast<T>(std::abs(static_cast<std::make_signed_t<T>>(bottom - top))); 38 return std::abs(static_cast<std::make_signed_t<T>>(bottom - top));
39 } 39 }
40 } 40 }
41 41
diff --git a/src/common/multi_level_queue.h b/src/common/multi_level_queue.h
index 71613f18b..4b305bf40 100644
--- a/src/common/multi_level_queue.h
+++ b/src/common/multi_level_queue.h
@@ -320,7 +320,7 @@ private:
320 } 320 }
321 321
322 const auto begin_range = list.begin(); 322 const auto begin_range = list.begin();
323 const auto end_range = std::next(begin_range, static_cast<std::ptrdiff_t>(shift)); 323 const auto end_range = std::next(begin_range, shift);
324 list.splice(list.end(), list, begin_range, end_range); 324 list.splice(list.end(), list, begin_range, end_range);
325 } 325 }
326 326
diff --git a/src/common/spin_lock.h b/src/common/spin_lock.h
index 06ac2f5bb..4f946a258 100644
--- a/src/common/spin_lock.h
+++ b/src/common/spin_lock.h
@@ -15,14 +15,6 @@ namespace Common {
15 */ 15 */
16class SpinLock { 16class SpinLock {
17public: 17public:
18 SpinLock() = default;
19
20 SpinLock(const SpinLock&) = delete;
21 SpinLock& operator=(const SpinLock&) = delete;
22
23 SpinLock(SpinLock&&) = delete;
24 SpinLock& operator=(SpinLock&&) = delete;
25
26 void lock(); 18 void lock();
27 void unlock(); 19 void unlock();
28 [[nodiscard]] bool try_lock(); 20 [[nodiscard]] bool try_lock();
diff --git a/src/common/swap.h b/src/common/swap.h
index 8c68c1f26..7665942a2 100644
--- a/src/common/swap.h
+++ b/src/common/swap.h
@@ -504,35 +504,35 @@ bool operator==(const S& p, const swap_struct_t<T, F> v) {
504template <typename T> 504template <typename T>
505struct swap_64_t { 505struct swap_64_t {
506 static T swap(T x) { 506 static T swap(T x) {
507 return static_cast<T>(Common::swap64(static_cast<u64>(x))); 507 return static_cast<T>(Common::swap64(x));
508 } 508 }
509}; 509};
510 510
511template <typename T> 511template <typename T>
512struct swap_32_t { 512struct swap_32_t {
513 static T swap(T x) { 513 static T swap(T x) {
514 return static_cast<T>(Common::swap32(static_cast<u32>(x))); 514 return static_cast<T>(Common::swap32(x));
515 } 515 }
516}; 516};
517 517
518template <typename T> 518template <typename T>
519struct swap_16_t { 519struct swap_16_t {
520 static T swap(T x) { 520 static T swap(T x) {
521 return static_cast<T>(Common::swap16(static_cast<u16>(x))); 521 return static_cast<T>(Common::swap16(x));
522 } 522 }
523}; 523};
524 524
525template <typename T> 525template <typename T>
526struct swap_float_t { 526struct swap_float_t {
527 static T swap(T x) { 527 static T swap(T x) {
528 return static_cast<T>(Common::swapf(static_cast<float>(x))); 528 return static_cast<T>(Common::swapf(x));
529 } 529 }
530}; 530};
531 531
532template <typename T> 532template <typename T>
533struct swap_double_t { 533struct swap_double_t {
534 static T swap(T x) { 534 static T swap(T x) {
535 return static_cast<T>(Common::swapd(static_cast<double>(x))); 535 return static_cast<T>(Common::swapd(x));
536 } 536 }
537}; 537};
538 538
diff --git a/src/common/thread_queue_list.h b/src/common/thread_queue_list.h
index 69c9193da..def9e5d8d 100644
--- a/src/common/thread_queue_list.h
+++ b/src/common/thread_queue_list.h
@@ -33,7 +33,7 @@ struct ThreadQueueList {
33 } 33 }
34 } 34 }
35 35
36 return static_cast<Priority>(-1); 36 return -1;
37 } 37 }
38 38
39 [[nodiscard]] T get_first() const { 39 [[nodiscard]] T get_first() const {
@@ -156,7 +156,7 @@ private:
156 void link(Priority priority) { 156 void link(Priority priority) {
157 Queue* cur = &queues[priority]; 157 Queue* cur = &queues[priority];
158 158
159 for (auto i = static_cast<int>(priority - 1); i >= 0; --i) { 159 for (int i = priority - 1; i >= 0; --i) {
160 if (queues[i].next_nonempty != UnlinkedTag()) { 160 if (queues[i].next_nonempty != UnlinkedTag()) {
161 cur->next_nonempty = queues[i].next_nonempty; 161 cur->next_nonempty = queues[i].next_nonempty;
162 queues[i].next_nonempty = cur; 162 queues[i].next_nonempty = cur;
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 9dc320f53..b6dc25f6b 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -630,9 +630,8 @@ else()
630 -Werror=implicit-fallthrough 630 -Werror=implicit-fallthrough
631 -Werror=reorder 631 -Werror=reorder
632 -Werror=sign-compare 632 -Werror=sign-compare
633 -Werror=sign-conversion 633 -Werror=unused-but-set-parameter
634 $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-parameter> 634 -Werror=unused-but-set-variable
635 $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-variable>
636 -Werror=unused-variable 635 -Werror=unused-variable
637 ) 636 )
638endif() 637endif()
diff --git a/src/core/arm/arm_interface.cpp b/src/core/arm/arm_interface.cpp
index adc6aa5c5..d2295ed90 100644
--- a/src/core/arm/arm_interface.cpp
+++ b/src/core/arm/arm_interface.cpp
@@ -147,18 +147,10 @@ std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktraceFromContex
147 auto fp = ctx.cpu_registers[29]; 147 auto fp = ctx.cpu_registers[29];
148 auto lr = ctx.cpu_registers[30]; 148 auto lr = ctx.cpu_registers[30];
149 while (true) { 149 while (true) {
150 out.push_back({ 150 out.push_back({"", 0, lr, 0});
151 .module = "", 151 if (!fp) {
152 .address = 0,
153 .original_address = lr,
154 .offset = 0,
155 .name = "",
156 });
157
158 if (fp == 0) {
159 break; 152 break;
160 } 153 }
161
162 lr = memory.Read64(fp + 8) - 4; 154 lr = memory.Read64(fp + 8) - 4;
163 fp = memory.Read64(fp); 155 fp = memory.Read64(fp);
164 } 156 }
@@ -211,18 +203,10 @@ std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktrace() const {
211 auto fp = GetReg(29); 203 auto fp = GetReg(29);
212 auto lr = GetReg(30); 204 auto lr = GetReg(30);
213 while (true) { 205 while (true) {
214 out.push_back({ 206 out.push_back({"", 0, lr, 0, ""});
215 .module = "", 207 if (!fp) {
216 .address = 0,
217 .original_address = lr,
218 .offset = 0,
219 .name = "",
220 });
221
222 if (fp == 0) {
223 break; 208 break;
224 } 209 }
225
226 lr = memory.Read64(fp + 8) - 4; 210 lr = memory.Read64(fp + 8) - 4;
227 fp = memory.Read64(fp); 211 fp = memory.Read64(fp);
228 } 212 }
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h
index 9b86247e2..1f24051e4 100644
--- a/src/core/arm/arm_interface.h
+++ b/src/core/arm/arm_interface.h
@@ -93,14 +93,14 @@ public:
93 * @param index Register index 93 * @param index Register index
94 * @return Returns the value in the register 94 * @return Returns the value in the register
95 */ 95 */
96 virtual u64 GetReg(std::size_t index) const = 0; 96 virtual u64 GetReg(int index) const = 0;
97 97
98 /** 98 /**
99 * Set an ARM register 99 * Set an ARM register
100 * @param index Register index 100 * @param index Register index
101 * @param value Value to set register to 101 * @param value Value to set register to
102 */ 102 */
103 virtual void SetReg(std::size_t index, u64 value) = 0; 103 virtual void SetReg(int index, u64 value) = 0;
104 104
105 /** 105 /**
106 * Gets the value of a specified vector register. 106 * Gets the value of a specified vector register.
@@ -108,7 +108,7 @@ public:
108 * @param index The index of the vector register. 108 * @param index The index of the vector register.
109 * @return the value within the vector register. 109 * @return the value within the vector register.
110 */ 110 */
111 virtual u128 GetVectorReg(std::size_t index) const = 0; 111 virtual u128 GetVectorReg(int index) const = 0;
112 112
113 /** 113 /**
114 * Sets a given value into a vector register. 114 * Sets a given value into a vector register.
@@ -116,7 +116,7 @@ public:
116 * @param index The index of the vector register. 116 * @param index The index of the vector register.
117 * @param value The new value to place in the register. 117 * @param value The new value to place in the register.
118 */ 118 */
119 virtual void SetVectorReg(std::size_t index, u128 value) = 0; 119 virtual void SetVectorReg(int index, u128 value) = 0;
120 120
121 /** 121 /**
122 * Get the current PSTATE register 122 * Get the current PSTATE register
diff --git a/src/core/arm/cpu_interrupt_handler.h b/src/core/arm/cpu_interrupt_handler.h
index c20c280f1..71e582f79 100644
--- a/src/core/arm/cpu_interrupt_handler.h
+++ b/src/core/arm/cpu_interrupt_handler.h
@@ -21,8 +21,8 @@ public:
21 CPUInterruptHandler(const CPUInterruptHandler&) = delete; 21 CPUInterruptHandler(const CPUInterruptHandler&) = delete;
22 CPUInterruptHandler& operator=(const CPUInterruptHandler&) = delete; 22 CPUInterruptHandler& operator=(const CPUInterruptHandler&) = delete;
23 23
24 CPUInterruptHandler(CPUInterruptHandler&&) = delete; 24 CPUInterruptHandler(CPUInterruptHandler&&) = default;
25 CPUInterruptHandler& operator=(CPUInterruptHandler&&) = delete; 25 CPUInterruptHandler& operator=(CPUInterruptHandler&&) = default;
26 26
27 bool IsInterrupted() const { 27 bool IsInterrupted() const {
28 return is_interrupted; 28 return is_interrupted;
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
index fab694fc2..b5f28a86e 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
@@ -111,7 +111,7 @@ public:
111 } 111 }
112 return 0U; 112 return 0U;
113 } 113 }
114 return static_cast<u64>(std::max<s64>(parent.system.CoreTiming().GetDowncount(), 0)); 114 return std::max<s64>(parent.system.CoreTiming().GetDowncount(), 0);
115 } 115 }
116 116
117 ARM_Dynarmic_32& parent; 117 ARM_Dynarmic_32& parent;
@@ -210,19 +210,19 @@ u64 ARM_Dynarmic_32::GetPC() const {
210 return jit->Regs()[15]; 210 return jit->Regs()[15];
211} 211}
212 212
213u64 ARM_Dynarmic_32::GetReg(std::size_t index) const { 213u64 ARM_Dynarmic_32::GetReg(int index) const {
214 return jit->Regs()[index]; 214 return jit->Regs()[index];
215} 215}
216 216
217void ARM_Dynarmic_32::SetReg(std::size_t index, u64 value) { 217void ARM_Dynarmic_32::SetReg(int index, u64 value) {
218 jit->Regs()[index] = static_cast<u32>(value); 218 jit->Regs()[index] = static_cast<u32>(value);
219} 219}
220 220
221u128 ARM_Dynarmic_32::GetVectorReg(std::size_t index) const { 221u128 ARM_Dynarmic_32::GetVectorReg(int index) const {
222 return {}; 222 return {};
223} 223}
224 224
225void ARM_Dynarmic_32::SetVectorReg(std::size_t index, u128 value) {} 225void ARM_Dynarmic_32::SetVectorReg(int index, u128 value) {}
226 226
227u32 ARM_Dynarmic_32::GetPSTATE() const { 227u32 ARM_Dynarmic_32::GetPSTATE() const {
228 return jit->Cpsr(); 228 return jit->Cpsr();
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.h b/src/core/arm/dynarmic/arm_dynarmic_32.h
index ba646c623..2bab31b92 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_32.h
+++ b/src/core/arm/dynarmic/arm_dynarmic_32.h
@@ -35,10 +35,10 @@ public:
35 35
36 void SetPC(u64 pc) override; 36 void SetPC(u64 pc) override;
37 u64 GetPC() const override; 37 u64 GetPC() const override;
38 u64 GetReg(std::size_t index) const override; 38 u64 GetReg(int index) const override;
39 void SetReg(std::size_t index, u64 value) override; 39 void SetReg(int index, u64 value) override;
40 u128 GetVectorReg(std::size_t index) const override; 40 u128 GetVectorReg(int index) const override;
41 void SetVectorReg(std::size_t index, u128 value) override; 41 void SetVectorReg(int index, u128 value) override;
42 u32 GetPSTATE() const override; 42 u32 GetPSTATE() const override;
43 void SetPSTATE(u32 pstate) override; 43 void SetPSTATE(u32 pstate) override;
44 void Run() override; 44 void Run() override;
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
index a2c4c2f30..ce9968724 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
@@ -148,7 +148,7 @@ public:
148 } 148 }
149 return 0U; 149 return 0U;
150 } 150 }
151 return static_cast<u64>(std::max<s64>(parent.system.CoreTiming().GetDowncount(), 0)); 151 return std::max<s64>(parent.system.CoreTiming().GetDowncount(), 0);
152 } 152 }
153 153
154 u64 GetCNTPCT() override { 154 u64 GetCNTPCT() override {
@@ -265,19 +265,19 @@ u64 ARM_Dynarmic_64::GetPC() const {
265 return jit->GetPC(); 265 return jit->GetPC();
266} 266}
267 267
268u64 ARM_Dynarmic_64::GetReg(std::size_t index) const { 268u64 ARM_Dynarmic_64::GetReg(int index) const {
269 return jit->GetRegister(index); 269 return jit->GetRegister(index);
270} 270}
271 271
272void ARM_Dynarmic_64::SetReg(std::size_t index, u64 value) { 272void ARM_Dynarmic_64::SetReg(int index, u64 value) {
273 jit->SetRegister(index, value); 273 jit->SetRegister(index, value);
274} 274}
275 275
276u128 ARM_Dynarmic_64::GetVectorReg(std::size_t index) const { 276u128 ARM_Dynarmic_64::GetVectorReg(int index) const {
277 return jit->GetVector(index); 277 return jit->GetVector(index);
278} 278}
279 279
280void ARM_Dynarmic_64::SetVectorReg(std::size_t index, u128 value) { 280void ARM_Dynarmic_64::SetVectorReg(int index, u128 value) {
281 jit->SetVector(index, value); 281 jit->SetVector(index, value);
282} 282}
283 283
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.h b/src/core/arm/dynarmic/arm_dynarmic_64.h
index 2afb7e7a4..403c55961 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.h
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.h
@@ -33,10 +33,10 @@ public:
33 33
34 void SetPC(u64 pc) override; 34 void SetPC(u64 pc) override;
35 u64 GetPC() const override; 35 u64 GetPC() const override;
36 u64 GetReg(std::size_t index) const override; 36 u64 GetReg(int index) const override;
37 void SetReg(std::size_t index, u64 value) override; 37 void SetReg(int index, u64 value) override;
38 u128 GetVectorReg(std::size_t index) const override; 38 u128 GetVectorReg(int index) const override;
39 void SetVectorReg(std::size_t index, u128 value) override; 39 void SetVectorReg(int index, u128 value) override;
40 u32 GetPSTATE() const override; 40 u32 GetPSTATE() const override;
41 void SetPSTATE(u32 pstate) override; 41 void SetPSTATE(u32 pstate) override;
42 void Run() override; 42 void Run() override;
diff --git a/src/core/arm/unicorn/arm_unicorn.cpp b/src/core/arm/unicorn/arm_unicorn.cpp
index c1612d626..1df3f3ed1 100644
--- a/src/core/arm/unicorn/arm_unicorn.cpp
+++ b/src/core/arm/unicorn/arm_unicorn.cpp
@@ -96,35 +96,35 @@ u64 ARM_Unicorn::GetPC() const {
96 return val; 96 return val;
97} 97}
98 98
99u64 ARM_Unicorn::GetReg(std::size_t index) const { 99u64 ARM_Unicorn::GetReg(int regn) const {
100 u64 val{}; 100 u64 val{};
101 auto treg = UC_ARM64_REG_SP; 101 auto treg = UC_ARM64_REG_SP;
102 if (index <= 28) { 102 if (regn <= 28) {
103 treg = static_cast<uc_arm64_reg>(UC_ARM64_REG_X0 + static_cast<int>(index)); 103 treg = (uc_arm64_reg)(UC_ARM64_REG_X0 + regn);
104 } else if (index < 31) { 104 } else if (regn < 31) {
105 treg = static_cast<uc_arm64_reg>(UC_ARM64_REG_X29 + static_cast<int>(index) - 29); 105 treg = (uc_arm64_reg)(UC_ARM64_REG_X29 + regn - 29);
106 } 106 }
107 CHECKED(uc_reg_read(uc, treg, &val)); 107 CHECKED(uc_reg_read(uc, treg, &val));
108 return val; 108 return val;
109} 109}
110 110
111void ARM_Unicorn::SetReg(std::size_t index, u64 value) { 111void ARM_Unicorn::SetReg(int regn, u64 val) {
112 auto treg = UC_ARM64_REG_SP; 112 auto treg = UC_ARM64_REG_SP;
113 if (index <= 28) { 113 if (regn <= 28) {
114 treg = static_cast<uc_arm64_reg>(UC_ARM64_REG_X0 + static_cast<int>(index)); 114 treg = (uc_arm64_reg)(UC_ARM64_REG_X0 + regn);
115 } else if (index < 31) { 115 } else if (regn < 31) {
116 treg = static_cast<uc_arm64_reg>(UC_ARM64_REG_X29 + static_cast<int>(index) - 29); 116 treg = (uc_arm64_reg)(UC_ARM64_REG_X29 + regn - 29);
117 } 117 }
118 CHECKED(uc_reg_write(uc, treg, &value)); 118 CHECKED(uc_reg_write(uc, treg, &val));
119} 119}
120 120
121u128 ARM_Unicorn::GetVectorReg(std::size_t /*index*/) const { 121u128 ARM_Unicorn::GetVectorReg(int /*index*/) const {
122 UNIMPLEMENTED(); 122 UNIMPLEMENTED();
123 static constexpr u128 res{}; 123 static constexpr u128 res{};
124 return res; 124 return res;
125} 125}
126 126
127void ARM_Unicorn::SetVectorReg(std::size_t /*index*/, u128 /*value*/) { 127void ARM_Unicorn::SetVectorReg(int /*index*/, u128 /*value*/) {
128 UNIMPLEMENTED(); 128 UNIMPLEMENTED();
129} 129}
130 130
@@ -217,8 +217,8 @@ void ARM_Unicorn::SaveContext(ThreadContext64& ctx) {
217 CHECKED(uc_reg_read(uc, UC_ARM64_REG_PC, &ctx.pc)); 217 CHECKED(uc_reg_read(uc, UC_ARM64_REG_PC, &ctx.pc));
218 CHECKED(uc_reg_read(uc, UC_ARM64_REG_NZCV, &ctx.pstate)); 218 CHECKED(uc_reg_read(uc, UC_ARM64_REG_NZCV, &ctx.pstate));
219 219
220 for (std::size_t i = 0; i < 29; ++i) { 220 for (auto i = 0; i < 29; ++i) {
221 uregs[i] = UC_ARM64_REG_X0 + static_cast<int>(i); 221 uregs[i] = UC_ARM64_REG_X0 + i;
222 tregs[i] = &ctx.cpu_registers[i]; 222 tregs[i] = &ctx.cpu_registers[i];
223 } 223 }
224 uregs[29] = UC_ARM64_REG_X29; 224 uregs[29] = UC_ARM64_REG_X29;
@@ -228,8 +228,8 @@ void ARM_Unicorn::SaveContext(ThreadContext64& ctx) {
228 228
229 CHECKED(uc_reg_read_batch(uc, uregs, tregs, 31)); 229 CHECKED(uc_reg_read_batch(uc, uregs, tregs, 31));
230 230
231 for (std::size_t i = 0; i < 32; ++i) { 231 for (int i = 0; i < 32; ++i) {
232 uregs[i] = UC_ARM64_REG_Q0 + static_cast<int>(i); 232 uregs[i] = UC_ARM64_REG_Q0 + i;
233 tregs[i] = &ctx.vector_registers[i]; 233 tregs[i] = &ctx.vector_registers[i];
234 } 234 }
235 235
@@ -244,8 +244,8 @@ void ARM_Unicorn::LoadContext(const ThreadContext64& ctx) {
244 CHECKED(uc_reg_write(uc, UC_ARM64_REG_PC, &ctx.pc)); 244 CHECKED(uc_reg_write(uc, UC_ARM64_REG_PC, &ctx.pc));
245 CHECKED(uc_reg_write(uc, UC_ARM64_REG_NZCV, &ctx.pstate)); 245 CHECKED(uc_reg_write(uc, UC_ARM64_REG_NZCV, &ctx.pstate));
246 246
247 for (std::size_t i = 0; i < 29; ++i) { 247 for (int i = 0; i < 29; ++i) {
248 uregs[i] = UC_ARM64_REG_X0 + static_cast<int>(i); 248 uregs[i] = UC_ARM64_REG_X0 + i;
249 tregs[i] = (void*)&ctx.cpu_registers[i]; 249 tregs[i] = (void*)&ctx.cpu_registers[i];
250 } 250 }
251 uregs[29] = UC_ARM64_REG_X29; 251 uregs[29] = UC_ARM64_REG_X29;
@@ -255,8 +255,8 @@ void ARM_Unicorn::LoadContext(const ThreadContext64& ctx) {
255 255
256 CHECKED(uc_reg_write_batch(uc, uregs, tregs, 31)); 256 CHECKED(uc_reg_write_batch(uc, uregs, tregs, 31));
257 257
258 for (std::size_t i = 0; i < 32; ++i) { 258 for (auto i = 0; i < 32; ++i) {
259 uregs[i] = UC_ARM64_REG_Q0 + static_cast<int>(i); 259 uregs[i] = UC_ARM64_REG_Q0 + i;
260 tregs[i] = (void*)&ctx.vector_registers[i]; 260 tregs[i] = (void*)&ctx.vector_registers[i];
261 } 261 }
262 262
diff --git a/src/core/arm/unicorn/arm_unicorn.h b/src/core/arm/unicorn/arm_unicorn.h
index 1183e9541..810aff311 100644
--- a/src/core/arm/unicorn/arm_unicorn.h
+++ b/src/core/arm/unicorn/arm_unicorn.h
@@ -26,10 +26,10 @@ public:
26 26
27 void SetPC(u64 pc) override; 27 void SetPC(u64 pc) override;
28 u64 GetPC() const override; 28 u64 GetPC() const override;
29 u64 GetReg(std::size_t index) const override; 29 u64 GetReg(int index) const override;
30 void SetReg(std::size_t index, u64 value) override; 30 void SetReg(int index, u64 value) override;
31 u128 GetVectorReg(std::size_t index) const override; 31 u128 GetVectorReg(int index) const override;
32 void SetVectorReg(std::size_t index, u128 value) override; 32 void SetVectorReg(int index, u128 value) override;
33 u32 GetPSTATE() const override; 33 u32 GetPSTATE() const override;
34 void SetPSTATE(u32 pstate) override; 34 void SetPSTATE(u32 pstate) override;
35 VAddr GetTlsAddress() const override; 35 VAddr GetTlsAddress() const override;
diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp
index 9b01f6293..e6c8461a5 100644
--- a/src/core/core_timing.cpp
+++ b/src/core/core_timing.cpp
@@ -140,8 +140,7 @@ void CoreTiming::AddTicks(u64 ticks) {
140void CoreTiming::Idle() { 140void CoreTiming::Idle() {
141 if (!event_queue.empty()) { 141 if (!event_queue.empty()) {
142 const u64 next_event_time = event_queue.front().time; 142 const u64 next_event_time = event_queue.front().time;
143 const u64 next_ticks = 143 const u64 next_ticks = nsToCycles(std::chrono::nanoseconds(next_event_time)) + 10U;
144 static_cast<u64>(nsToCycles(std::chrono::nanoseconds(next_event_time))) + 10;
145 if (next_ticks > ticks) { 144 if (next_ticks > ticks) {
146 ticks = next_ticks; 145 ticks = next_ticks;
147 } 146 }
@@ -188,7 +187,7 @@ void CoreTiming::RemoveEvent(const std::shared_ptr<EventType>& event_type) {
188 187
189std::optional<s64> CoreTiming::Advance() { 188std::optional<s64> CoreTiming::Advance() {
190 std::scoped_lock lock{advance_lock, basic_lock}; 189 std::scoped_lock lock{advance_lock, basic_lock};
191 global_timer = static_cast<u64>(GetGlobalTimeNs().count()); 190 global_timer = GetGlobalTimeNs().count();
192 191
193 while (!event_queue.empty() && event_queue.front().time <= global_timer) { 192 while (!event_queue.empty() && event_queue.front().time <= global_timer) {
194 Event evt = std::move(event_queue.front()); 193 Event evt = std::move(event_queue.front());
@@ -202,11 +201,11 @@ std::optional<s64> CoreTiming::Advance() {
202 } 201 }
203 202
204 basic_lock.lock(); 203 basic_lock.lock();
205 global_timer = static_cast<u64>(GetGlobalTimeNs().count()); 204 global_timer = GetGlobalTimeNs().count();
206 } 205 }
207 206
208 if (!event_queue.empty()) { 207 if (!event_queue.empty()) {
209 const auto next_time = static_cast<s64>(event_queue.front().time - global_timer); 208 const s64 next_time = event_queue.front().time - global_timer;
210 return next_time; 209 return next_time;
211 } else { 210 } else {
212 return std::nullopt; 211 return std::nullopt;
@@ -241,14 +240,14 @@ std::chrono::nanoseconds CoreTiming::GetGlobalTimeNs() const {
241 if (is_multicore) { 240 if (is_multicore) {
242 return clock->GetTimeNS(); 241 return clock->GetTimeNS();
243 } 242 }
244 return CyclesToNs(static_cast<s64>(ticks)); 243 return CyclesToNs(ticks);
245} 244}
246 245
247std::chrono::microseconds CoreTiming::GetGlobalTimeUs() const { 246std::chrono::microseconds CoreTiming::GetGlobalTimeUs() const {
248 if (is_multicore) { 247 if (is_multicore) {
249 return clock->GetTimeUS(); 248 return clock->GetTimeUS();
250 } 249 }
251 return CyclesToUs(static_cast<s64>(ticks)); 250 return CyclesToUs(ticks);
252} 251}
253 252
254} // namespace Core::Timing 253} // namespace Core::Timing
diff --git a/src/core/core_timing_util.cpp b/src/core/core_timing_util.cpp
index 5cd450714..8ce8e602e 100644
--- a/src/core/core_timing_util.cpp
+++ b/src/core/core_timing_util.cpp
@@ -21,9 +21,9 @@ s64 msToCycles(std::chrono::milliseconds ms) {
21 } 21 }
22 if (static_cast<u64>(ms.count()) > MAX_VALUE_TO_MULTIPLY) { 22 if (static_cast<u64>(ms.count()) > MAX_VALUE_TO_MULTIPLY) {
23 LOG_DEBUG(Core_Timing, "Time very big, do rounding"); 23 LOG_DEBUG(Core_Timing, "Time very big, do rounding");
24 return static_cast<s64>(Hardware::BASE_CLOCK_RATE * static_cast<u64>(ms.count() / 1000)); 24 return Hardware::BASE_CLOCK_RATE * (ms.count() / 1000);
25 } 25 }
26 return static_cast<s64>((Hardware::BASE_CLOCK_RATE * static_cast<u64>(ms.count())) / 1000); 26 return (Hardware::BASE_CLOCK_RATE * ms.count()) / 1000;
27} 27}
28 28
29s64 usToCycles(std::chrono::microseconds us) { 29s64 usToCycles(std::chrono::microseconds us) {
@@ -33,55 +33,51 @@ s64 usToCycles(std::chrono::microseconds us) {
33 } 33 }
34 if (static_cast<u64>(us.count()) > MAX_VALUE_TO_MULTIPLY) { 34 if (static_cast<u64>(us.count()) > MAX_VALUE_TO_MULTIPLY) {
35 LOG_DEBUG(Core_Timing, "Time very big, do rounding"); 35 LOG_DEBUG(Core_Timing, "Time very big, do rounding");
36 return static_cast<s64>(Hardware::BASE_CLOCK_RATE * static_cast<u64>(us.count() / 1000000)); 36 return Hardware::BASE_CLOCK_RATE * (us.count() / 1000000);
37 } 37 }
38 return static_cast<s64>((Hardware::BASE_CLOCK_RATE * static_cast<u64>(us.count())) / 1000000); 38 return (Hardware::BASE_CLOCK_RATE * us.count()) / 1000000;
39} 39}
40 40
41s64 nsToCycles(std::chrono::nanoseconds ns) { 41s64 nsToCycles(std::chrono::nanoseconds ns) {
42 const u128 temp = 42 const u128 temporal = Common::Multiply64Into128(ns.count(), Hardware::BASE_CLOCK_RATE);
43 Common::Multiply64Into128(static_cast<u64>(ns.count()), Hardware::BASE_CLOCK_RATE); 43 return Common::Divide128On32(temporal, static_cast<u32>(1000000000)).first;
44 return static_cast<s64>(Common::Divide128On32(temp, static_cast<u32>(1000000000)).first);
45} 44}
46 45
47u64 msToClockCycles(std::chrono::milliseconds ms) { 46u64 msToClockCycles(std::chrono::milliseconds ns) {
48 const auto count = static_cast<u64>(ms.count()); 47 const u128 temp = Common::Multiply64Into128(ns.count(), Hardware::CNTFREQ);
49 const u128 temp = Common::Multiply64Into128(count, Hardware::CNTFREQ);
50 return Common::Divide128On32(temp, 1000).first; 48 return Common::Divide128On32(temp, 1000).first;
51} 49}
52 50
53u64 usToClockCycles(std::chrono::microseconds us) { 51u64 usToClockCycles(std::chrono::microseconds ns) {
54 const auto count = static_cast<u64>(us.count()); 52 const u128 temp = Common::Multiply64Into128(ns.count(), Hardware::CNTFREQ);
55 const u128 temp = Common::Multiply64Into128(count, Hardware::CNTFREQ);
56 return Common::Divide128On32(temp, 1000000).first; 53 return Common::Divide128On32(temp, 1000000).first;
57} 54}
58 55
59u64 nsToClockCycles(std::chrono::nanoseconds ns) { 56u64 nsToClockCycles(std::chrono::nanoseconds ns) {
60 const auto count = static_cast<u64>(ns.count()); 57 const u128 temp = Common::Multiply64Into128(ns.count(), Hardware::CNTFREQ);
61 const u128 temp = Common::Multiply64Into128(count, Hardware::CNTFREQ);
62 return Common::Divide128On32(temp, 1000000000).first; 58 return Common::Divide128On32(temp, 1000000000).first;
63} 59}
64 60
65u64 CpuCyclesToClockCycles(u64 ticks) { 61u64 CpuCyclesToClockCycles(u64 ticks) {
66 const u128 temp = Common::Multiply64Into128(ticks, Hardware::CNTFREQ); 62 const u128 temporal = Common::Multiply64Into128(ticks, Hardware::CNTFREQ);
67 return Common::Divide128On32(temp, static_cast<u32>(Hardware::BASE_CLOCK_RATE)).first; 63 return Common::Divide128On32(temporal, static_cast<u32>(Hardware::BASE_CLOCK_RATE)).first;
68} 64}
69 65
70std::chrono::milliseconds CyclesToMs(s64 cycles) { 66std::chrono::milliseconds CyclesToMs(s64 cycles) {
71 const u128 temp = Common::Multiply64Into128(static_cast<u64>(cycles), 1000); 67 const u128 temporal = Common::Multiply64Into128(cycles, 1000);
72 const u64 ms = Common::Divide128On32(temp, static_cast<u32>(Hardware::BASE_CLOCK_RATE)).first; 68 u64 ms = Common::Divide128On32(temporal, static_cast<u32>(Hardware::BASE_CLOCK_RATE)).first;
73 return std::chrono::milliseconds(ms); 69 return std::chrono::milliseconds(ms);
74} 70}
75 71
76std::chrono::nanoseconds CyclesToNs(s64 cycles) { 72std::chrono::nanoseconds CyclesToNs(s64 cycles) {
77 const u128 temp = Common::Multiply64Into128(static_cast<u64>(cycles), 1000000000); 73 const u128 temporal = Common::Multiply64Into128(cycles, 1000000000);
78 const u64 ns = Common::Divide128On32(temp, static_cast<u32>(Hardware::BASE_CLOCK_RATE)).first; 74 u64 ns = Common::Divide128On32(temporal, static_cast<u32>(Hardware::BASE_CLOCK_RATE)).first;
79 return std::chrono::nanoseconds(ns); 75 return std::chrono::nanoseconds(ns);
80} 76}
81 77
82std::chrono::microseconds CyclesToUs(s64 cycles) { 78std::chrono::microseconds CyclesToUs(s64 cycles) {
83 const u128 temp = Common::Multiply64Into128(static_cast<u64>(cycles), 1000000); 79 const u128 temporal = Common::Multiply64Into128(cycles, 1000000);
84 const u64 us = Common::Divide128On32(temp, static_cast<u32>(Hardware::BASE_CLOCK_RATE)).first; 80 u64 us = Common::Divide128On32(temporal, static_cast<u32>(Hardware::BASE_CLOCK_RATE)).first;
85 return std::chrono::microseconds(us); 81 return std::chrono::microseconds(us);
86} 82}
87 83
diff --git a/src/core/core_timing_util.h b/src/core/core_timing_util.h
index 3be55e267..e4a046bf9 100644
--- a/src/core/core_timing_util.h
+++ b/src/core/core_timing_util.h
@@ -12,8 +12,8 @@ namespace Core::Timing {
12s64 msToCycles(std::chrono::milliseconds ms); 12s64 msToCycles(std::chrono::milliseconds ms);
13s64 usToCycles(std::chrono::microseconds us); 13s64 usToCycles(std::chrono::microseconds us);
14s64 nsToCycles(std::chrono::nanoseconds ns); 14s64 nsToCycles(std::chrono::nanoseconds ns);
15u64 msToClockCycles(std::chrono::milliseconds ms); 15u64 msToClockCycles(std::chrono::milliseconds ns);
16u64 usToClockCycles(std::chrono::microseconds us); 16u64 usToClockCycles(std::chrono::microseconds ns);
17u64 nsToClockCycles(std::chrono::nanoseconds ns); 17u64 nsToClockCycles(std::chrono::nanoseconds ns);
18std::chrono::milliseconds CyclesToMs(s64 cycles); 18std::chrono::milliseconds CyclesToMs(s64 cycles);
19std::chrono::nanoseconds CyclesToNs(s64 cycles); 19std::chrono::nanoseconds CyclesToNs(s64 cycles);
diff --git a/src/core/crypto/key_manager.cpp b/src/core/crypto/key_manager.cpp
index 1f0d3170b..da15f764a 100644
--- a/src/core/crypto/key_manager.cpp
+++ b/src/core/crypto/key_manager.cpp
@@ -143,7 +143,6 @@ u64 GetSignatureTypeDataSize(SignatureType type) {
143 return 0x3C; 143 return 0x3C;
144 } 144 }
145 UNREACHABLE(); 145 UNREACHABLE();
146 return 0;
147} 146}
148 147
149u64 GetSignatureTypePaddingSize(SignatureType type) { 148u64 GetSignatureTypePaddingSize(SignatureType type) {
@@ -158,7 +157,6 @@ u64 GetSignatureTypePaddingSize(SignatureType type) {
158 return 0x40; 157 return 0x40;
159 } 158 }
160 UNREACHABLE(); 159 UNREACHABLE();
161 return 0;
162} 160}
163 161
164SignatureType Ticket::GetSignatureType() const { 162SignatureType Ticket::GetSignatureType() const {
@@ -173,7 +171,6 @@ SignatureType Ticket::GetSignatureType() const {
173 } 171 }
174 172
175 UNREACHABLE(); 173 UNREACHABLE();
176 return {};
177} 174}
178 175
179TicketData& Ticket::GetData() { 176TicketData& Ticket::GetData() {
@@ -351,7 +348,7 @@ std::optional<Key128> DeriveSDSeed() {
351 std::array<u8, 0x10> buffer{}; 348 std::array<u8, 0x10> buffer{};
352 std::size_t offset = 0; 349 std::size_t offset = 0;
353 for (; offset + 0x10 < save_43.GetSize(); ++offset) { 350 for (; offset + 0x10 < save_43.GetSize(); ++offset) {
354 if (!save_43.Seek(static_cast<s64>(offset), SEEK_SET)) { 351 if (!save_43.Seek(offset, SEEK_SET)) {
355 return std::nullopt; 352 return std::nullopt;
356 } 353 }
357 354
@@ -361,7 +358,7 @@ std::optional<Key128> DeriveSDSeed() {
361 } 358 }
362 } 359 }
363 360
364 if (!save_43.Seek(static_cast<s64>(offset + 0x10), SEEK_SET)) { 361 if (!save_43.Seek(offset + 0x10, SEEK_SET)) {
365 return std::nullopt; 362 return std::nullopt;
366 } 363 }
367 364
diff --git a/src/core/crypto/partition_data_manager.cpp b/src/core/crypto/partition_data_manager.cpp
index db54f71f4..5f1c86a09 100644
--- a/src/core/crypto/partition_data_manager.cpp
+++ b/src/core/crypto/partition_data_manager.cpp
@@ -161,7 +161,7 @@ static constexpr u8 CalculateMaxKeyblobSourceHash() {
161 return true; 161 return true;
162 }; 162 };
163 163
164 for (std::size_t i = 0x1F; i <= 0x1F; --i) { 164 for (s8 i = 0x1F; i >= 0; --i) {
165 if (!is_zero(keyblob_source_hashes[i])) { 165 if (!is_zero(keyblob_source_hashes[i])) {
166 return static_cast<u8>(i + 1); 166 return static_cast<u8>(i + 1);
167 } 167 }
diff --git a/src/core/file_sys/content_archive.cpp b/src/core/file_sys/content_archive.cpp
index 0917f6ebf..76af47ff9 100644
--- a/src/core/file_sys/content_archive.cpp
+++ b/src/core/file_sys/content_archive.cpp
@@ -201,9 +201,9 @@ bool NCA::HandlePotentialHeaderDecryption() {
201} 201}
202 202
203std::vector<NCASectionHeader> NCA::ReadSectionHeaders() const { 203std::vector<NCASectionHeader> NCA::ReadSectionHeaders() const {
204 const auto number_sections = static_cast<std::size_t>( 204 const std::ptrdiff_t number_sections =
205 std::count_if(std::begin(header.section_tables), std::end(header.section_tables), 205 std::count_if(std::begin(header.section_tables), std::end(header.section_tables),
206 [](NCASectionTableEntry entry) { return entry.media_offset > 0; })); 206 [](NCASectionTableEntry entry) { return entry.media_offset > 0; });
207 207
208 std::vector<NCASectionHeader> sections(number_sections); 208 std::vector<NCASectionHeader> sections(number_sections);
209 const auto length_sections = SECTION_HEADER_SIZE * number_sections; 209 const auto length_sections = SECTION_HEADER_SIZE * number_sections;
diff --git a/src/core/file_sys/fsmitm_romfsbuild.cpp b/src/core/file_sys/fsmitm_romfsbuild.cpp
index b2d38f01e..c52fafb6f 100644
--- a/src/core/file_sys/fsmitm_romfsbuild.cpp
+++ b/src/core/file_sys/fsmitm_romfsbuild.cpp
@@ -103,7 +103,7 @@ static u32 romfs_calc_path_hash(u32 parent, std::string_view path, u32 start,
103 u32 hash = parent ^ 123456789; 103 u32 hash = parent ^ 123456789;
104 for (u32 i = 0; i < path_len; i++) { 104 for (u32 i = 0; i < path_len; i++) {
105 hash = (hash >> 5) | (hash << 27); 105 hash = (hash >> 5) | (hash << 27);
106 hash ^= static_cast<u32>(path[start + i]); 106 hash ^= path[start + i];
107 } 107 }
108 108
109 return hash; 109 return hash;
diff --git a/src/core/file_sys/ips_layer.cpp b/src/core/file_sys/ips_layer.cpp
index 91dc69373..a6101f1c0 100644
--- a/src/core/file_sys/ips_layer.cpp
+++ b/src/core/file_sys/ips_layer.cpp
@@ -66,14 +66,12 @@ static bool IsEOF(IPSFileType type, const std::vector<u8>& data) {
66} 66}
67 67
68VirtualFile PatchIPS(const VirtualFile& in, const VirtualFile& ips) { 68VirtualFile PatchIPS(const VirtualFile& in, const VirtualFile& ips) {
69 if (in == nullptr || ips == nullptr) { 69 if (in == nullptr || ips == nullptr)
70 return nullptr; 70 return nullptr;
71 }
72 71
73 const auto type = IdentifyMagic(ips->ReadBytes(0x5)); 72 const auto type = IdentifyMagic(ips->ReadBytes(0x5));
74 if (type == IPSFileType::Error) { 73 if (type == IPSFileType::Error)
75 return nullptr; 74 return nullptr;
76 }
77 75
78 auto in_data = in->ReadAllBytes(); 76 auto in_data = in->ReadAllBytes();
79 77
@@ -86,46 +84,37 @@ VirtualFile PatchIPS(const VirtualFile& in, const VirtualFile& ips) {
86 } 84 }
87 85
88 u32 real_offset{}; 86 u32 real_offset{};
89 if (type == IPSFileType::IPS32) { 87 if (type == IPSFileType::IPS32)
90 real_offset = static_cast<u32>(temp[0] << 24) | static_cast<u32>(temp[1] << 16) | 88 real_offset = (temp[0] << 24) | (temp[1] << 16) | (temp[2] << 8) | temp[3];
91 static_cast<u32>(temp[2] << 8) | temp[3]; 89 else
92 } else { 90 real_offset = (temp[0] << 16) | (temp[1] << 8) | temp[2];
93 real_offset =
94 static_cast<u32>(temp[0] << 16) | static_cast<u32>(temp[1] << 8) | temp[2];
95 }
96 91
97 u16 data_size{}; 92 u16 data_size{};
98 if (ips->ReadObject(&data_size, offset) != sizeof(u16)) { 93 if (ips->ReadObject(&data_size, offset) != sizeof(u16))
99 return nullptr; 94 return nullptr;
100 }
101 data_size = Common::swap16(data_size); 95 data_size = Common::swap16(data_size);
102 offset += sizeof(u16); 96 offset += sizeof(u16);
103 97
104 if (data_size == 0) { // RLE 98 if (data_size == 0) { // RLE
105 u16 rle_size{}; 99 u16 rle_size{};
106 if (ips->ReadObject(&rle_size, offset) != sizeof(u16)) { 100 if (ips->ReadObject(&rle_size, offset) != sizeof(u16))
107 return nullptr; 101 return nullptr;
108 }
109 rle_size = Common::swap16(rle_size); 102 rle_size = Common::swap16(rle_size);
110 offset += sizeof(u16); 103 offset += sizeof(u16);
111 104
112 const auto data = ips->ReadByte(offset++); 105 const auto data = ips->ReadByte(offset++);
113 if (!data) { 106 if (!data)
114 return nullptr; 107 return nullptr;
115 }
116 108
117 if (real_offset + rle_size > in_data.size()) { 109 if (real_offset + rle_size > in_data.size())
118 rle_size = static_cast<u16>(in_data.size() - real_offset); 110 rle_size = static_cast<u16>(in_data.size() - real_offset);
119 }
120 std::memset(in_data.data() + real_offset, *data, rle_size); 111 std::memset(in_data.data() + real_offset, *data, rle_size);
121 } else { // Standard Patch 112 } else { // Standard Patch
122 auto read = data_size; 113 auto read = data_size;
123 if (real_offset + read > in_data.size()) { 114 if (real_offset + read > in_data.size())
124 read = static_cast<u16>(in_data.size() - real_offset); 115 read = static_cast<u16>(in_data.size() - real_offset);
125 } 116 if (ips->Read(in_data.data() + real_offset, read, offset) != data_size)
126 if (ips->Read(in_data.data() + real_offset, read, offset) != data_size) {
127 return nullptr; 117 return nullptr;
128 }
129 offset += data_size; 118 offset += data_size;
130 } 119 }
131 } 120 }
@@ -193,16 +182,14 @@ void IPSwitchCompiler::ParseFlag(const std::string& line) {
193void IPSwitchCompiler::Parse() { 182void IPSwitchCompiler::Parse() {
194 const auto bytes = patch_text->ReadAllBytes(); 183 const auto bytes = patch_text->ReadAllBytes();
195 std::stringstream s; 184 std::stringstream s;
196 s.write(reinterpret_cast<const char*>(bytes.data()), 185 s.write(reinterpret_cast<const char*>(bytes.data()), bytes.size());
197 static_cast<std::streamsize>(bytes.size()));
198 186
199 std::vector<std::string> lines; 187 std::vector<std::string> lines;
200 std::string stream_line; 188 std::string stream_line;
201 while (std::getline(s, stream_line)) { 189 while (std::getline(s, stream_line)) {
202 // Remove a trailing \r 190 // Remove a trailing \r
203 if (!stream_line.empty() && stream_line.back() == '\r') { 191 if (!stream_line.empty() && stream_line.back() == '\r')
204 stream_line.pop_back(); 192 stream_line.pop_back();
205 }
206 lines.push_back(std::move(stream_line)); 193 lines.push_back(std::move(stream_line));
207 } 194 }
208 195
diff --git a/src/core/file_sys/kernel_executable.cpp b/src/core/file_sys/kernel_executable.cpp
index fa758b777..ef93ef3ed 100644
--- a/src/core/file_sys/kernel_executable.cpp
+++ b/src/core/file_sys/kernel_executable.cpp
@@ -36,14 +36,14 @@ bool DecompressBLZ(std::vector<u8>& data) {
36 while (out_index > 0) { 36 while (out_index > 0) {
37 --index; 37 --index;
38 auto control = data[index + start_offset]; 38 auto control = data[index + start_offset];
39 for (std::size_t i = 0; i < 8; ++i) { 39 for (size_t i = 0; i < 8; ++i) {
40 if (((control << i) & 0x80) > 0) { 40 if (((control << i) & 0x80) > 0) {
41 if (index < 2) { 41 if (index < 2) {
42 return false; 42 return false;
43 } 43 }
44 index -= 2; 44 index -= 2;
45 std::size_t segment_offset = static_cast<u32>(data[index + start_offset]) | 45 std::size_t segment_offset =
46 static_cast<u32>(data[index + start_offset + 1] << 8); 46 data[index + start_offset] | data[index + start_offset + 1] << 8;
47 std::size_t segment_size = ((segment_offset >> 12) & 0xF) + 3; 47 std::size_t segment_size = ((segment_offset >> 12) & 0xF) + 3;
48 segment_offset &= 0xFFF; 48 segment_offset &= 0xFFF;
49 segment_offset += 3; 49 segment_offset += 3;
diff --git a/src/core/file_sys/nca_patch.cpp b/src/core/file_sys/nca_patch.cpp
index 6d3472447..5990a2fd5 100644
--- a/src/core/file_sys/nca_patch.cpp
+++ b/src/core/file_sys/nca_patch.cpp
@@ -25,9 +25,9 @@ std::pair<std::size_t, std::size_t> SearchBucketEntry(u64 offset, const BlockTyp
25 ASSERT_MSG(offset <= block.size, "Offset is out of bounds in BKTR relocation block."); 25 ASSERT_MSG(offset <= block.size, "Offset is out of bounds in BKTR relocation block.");
26 } 26 }
27 27
28 const auto bucket_id = static_cast<std::size_t>(std::count_if( 28 std::size_t bucket_id = std::count_if(
29 block.base_offsets.begin() + 1, block.base_offsets.begin() + block.number_buckets, 29 block.base_offsets.begin() + 1, block.base_offsets.begin() + block.number_buckets,
30 [&offset](u64 base_offset) { return base_offset <= offset; })); 30 [&offset](u64 base_offset) { return base_offset <= offset; });
31 31
32 const auto& bucket = buckets[bucket_id]; 32 const auto& bucket = buckets[bucket_id];
33 33
@@ -53,7 +53,6 @@ std::pair<std::size_t, std::size_t> SearchBucketEntry(u64 offset, const BlockTyp
53 } 53 }
54 54
55 UNREACHABLE_MSG("Offset could not be found in BKTR block."); 55 UNREACHABLE_MSG("Offset could not be found in BKTR block.");
56 return {};
57} 56}
58} // Anonymous namespace 57} // Anonymous namespace
59 58
@@ -137,7 +136,7 @@ std::size_t BKTR::Read(u8* data, std::size_t length, std::size_t offset) const {
137 136
138 const auto block_offset = section_offset & 0xF; 137 const auto block_offset = section_offset & 0xF;
139 if (block_offset != 0) { 138 if (block_offset != 0) {
140 auto block = bktr_romfs->ReadBytes(0x10, section_offset & ~0xFU); 139 auto block = bktr_romfs->ReadBytes(0x10, section_offset & ~0xF);
141 cipher.Transcode(block.data(), block.size(), block.data(), Core::Crypto::Op::Decrypt); 140 cipher.Transcode(block.data(), block.size(), block.data(), Core::Crypto::Op::Decrypt);
142 if (length + block_offset < 0x10) { 141 if (length + block_offset < 0x10) {
143 std::memcpy(data, block.data() + block_offset, std::min(length, block.size())); 142 std::memcpy(data, block.data() + block_offset, std::min(length, block.size()));
diff --git a/src/core/frontend/applets/controller.cpp b/src/core/frontend/applets/controller.cpp
index fdc97d692..c5d65f2d0 100644
--- a/src/core/frontend/applets/controller.cpp
+++ b/src/core/frontend/applets/controller.cpp
@@ -30,7 +30,7 @@ void DefaultControllerApplet::ReconfigureControllers(std::function<void()> callb
30 auto& players = Settings::values.players; 30 auto& players = Settings::values.players;
31 31
32 const std::size_t min_supported_players = 32 const std::size_t min_supported_players =
33 parameters.enable_single_mode ? 1 : static_cast<std::size_t>(parameters.min_players); 33 parameters.enable_single_mode ? 1 : parameters.min_players;
34 34
35 // Disconnect Handheld first. 35 // Disconnect Handheld first.
36 npad.DisconnectNPadAtIndex(8); 36 npad.DisconnectNPadAtIndex(8);
diff --git a/src/core/frontend/applets/profile_select.cpp b/src/core/frontend/applets/profile_select.cpp
index a17420823..4df3574d2 100644
--- a/src/core/frontend/applets/profile_select.cpp
+++ b/src/core/frontend/applets/profile_select.cpp
@@ -12,9 +12,8 @@ ProfileSelectApplet::~ProfileSelectApplet() = default;
12 12
13void DefaultProfileSelectApplet::SelectProfile( 13void DefaultProfileSelectApplet::SelectProfile(
14 std::function<void(std::optional<Common::UUID>)> callback) const { 14 std::function<void(std::optional<Common::UUID>)> callback) const {
15 const auto user_index = static_cast<std::size_t>(Settings::values.current_user);
16 Service::Account::ProfileManager manager; 15 Service::Account::ProfileManager manager;
17 callback(manager.GetUser(user_index).value_or(Common::UUID{})); 16 callback(manager.GetUser(Settings::values.current_user).value_or(Common::UUID{}));
18 LOG_INFO(Service_ACC, "called, selecting current user instead of prompting..."); 17 LOG_INFO(Service_ACC, "called, selecting current user instead of prompting...");
19} 18}
20 19
diff --git a/src/core/gdbstub/gdbstub.cpp b/src/core/gdbstub/gdbstub.cpp
index 28a8a0f49..97ee65464 100644
--- a/src/core/gdbstub/gdbstub.cpp
+++ b/src/core/gdbstub/gdbstub.cpp
@@ -205,7 +205,7 @@ static Kernel::Thread* FindThreadById(s64 id) {
205 const auto& threads = Core::System::GetInstance().GlobalScheduler().GetThreadList(); 205 const auto& threads = Core::System::GetInstance().GlobalScheduler().GetThreadList();
206 for (auto& thread : threads) { 206 for (auto& thread : threads) {
207 if (thread->GetThreadID() == static_cast<u64>(id)) { 207 if (thread->GetThreadID() == static_cast<u64>(id)) {
208 current_core = static_cast<u32>(thread->GetProcessorID()); 208 current_core = thread->GetProcessorID();
209 return thread.get(); 209 return thread.get();
210 } 210 }
211 } 211 }
@@ -457,14 +457,7 @@ static u128 GdbHexToU128(const u8* src) {
457/// Read a byte from the gdb client. 457/// Read a byte from the gdb client.
458static u8 ReadByte() { 458static u8 ReadByte() {
459 u8 c; 459 u8 c;
460 460 std::size_t received_size = recv(gdbserver_socket, reinterpret_cast<char*>(&c), 1, MSG_WAITALL);
461#ifdef WIN32
462 const auto socket_id = static_cast<SOCKET>(gdbserver_socket);
463#else
464 const auto socket_id = gdbserver_socket;
465#endif
466
467 const auto received_size = recv(socket_id, reinterpret_cast<char*>(&c), 1, MSG_WAITALL);
468 if (received_size != 1) { 461 if (received_size != 1) {
469 LOG_ERROR(Debug_GDBStub, "recv failed: {}", received_size); 462 LOG_ERROR(Debug_GDBStub, "recv failed: {}", received_size);
470 Shutdown(); 463 Shutdown();
@@ -581,13 +574,7 @@ bool CheckBreakpoint(VAddr addr, BreakpointType type) {
581 * @param packet Packet to be sent to client. 574 * @param packet Packet to be sent to client.
582 */ 575 */
583static void SendPacket(const char packet) { 576static void SendPacket(const char packet) {
584#ifdef WIN32 577 std::size_t sent_size = send(gdbserver_socket, &packet, 1, 0);
585 const auto socket_id = static_cast<SOCKET>(gdbserver_socket);
586#else
587 const auto socket_id = gdbserver_socket;
588#endif
589
590 const auto sent_size = send(socket_id, &packet, 1, 0);
591 if (sent_size != 1) { 578 if (sent_size != 1) {
592 LOG_ERROR(Debug_GDBStub, "send failed"); 579 LOG_ERROR(Debug_GDBStub, "send failed");
593 } 580 }
@@ -624,13 +611,7 @@ static void SendReply(const char* reply) {
624 u8* ptr = command_buffer; 611 u8* ptr = command_buffer;
625 u32 left = command_length + 4; 612 u32 left = command_length + 4;
626 while (left > 0) { 613 while (left > 0) {
627#ifdef WIN32 614 const auto sent_size = send(gdbserver_socket, reinterpret_cast<char*>(ptr), left, 0);
628 const auto socket_id = static_cast<SOCKET>(gdbserver_socket);
629#else
630 const auto socket_id = gdbserver_socket;
631#endif
632 const auto sent_size =
633 send(socket_id, reinterpret_cast<char*>(ptr), static_cast<socklen_t>(left), 0);
634 if (sent_size < 0) { 615 if (sent_size < 0) {
635 LOG_ERROR(Debug_GDBStub, "gdb: send failed"); 616 LOG_ERROR(Debug_GDBStub, "gdb: send failed");
636 return Shutdown(); 617 return Shutdown();
@@ -1313,13 +1294,8 @@ static void Init(u16 port) {
1313 WSAStartup(MAKEWORD(2, 2), &InitData); 1294 WSAStartup(MAKEWORD(2, 2), &InitData);
1314#endif 1295#endif
1315 1296
1316#ifdef WIN32 1297 int tmpsock = static_cast<int>(socket(PF_INET, SOCK_STREAM, 0));
1317 using socket_type = SOCKET; 1298 if (tmpsock == -1) {
1318#else
1319 using socket_type = int;
1320#endif
1321 const auto tmpsock = static_cast<socket_type>(socket(PF_INET, SOCK_STREAM, 0));
1322 if (tmpsock == static_cast<socket_type>(-1)) {
1323 LOG_ERROR(Debug_GDBStub, "Failed to create gdb socket"); 1299 LOG_ERROR(Debug_GDBStub, "Failed to create gdb socket");
1324 } 1300 }
1325 1301
@@ -1359,7 +1335,7 @@ static void Init(u16 port) {
1359 } 1335 }
1360 1336
1361 // Clean up temporary socket if it's still alive at this point. 1337 // Clean up temporary socket if it's still alive at this point.
1362 if (tmpsock != static_cast<socket_type>(-1)) { 1338 if (tmpsock != -1) {
1363 shutdown(tmpsock, SHUT_RDWR); 1339 shutdown(tmpsock, SHUT_RDWR);
1364 } 1340 }
1365} 1341}
@@ -1376,12 +1352,7 @@ void Shutdown() {
1376 1352
1377 LOG_INFO(Debug_GDBStub, "Stopping GDB ..."); 1353 LOG_INFO(Debug_GDBStub, "Stopping GDB ...");
1378 if (gdbserver_socket != -1) { 1354 if (gdbserver_socket != -1) {
1379#ifdef WIN32 1355 shutdown(gdbserver_socket, SHUT_RDWR);
1380 const auto tmpsock = static_cast<SOCKET>(socket(PF_INET, SOCK_STREAM, 0));
1381#else
1382 const auto tmpsock = static_cast<int>(socket(PF_INET, SOCK_STREAM, 0));
1383#endif
1384 shutdown(tmpsock, SHUT_RDWR);
1385 gdbserver_socket = -1; 1356 gdbserver_socket = -1;
1386 } 1357 }
1387 1358
@@ -1412,7 +1383,7 @@ void SetCpuStepFlag(bool is_step) {
1412 step_loop = is_step; 1383 step_loop = is_step;
1413} 1384}
1414 1385
1415void SendTrap(Kernel::Thread* thread, u32 trap) { 1386void SendTrap(Kernel::Thread* thread, int trap) {
1416 if (!send_trap) { 1387 if (!send_trap) {
1417 return; 1388 return;
1418 } 1389 }
diff --git a/src/core/gdbstub/gdbstub.h b/src/core/gdbstub/gdbstub.h
index 23d80f367..8fe3c320b 100644
--- a/src/core/gdbstub/gdbstub.h
+++ b/src/core/gdbstub/gdbstub.h
@@ -110,5 +110,5 @@ void SetCpuStepFlag(bool is_step);
110 * @param thread Sending thread. 110 * @param thread Sending thread.
111 * @param trap Trap no. 111 * @param trap Trap no.
112 */ 112 */
113void SendTrap(Kernel::Thread* thread, u32 trap); 113void SendTrap(Kernel::Thread* thread, int trap);
114} // namespace GDBStub 114} // namespace GDBStub
diff --git a/src/core/hle/ipc_helpers.h b/src/core/hle/ipc_helpers.h
index fcb86c822..1c354037d 100644
--- a/src/core/hle/ipc_helpers.h
+++ b/src/core/hle/ipc_helpers.h
@@ -233,7 +233,7 @@ void ResponseBuilder::PushRaw(const T& value) {
233 static_assert(std::is_trivially_copyable_v<T>, 233 static_assert(std::is_trivially_copyable_v<T>,
234 "It's undefined behavior to use memcpy with non-trivially copyable objects"); 234 "It's undefined behavior to use memcpy with non-trivially copyable objects");
235 std::memcpy(cmdbuf + index, &value, sizeof(T)); 235 std::memcpy(cmdbuf + index, &value, sizeof(T));
236 index += static_cast<std::ptrdiff_t>((sizeof(T) + 3) / 4); // round up to word length 236 index += (sizeof(T) + 3) / 4; // round up to word length
237} 237}
238 238
239template <> 239template <>
@@ -390,7 +390,7 @@ void RequestParser::PopRaw(T& value) {
390 static_assert(std::is_trivially_copyable_v<T>, 390 static_assert(std::is_trivially_copyable_v<T>,
391 "It's undefined behavior to use memcpy with non-trivially copyable objects"); 391 "It's undefined behavior to use memcpy with non-trivially copyable objects");
392 std::memcpy(&value, cmdbuf + index, sizeof(T)); 392 std::memcpy(&value, cmdbuf + index, sizeof(T));
393 index += static_cast<std::ptrdiff_t>((sizeof(T) + 3) / 4); // round up to word length 393 index += (sizeof(T) + 3) / 4; // round up to word length
394} 394}
395 395
396template <typename T> 396template <typename T>
diff --git a/src/core/hle/kernel/address_arbiter.cpp b/src/core/hle/kernel/address_arbiter.cpp
index b6ebc5329..b882eaa0f 100644
--- a/src/core/hle/kernel/address_arbiter.cpp
+++ b/src/core/hle/kernel/address_arbiter.cpp
@@ -108,7 +108,7 @@ ResultCode AddressArbiter::ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr a
108 auto& monitor = system.Monitor(); 108 auto& monitor = system.Monitor();
109 s32 updated_value; 109 s32 updated_value;
110 do { 110 do {
111 updated_value = static_cast<s32>(monitor.ExclusiveRead32(current_core, address)); 111 updated_value = monitor.ExclusiveRead32(current_core, address);
112 112
113 if (updated_value != value) { 113 if (updated_value != value) {
114 return ERR_INVALID_STATE; 114 return ERR_INVALID_STATE;
@@ -129,7 +129,7 @@ ResultCode AddressArbiter::ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr a
129 updated_value = value; 129 updated_value = value;
130 } 130 }
131 } 131 }
132 } while (!monitor.ExclusiveWrite32(current_core, address, static_cast<u32>(updated_value))); 132 } while (!monitor.ExclusiveWrite32(current_core, address, updated_value));
133 133
134 WakeThreads(waiting_threads, num_to_wake); 134 WakeThreads(waiting_threads, num_to_wake);
135 return RESULT_SUCCESS; 135 return RESULT_SUCCESS;
diff --git a/src/core/hle/kernel/handle_table.cpp b/src/core/hle/kernel/handle_table.cpp
index fe4988f84..3e745c18b 100644
--- a/src/core/hle/kernel/handle_table.cpp
+++ b/src/core/hle/kernel/handle_table.cpp
@@ -68,7 +68,7 @@ ResultVal<Handle> HandleTable::Create(std::shared_ptr<Object> obj) {
68 generations[slot] = generation; 68 generations[slot] = generation;
69 objects[slot] = std::move(obj); 69 objects[slot] = std::move(obj);
70 70
71 const auto handle = static_cast<Handle>(generation | static_cast<u16>(slot << 15)); 71 Handle handle = generation | (slot << 15);
72 return MakeResult<Handle>(handle); 72 return MakeResult<Handle>(handle);
73} 73}
74 74
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp
index 0a2de4270..81f85643b 100644
--- a/src/core/hle/kernel/hle_ipc.cpp
+++ b/src/core/hle/kernel/hle_ipc.cpp
@@ -58,7 +58,7 @@ std::shared_ptr<WritableEvent> HLERequestContext::SleepClientThread(
58 58
59 { 59 {
60 Handle event_handle = InvalidHandle; 60 Handle event_handle = InvalidHandle;
61 SchedulerLockAndSleep lock(kernel, event_handle, thread.get(), static_cast<s64>(timeout)); 61 SchedulerLockAndSleep lock(kernel, event_handle, thread.get(), timeout);
62 thread->SetHLECallback( 62 thread->SetHLECallback(
63 [context = *this, callback](std::shared_ptr<Thread> thread) mutable -> bool { 63 [context = *this, callback](std::shared_ptr<Thread> thread) mutable -> bool {
64 ThreadWakeupReason reason = thread->GetSignalingResult() == RESULT_TIMEOUT 64 ThreadWakeupReason reason = thread->GetSignalingResult() == RESULT_TIMEOUT
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index 56e14da6b..b2b5b8adf 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -171,7 +171,7 @@ struct KernelCore::Impl {
171 const auto type = 171 const auto type =
172 static_cast<ThreadType>(THREADTYPE_KERNEL | THREADTYPE_HLE | THREADTYPE_SUSPEND); 172 static_cast<ThreadType>(THREADTYPE_KERNEL | THREADTYPE_HLE | THREADTYPE_SUSPEND);
173 auto thread_res = 173 auto thread_res =
174 Thread::Create(system, type, std::move(name), 0, 0, 0, static_cast<s32>(i), 0, 174 Thread::Create(system, type, std::move(name), 0, 0, 0, static_cast<u32>(i), 0,
175 nullptr, std::move(init_func), init_func_parameter); 175 nullptr, std::move(init_func), init_func_parameter);
176 176
177 suspend_threads[i] = std::move(thread_res).Unwrap(); 177 suspend_threads[i] = std::move(thread_res).Unwrap();
diff --git a/src/core/hle/kernel/memory/address_space_info.cpp b/src/core/hle/kernel/memory/address_space_info.cpp
index 6cf43ba24..e4288cab4 100644
--- a/src/core/hle/kernel/memory/address_space_info.cpp
+++ b/src/core/hle/kernel/memory/address_space_info.cpp
@@ -96,7 +96,6 @@ u64 AddressSpaceInfo::GetAddressSpaceStart(std::size_t width, Type type) {
96 return AddressSpaceInfos[AddressSpaceIndices39Bit[index]].address; 96 return AddressSpaceInfos[AddressSpaceIndices39Bit[index]].address;
97 } 97 }
98 UNREACHABLE(); 98 UNREACHABLE();
99 return 0;
100} 99}
101 100
102std::size_t AddressSpaceInfo::GetAddressSpaceSize(std::size_t width, Type type) { 101std::size_t AddressSpaceInfo::GetAddressSpaceSize(std::size_t width, Type type) {
@@ -113,7 +112,6 @@ std::size_t AddressSpaceInfo::GetAddressSpaceSize(std::size_t width, Type type)
113 return AddressSpaceInfos[AddressSpaceIndices39Bit[index]].size; 112 return AddressSpaceInfos[AddressSpaceIndices39Bit[index]].size;
114 } 113 }
115 UNREACHABLE(); 114 UNREACHABLE();
116 return 0;
117} 115}
118 116
119} // namespace Kernel::Memory 117} // namespace Kernel::Memory
diff --git a/src/core/hle/kernel/memory/memory_manager.cpp b/src/core/hle/kernel/memory/memory_manager.cpp
index a96157c37..acf13585c 100644
--- a/src/core/hle/kernel/memory/memory_manager.cpp
+++ b/src/core/hle/kernel/memory/memory_manager.cpp
@@ -71,7 +71,7 @@ VAddr MemoryManager::AllocateContinuous(std::size_t num_pages, std::size_t align
71 } 71 }
72 72
73 // If we allocated more than we need, free some 73 // If we allocated more than we need, free some
74 const auto allocated_pages{PageHeap::GetBlockNumPages(static_cast<u32>(heap_index))}; 74 const auto allocated_pages{PageHeap::GetBlockNumPages(heap_index)};
75 if (allocated_pages > num_pages) { 75 if (allocated_pages > num_pages) {
76 chosen_manager.Free(allocated_block + num_pages * PageSize, allocated_pages - num_pages); 76 chosen_manager.Free(allocated_block + num_pages * PageSize, allocated_pages - num_pages);
77 } 77 }
@@ -112,7 +112,7 @@ ResultCode MemoryManager::Allocate(PageLinkedList& page_list, std::size_t num_pa
112 112
113 // Keep allocating until we've allocated all our pages 113 // Keep allocating until we've allocated all our pages
114 for (s32 index{heap_index}; index >= 0 && num_pages > 0; index--) { 114 for (s32 index{heap_index}; index >= 0 && num_pages > 0; index--) {
115 const auto pages_per_alloc{PageHeap::GetBlockNumPages(static_cast<u32>(index))}; 115 const auto pages_per_alloc{PageHeap::GetBlockNumPages(index)};
116 116
117 while (num_pages >= pages_per_alloc) { 117 while (num_pages >= pages_per_alloc) {
118 // Allocate a block 118 // Allocate a block
diff --git a/src/core/hle/kernel/memory/page_heap.cpp b/src/core/hle/kernel/memory/page_heap.cpp
index 7890b8c1a..0ab1f7205 100644
--- a/src/core/hle/kernel/memory/page_heap.cpp
+++ b/src/core/hle/kernel/memory/page_heap.cpp
@@ -33,12 +33,11 @@ void PageHeap::Initialize(VAddr address, std::size_t size, std::size_t metadata_
33} 33}
34 34
35VAddr PageHeap::AllocateBlock(s32 index) { 35VAddr PageHeap::AllocateBlock(s32 index) {
36 const auto u_index = static_cast<std::size_t>(index); 36 const std::size_t needed_size{blocks[index].GetSize()};
37 const auto needed_size{blocks[u_index].GetSize()};
38 37
39 for (auto i = u_index; i < MemoryBlockPageShifts.size(); i++) { 38 for (s32 i{index}; i < static_cast<s32>(MemoryBlockPageShifts.size()); i++) {
40 if (const VAddr addr = blocks[i].PopBlock(); addr != 0) { 39 if (const VAddr addr{blocks[i].PopBlock()}; addr) {
41 if (const std::size_t allocated_size = blocks[i].GetSize(); 40 if (const std::size_t allocated_size{blocks[i].GetSize()};
42 allocated_size > needed_size) { 41 allocated_size > needed_size) {
43 Free(addr + needed_size, (allocated_size - needed_size) / PageSize); 42 Free(addr + needed_size, (allocated_size - needed_size) / PageSize);
44 } 43 }
@@ -51,7 +50,7 @@ VAddr PageHeap::AllocateBlock(s32 index) {
51 50
52void PageHeap::FreeBlock(VAddr block, s32 index) { 51void PageHeap::FreeBlock(VAddr block, s32 index) {
53 do { 52 do {
54 block = blocks[static_cast<std::size_t>(index++)].PushBlock(block); 53 block = blocks[index++].PushBlock(block);
55 } while (block != 0); 54 } while (block != 0);
56} 55}
57 56
@@ -70,7 +69,7 @@ void PageHeap::Free(VAddr addr, std::size_t num_pages) {
70 VAddr after_start{end}; 69 VAddr after_start{end};
71 VAddr after_end{end}; 70 VAddr after_end{end};
72 while (big_index >= 0) { 71 while (big_index >= 0) {
73 const std::size_t block_size{blocks[static_cast<std::size_t>(big_index)].GetSize()}; 72 const std::size_t block_size{blocks[big_index].GetSize()};
74 const VAddr big_start{Common::AlignUp((start), block_size)}; 73 const VAddr big_start{Common::AlignUp((start), block_size)};
75 const VAddr big_end{Common::AlignDown((end), block_size)}; 74 const VAddr big_end{Common::AlignDown((end), block_size)};
76 if (big_start < big_end) { 75 if (big_start < big_end) {
@@ -88,7 +87,7 @@ void PageHeap::Free(VAddr addr, std::size_t num_pages) {
88 87
89 // Free space before the big blocks 88 // Free space before the big blocks
90 for (s32 i{big_index - 1}; i >= 0; i--) { 89 for (s32 i{big_index - 1}; i >= 0; i--) {
91 const std::size_t block_size{blocks[static_cast<size_t>(i)].GetSize()}; 90 const std::size_t block_size{blocks[i].GetSize()};
92 while (before_start + block_size <= before_end) { 91 while (before_start + block_size <= before_end) {
93 before_end -= block_size; 92 before_end -= block_size;
94 FreeBlock(before_end, i); 93 FreeBlock(before_end, i);
@@ -97,7 +96,7 @@ void PageHeap::Free(VAddr addr, std::size_t num_pages) {
97 96
98 // Free space after the big blocks 97 // Free space after the big blocks
99 for (s32 i{big_index - 1}; i >= 0; i--) { 98 for (s32 i{big_index - 1}; i >= 0; i--) {
100 const std::size_t block_size{blocks[static_cast<size_t>(i)].GetSize()}; 99 const std::size_t block_size{blocks[i].GetSize()};
101 while (after_start + block_size <= after_end) { 100 while (after_start + block_size <= after_end) {
102 FreeBlock(after_start, i); 101 FreeBlock(after_start, i);
103 after_start += block_size; 102 after_start += block_size;
diff --git a/src/core/hle/kernel/memory/page_heap.h b/src/core/hle/kernel/memory/page_heap.h
index 92a2bce04..22b0de860 100644
--- a/src/core/hle/kernel/memory/page_heap.h
+++ b/src/core/hle/kernel/memory/page_heap.h
@@ -34,9 +34,7 @@ public:
34 34
35 static constexpr s32 GetBlockIndex(std::size_t num_pages) { 35 static constexpr s32 GetBlockIndex(std::size_t num_pages) {
36 for (s32 i{static_cast<s32>(NumMemoryBlockPageShifts) - 1}; i >= 0; i--) { 36 for (s32 i{static_cast<s32>(NumMemoryBlockPageShifts) - 1}; i >= 0; i--) {
37 const auto shift_index = static_cast<std::size_t>(i); 37 if (num_pages >= (static_cast<std::size_t>(1) << MemoryBlockPageShifts[i]) / PageSize) {
38 if (num_pages >=
39 (static_cast<std::size_t>(1) << MemoryBlockPageShifts[shift_index]) / PageSize) {
40 return i; 38 return i;
41 } 39 }
42 } 40 }
@@ -88,7 +86,7 @@ private:
88 86
89 // Set the bitmap pointers 87 // Set the bitmap pointers
90 for (s32 depth{GetHighestDepthIndex()}; depth >= 0; depth--) { 88 for (s32 depth{GetHighestDepthIndex()}; depth >= 0; depth--) {
91 bit_storages[static_cast<std::size_t>(depth)] = storage; 89 bit_storages[depth] = storage;
92 size = Common::AlignUp(size, 64) / 64; 90 size = Common::AlignUp(size, 64) / 64;
93 storage += size; 91 storage += size;
94 } 92 }
@@ -101,7 +99,7 @@ private:
101 s32 depth{}; 99 s32 depth{};
102 100
103 do { 101 do {
104 const u64 v{bit_storages[static_cast<std::size_t>(depth)][offset]}; 102 const u64 v{bit_storages[depth][offset]};
105 if (v == 0) { 103 if (v == 0) {
106 // Non-zero depth indicates that a previous level had a free block 104 // Non-zero depth indicates that a previous level had a free block
107 ASSERT(depth == 0); 105 ASSERT(depth == 0);
@@ -127,7 +125,7 @@ private:
127 constexpr bool ClearRange(std::size_t offset, std::size_t count) { 125 constexpr bool ClearRange(std::size_t offset, std::size_t count) {
128 const s32 depth{GetHighestDepthIndex()}; 126 const s32 depth{GetHighestDepthIndex()};
129 const auto bit_ind{offset / 64}; 127 const auto bit_ind{offset / 64};
130 u64* bits{bit_storages[static_cast<std::size_t>(depth)]}; 128 u64* bits{bit_storages[depth]};
131 if (count < 64) { 129 if (count < 64) {
132 const auto shift{offset % 64}; 130 const auto shift{offset % 64};
133 ASSERT(shift + count <= 64); 131 ASSERT(shift + count <= 64);
@@ -179,11 +177,11 @@ private:
179 const auto which{offset % 64}; 177 const auto which{offset % 64};
180 const u64 mask{1ULL << which}; 178 const u64 mask{1ULL << which};
181 179
182 u64* bit{std::addressof(bit_storages[static_cast<std::size_t>(depth)][ind])}; 180 u64* bit{std::addressof(bit_storages[depth][ind])};
183 const u64 v{*bit}; 181 const u64 v{*bit};
184 ASSERT((v & mask) == 0); 182 ASSERT((v & mask) == 0);
185 *bit = v | mask; 183 *bit = v | mask;
186 if (v != 0) { 184 if (v) {
187 break; 185 break;
188 } 186 }
189 offset = ind; 187 offset = ind;
@@ -197,12 +195,12 @@ private:
197 const auto which{offset % 64}; 195 const auto which{offset % 64};
198 const u64 mask{1ULL << which}; 196 const u64 mask{1ULL << which};
199 197
200 u64* bit{std::addressof(bit_storages[static_cast<std::size_t>(depth)][ind])}; 198 u64* bit{std::addressof(bit_storages[depth][ind])};
201 u64 v{*bit}; 199 u64 v{*bit};
202 ASSERT((v & mask) != 0); 200 ASSERT((v & mask) != 0);
203 v &= ~mask; 201 v &= ~mask;
204 *bit = v; 202 *bit = v;
205 if (v != 0) { 203 if (v) {
206 break; 204 break;
207 } 205 }
208 offset = ind; 206 offset = ind;
diff --git a/src/core/hle/kernel/memory/page_table.cpp b/src/core/hle/kernel/memory/page_table.cpp
index 4f759d078..a3fadb533 100644
--- a/src/core/hle/kernel/memory/page_table.cpp
+++ b/src/core/hle/kernel/memory/page_table.cpp
@@ -414,8 +414,7 @@ ResultCode PageTable::MapPhysicalMemory(VAddr addr, std::size_t size) {
414 const std::size_t remaining_pages{remaining_size / PageSize}; 414 const std::size_t remaining_pages{remaining_size / PageSize};
415 415
416 if (process->GetResourceLimit() && 416 if (process->GetResourceLimit() &&
417 !process->GetResourceLimit()->Reserve(ResourceType::PhysicalMemory, 417 !process->GetResourceLimit()->Reserve(ResourceType::PhysicalMemory, remaining_size)) {
418 static_cast<s64>(remaining_size))) {
419 return ERR_RESOURCE_LIMIT_EXCEEDED; 418 return ERR_RESOURCE_LIMIT_EXCEEDED;
420 } 419 }
421 420
@@ -779,8 +778,7 @@ ResultVal<VAddr> PageTable::SetHeapSize(std::size_t size) {
779 778
780 auto process{system.Kernel().CurrentProcess()}; 779 auto process{system.Kernel().CurrentProcess()};
781 if (process->GetResourceLimit() && delta != 0 && 780 if (process->GetResourceLimit() && delta != 0 &&
782 !process->GetResourceLimit()->Reserve(ResourceType::PhysicalMemory, 781 !process->GetResourceLimit()->Reserve(ResourceType::PhysicalMemory, delta)) {
783 static_cast<s64>(delta))) {
784 return ERR_RESOURCE_LIMIT_EXCEEDED; 782 return ERR_RESOURCE_LIMIT_EXCEEDED;
785 } 783 }
786 784
diff --git a/src/core/hle/kernel/physical_core.h b/src/core/hle/kernel/physical_core.h
index 6cb59d0fc..d7a7a951c 100644
--- a/src/core/hle/kernel/physical_core.h
+++ b/src/core/hle/kernel/physical_core.h
@@ -34,7 +34,7 @@ public:
34 PhysicalCore& operator=(const PhysicalCore&) = delete; 34 PhysicalCore& operator=(const PhysicalCore&) = delete;
35 35
36 PhysicalCore(PhysicalCore&&) = default; 36 PhysicalCore(PhysicalCore&&) = default;
37 PhysicalCore& operator=(PhysicalCore&&) = delete; 37 PhysicalCore& operator=(PhysicalCore&&) = default;
38 38
39 void Idle(); 39 void Idle();
40 /// Interrupt this physical core. 40 /// Interrupt this physical core.
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp
index 0b39f2955..ff9d9248b 100644
--- a/src/core/hle/kernel/process.cpp
+++ b/src/core/hle/kernel/process.cpp
@@ -137,10 +137,9 @@ std::shared_ptr<ResourceLimit> Process::GetResourceLimit() const {
137} 137}
138 138
139u64 Process::GetTotalPhysicalMemoryAvailable() const { 139u64 Process::GetTotalPhysicalMemoryAvailable() const {
140 const u64 capacity{ 140 const u64 capacity{resource_limit->GetCurrentResourceValue(ResourceType::PhysicalMemory) +
141 static_cast<u64>(resource_limit->GetCurrentResourceValue(ResourceType::PhysicalMemory)) + 141 page_table->GetTotalHeapSize() + GetSystemResourceSize() + image_size +
142 page_table->GetTotalHeapSize() + GetSystemResourceSize() + image_size + 142 main_thread_stack_size};
143 main_thread_stack_size};
144 143
145 if (capacity < memory_usage_capacity) { 144 if (capacity < memory_usage_capacity) {
146 return capacity; 145 return capacity;
@@ -280,12 +279,12 @@ ResultCode Process::LoadFromMetadata(const FileSys::ProgramMetadata& metadata,
280 // Set initial resource limits 279 // Set initial resource limits
281 resource_limit->SetLimitValue( 280 resource_limit->SetLimitValue(
282 ResourceType::PhysicalMemory, 281 ResourceType::PhysicalMemory,
283 static_cast<s64>(kernel.MemoryManager().GetSize(Memory::MemoryManager::Pool::Application))); 282 kernel.MemoryManager().GetSize(Memory::MemoryManager::Pool::Application));
284 resource_limit->SetLimitValue(ResourceType::Threads, 608); 283 resource_limit->SetLimitValue(ResourceType::Threads, 608);
285 resource_limit->SetLimitValue(ResourceType::Events, 700); 284 resource_limit->SetLimitValue(ResourceType::Events, 700);
286 resource_limit->SetLimitValue(ResourceType::TransferMemory, 128); 285 resource_limit->SetLimitValue(ResourceType::TransferMemory, 128);
287 resource_limit->SetLimitValue(ResourceType::Sessions, 894); 286 resource_limit->SetLimitValue(ResourceType::Sessions, 894);
288 ASSERT(resource_limit->Reserve(ResourceType::PhysicalMemory, static_cast<s64>(code_size))); 287 ASSERT(resource_limit->Reserve(ResourceType::PhysicalMemory, code_size));
289 288
290 // Create TLS region 289 // Create TLS region
291 tls_region_address = CreateTLSRegion(); 290 tls_region_address = CreateTLSRegion();
@@ -301,9 +300,9 @@ void Process::Run(s32 main_thread_priority, u64 stack_size) {
301 300
302 ChangeStatus(ProcessStatus::Running); 301 ChangeStatus(ProcessStatus::Running);
303 302
304 SetupMainThread(system, *this, static_cast<u32>(main_thread_priority), main_thread_stack_top); 303 SetupMainThread(system, *this, main_thread_priority, main_thread_stack_top);
305 resource_limit->Reserve(ResourceType::Threads, 1); 304 resource_limit->Reserve(ResourceType::Threads, 1);
306 resource_limit->Reserve(ResourceType::PhysicalMemory, static_cast<s64>(main_thread_stack_size)); 305 resource_limit->Reserve(ResourceType::PhysicalMemory, main_thread_stack_size);
307} 306}
308 307
309void Process::PrepareForTermination() { 308void Process::PrepareForTermination() {
@@ -364,7 +363,7 @@ VAddr Process::CreateTLSRegion() {
364 ->AllocateAndMapMemory(1, Memory::PageSize, true, start, size / Memory::PageSize, 363 ->AllocateAndMapMemory(1, Memory::PageSize, true, start, size / Memory::PageSize,
365 Memory::MemoryState::ThreadLocal, 364 Memory::MemoryState::ThreadLocal,
366 Memory::MemoryPermission::ReadAndWrite, tls_map_addr) 365 Memory::MemoryPermission::ReadAndWrite, tls_map_addr)
367 .ValueOr(0U)}; 366 .ValueOr(0)};
368 367
369 ASSERT(tls_page_addr); 368 ASSERT(tls_page_addr);
370 369
diff --git a/src/core/hle/kernel/resource_limit.cpp b/src/core/hle/kernel/resource_limit.cpp
index e94093f24..212e442f4 100644
--- a/src/core/hle/kernel/resource_limit.cpp
+++ b/src/core/hle/kernel/resource_limit.cpp
@@ -43,8 +43,8 @@ void ResourceLimit::Release(ResourceType resource, u64 amount) {
43void ResourceLimit::Release(ResourceType resource, u64 used_amount, u64 available_amount) { 43void ResourceLimit::Release(ResourceType resource, u64 used_amount, u64 available_amount) {
44 const std::size_t index{ResourceTypeToIndex(resource)}; 44 const std::size_t index{ResourceTypeToIndex(resource)};
45 45
46 current[index] -= static_cast<s64>(used_amount); 46 current[index] -= used_amount;
47 available[index] -= static_cast<s64>(available_amount); 47 available[index] -= available_amount;
48} 48}
49 49
50std::shared_ptr<ResourceLimit> ResourceLimit::Create(KernelCore& kernel) { 50std::shared_ptr<ResourceLimit> ResourceLimit::Create(KernelCore& kernel) {
diff --git a/src/core/hle/kernel/scheduler.cpp b/src/core/hle/kernel/scheduler.cpp
index 4a9a762f3..6b7db5372 100644
--- a/src/core/hle/kernel/scheduler.cpp
+++ b/src/core/hle/kernel/scheduler.cpp
@@ -89,11 +89,9 @@ u32 GlobalScheduler::SelectThreads() {
89 while (iter != suggested_queue[core_id].end()) { 89 while (iter != suggested_queue[core_id].end()) {
90 suggested = *iter; 90 suggested = *iter;
91 iter++; 91 iter++;
92 const s32 suggested_core_id = suggested->GetProcessorID(); 92 s32 suggested_core_id = suggested->GetProcessorID();
93 Thread* top_thread = suggested_core_id >= 0 93 Thread* top_thread =
94 ? top_threads[static_cast<u32>(suggested_core_id)] 94 suggested_core_id >= 0 ? top_threads[suggested_core_id] : nullptr;
95 : nullptr;
96
97 if (top_thread != suggested) { 95 if (top_thread != suggested) {
98 if (top_thread != nullptr && 96 if (top_thread != nullptr &&
99 top_thread->GetPriority() < THREADPRIO_MAX_CORE_MIGRATION) { 97 top_thread->GetPriority() < THREADPRIO_MAX_CORE_MIGRATION) {
@@ -104,19 +102,16 @@ u32 GlobalScheduler::SelectThreads() {
104 TransferToCore(suggested->GetPriority(), static_cast<s32>(core_id), suggested); 102 TransferToCore(suggested->GetPriority(), static_cast<s32>(core_id), suggested);
105 break; 103 break;
106 } 104 }
107
108 suggested = nullptr; 105 suggested = nullptr;
109 migration_candidates[num_candidates++] = suggested_core_id; 106 migration_candidates[num_candidates++] = suggested_core_id;
110 } 107 }
111
112 // Step 3: Select a suggested thread from another core 108 // Step 3: Select a suggested thread from another core
113 if (suggested == nullptr) { 109 if (suggested == nullptr) {
114 for (std::size_t i = 0; i < num_candidates; i++) { 110 for (std::size_t i = 0; i < num_candidates; i++) {
115 const auto candidate_core = static_cast<u32>(migration_candidates[i]); 111 s32 candidate_core = migration_candidates[i];
116 suggested = top_threads[candidate_core]; 112 suggested = top_threads[candidate_core];
117 auto it = scheduled_queue[candidate_core].begin(); 113 auto it = scheduled_queue[candidate_core].begin();
118 ++it; 114 it++;
119
120 Thread* next = it != scheduled_queue[candidate_core].end() ? *it : nullptr; 115 Thread* next = it != scheduled_queue[candidate_core].end() ? *it : nullptr;
121 if (next != nullptr) { 116 if (next != nullptr) {
122 TransferToCore(suggested->GetPriority(), static_cast<s32>(core_id), 117 TransferToCore(suggested->GetPriority(), static_cast<s32>(core_id),
@@ -133,8 +128,7 @@ u32 GlobalScheduler::SelectThreads() {
133 128
134 idle_cores &= ~(1U << core_id); 129 idle_cores &= ~(1U << core_id);
135 } 130 }
136 131 u32 cores_needing_context_switch{};
137 u32 cores_needing_context_switch = 0;
138 for (u32 core = 0; core < Core::Hardware::NUM_CPU_CORES; core++) { 132 for (u32 core = 0; core < Core::Hardware::NUM_CPU_CORES; core++) {
139 Scheduler& sched = kernel.Scheduler(core); 133 Scheduler& sched = kernel.Scheduler(core);
140 ASSERT(top_threads[core] == nullptr || 134 ASSERT(top_threads[core] == nullptr ||
@@ -192,16 +186,13 @@ bool GlobalScheduler::YieldThreadAndBalanceLoad(Thread* yielding_thread) {
192 for (auto& thread : suggested_queue[core_id]) { 186 for (auto& thread : suggested_queue[core_id]) {
193 const s32 source_core = thread->GetProcessorID(); 187 const s32 source_core = thread->GetProcessorID();
194 if (source_core >= 0) { 188 if (source_core >= 0) {
195 const auto sanitized_source_core = static_cast<u32>(source_core); 189 if (current_threads[source_core] != nullptr) {
196 190 if (thread == current_threads[source_core] ||
197 if (current_threads[sanitized_source_core] != nullptr) { 191 current_threads[source_core]->GetPriority() < min_regular_priority) {
198 if (thread == current_threads[sanitized_source_core] ||
199 current_threads[sanitized_source_core]->GetPriority() < min_regular_priority) {
200 continue; 192 continue;
201 } 193 }
202 } 194 }
203 } 195 }
204
205 if (next_thread->GetLastRunningTicks() >= thread->GetLastRunningTicks() || 196 if (next_thread->GetLastRunningTicks() >= thread->GetLastRunningTicks() ||
206 next_thread->GetPriority() < thread->GetPriority()) { 197 next_thread->GetPriority() < thread->GetPriority()) {
207 if (thread->GetPriority() <= priority) { 198 if (thread->GetPriority() <= priority) {
@@ -249,25 +240,17 @@ bool GlobalScheduler::YieldThreadAndWaitForLoadBalancing(Thread* yielding_thread
249 for (std::size_t i = 0; i < current_threads.size(); i++) { 240 for (std::size_t i = 0; i < current_threads.size(); i++) {
250 current_threads[i] = scheduled_queue[i].empty() ? nullptr : scheduled_queue[i].front(); 241 current_threads[i] = scheduled_queue[i].empty() ? nullptr : scheduled_queue[i].front();
251 } 242 }
252
253 for (auto& thread : suggested_queue[core_id]) { 243 for (auto& thread : suggested_queue[core_id]) {
254 const s32 source_core = thread->GetProcessorID(); 244 const s32 source_core = thread->GetProcessorID();
255 if (source_core < 0) { 245 if (source_core < 0 || thread == current_threads[source_core]) {
256 continue;
257 }
258
259 const auto sanitized_source_core = static_cast<u32>(source_core);
260 if (thread == current_threads[sanitized_source_core]) {
261 continue; 246 continue;
262 } 247 }
263 248 if (current_threads[source_core] == nullptr ||
264 if (current_threads[sanitized_source_core] == nullptr || 249 current_threads[source_core]->GetPriority() >= min_regular_priority) {
265 current_threads[sanitized_source_core]->GetPriority() >= min_regular_priority) {
266 winner = thread; 250 winner = thread;
267 } 251 }
268 break; 252 break;
269 } 253 }
270
271 if (winner != nullptr) { 254 if (winner != nullptr) {
272 if (winner != yielding_thread) { 255 if (winner != yielding_thread) {
273 TransferToCore(winner->GetPriority(), static_cast<s32>(core_id), winner); 256 TransferToCore(winner->GetPriority(), static_cast<s32>(core_id), winner);
@@ -309,22 +292,17 @@ void GlobalScheduler::PreemptThreads() {
309 if (thread->GetPriority() != priority) { 292 if (thread->GetPriority() != priority) {
310 continue; 293 continue;
311 } 294 }
312
313 if (source_core >= 0) { 295 if (source_core >= 0) {
314 const auto sanitized_source_core = static_cast<u32>(source_core); 296 Thread* next_thread = scheduled_queue[source_core].empty()
315 Thread* next_thread = scheduled_queue[sanitized_source_core].empty()
316 ? nullptr 297 ? nullptr
317 : scheduled_queue[sanitized_source_core].front(); 298 : scheduled_queue[source_core].front();
318
319 if (next_thread != nullptr && next_thread->GetPriority() < 2) { 299 if (next_thread != nullptr && next_thread->GetPriority() < 2) {
320 break; 300 break;
321 } 301 }
322
323 if (next_thread == thread) { 302 if (next_thread == thread) {
324 continue; 303 continue;
325 } 304 }
326 } 305 }
327
328 if (current_thread != nullptr && 306 if (current_thread != nullptr &&
329 current_thread->GetLastRunningTicks() >= thread->GetLastRunningTicks()) { 307 current_thread->GetLastRunningTicks() >= thread->GetLastRunningTicks()) {
330 winner = thread; 308 winner = thread;
@@ -344,22 +322,17 @@ void GlobalScheduler::PreemptThreads() {
344 if (thread->GetPriority() < priority) { 322 if (thread->GetPriority() < priority) {
345 continue; 323 continue;
346 } 324 }
347
348 if (source_core >= 0) { 325 if (source_core >= 0) {
349 const auto sanitized_source_core = static_cast<u32>(source_core); 326 Thread* next_thread = scheduled_queue[source_core].empty()
350 Thread* next_thread = scheduled_queue[sanitized_source_core].empty()
351 ? nullptr 327 ? nullptr
352 : scheduled_queue[sanitized_source_core].front(); 328 : scheduled_queue[source_core].front();
353
354 if (next_thread != nullptr && next_thread->GetPriority() < 2) { 329 if (next_thread != nullptr && next_thread->GetPriority() < 2) {
355 break; 330 break;
356 } 331 }
357
358 if (next_thread == thread) { 332 if (next_thread == thread) {
359 continue; 333 continue;
360 } 334 }
361 } 335 }
362
363 if (current_thread != nullptr && 336 if (current_thread != nullptr &&
364 current_thread->GetLastRunningTicks() >= thread->GetLastRunningTicks()) { 337 current_thread->GetLastRunningTicks() >= thread->GetLastRunningTicks()) {
365 winner = thread; 338 winner = thread;
@@ -379,11 +352,11 @@ void GlobalScheduler::PreemptThreads() {
379 352
380void GlobalScheduler::EnableInterruptAndSchedule(u32 cores_pending_reschedule, 353void GlobalScheduler::EnableInterruptAndSchedule(u32 cores_pending_reschedule,
381 Core::EmuThreadHandle global_thread) { 354 Core::EmuThreadHandle global_thread) {
382 const u32 current_core = global_thread.host_handle; 355 u32 current_core = global_thread.host_handle;
383 bool must_context_switch = global_thread.guest_handle != InvalidHandle && 356 bool must_context_switch = global_thread.guest_handle != InvalidHandle &&
384 (current_core < Core::Hardware::NUM_CPU_CORES); 357 (current_core < Core::Hardware::NUM_CPU_CORES);
385 while (cores_pending_reschedule != 0) { 358 while (cores_pending_reschedule != 0) {
386 const u32 core = Common::CountTrailingZeroes32(cores_pending_reschedule); 359 u32 core = Common::CountTrailingZeroes32(cores_pending_reschedule);
387 ASSERT(core < Core::Hardware::NUM_CPU_CORES); 360 ASSERT(core < Core::Hardware::NUM_CPU_CORES);
388 if (!must_context_switch || core != current_core) { 361 if (!must_context_switch || core != current_core) {
389 auto& phys_core = kernel.PhysicalCore(core); 362 auto& phys_core = kernel.PhysicalCore(core);
@@ -393,7 +366,6 @@ void GlobalScheduler::EnableInterruptAndSchedule(u32 cores_pending_reschedule,
393 } 366 }
394 cores_pending_reschedule &= ~(1U << core); 367 cores_pending_reschedule &= ~(1U << core);
395 } 368 }
396
397 if (must_context_switch) { 369 if (must_context_switch) {
398 auto& core_scheduler = kernel.CurrentScheduler(); 370 auto& core_scheduler = kernel.CurrentScheduler();
399 kernel.ExitSVCProfile(); 371 kernel.ExitSVCProfile();
@@ -831,11 +803,9 @@ void Scheduler::Initialize() {
831 std::string name = "Idle Thread Id:" + std::to_string(core_id); 803 std::string name = "Idle Thread Id:" + std::to_string(core_id);
832 std::function<void(void*)> init_func = Core::CpuManager::GetIdleThreadStartFunc(); 804 std::function<void(void*)> init_func = Core::CpuManager::GetIdleThreadStartFunc();
833 void* init_func_parameter = system.GetCpuManager().GetStartFuncParamater(); 805 void* init_func_parameter = system.GetCpuManager().GetStartFuncParamater();
834 const auto type = static_cast<ThreadType>(THREADTYPE_KERNEL | THREADTYPE_HLE | THREADTYPE_IDLE); 806 ThreadType type = static_cast<ThreadType>(THREADTYPE_KERNEL | THREADTYPE_HLE | THREADTYPE_IDLE);
835 auto thread_res = 807 auto thread_res = Thread::Create(system, type, name, 0, 64, 0, static_cast<u32>(core_id), 0,
836 Thread::Create(system, type, std::move(name), 0, 64, 0, static_cast<s32>(core_id), 0, 808 nullptr, std::move(init_func), init_func_parameter);
837 nullptr, std::move(init_func), init_func_parameter);
838
839 idle_thread = std::move(thread_res).Unwrap(); 809 idle_thread = std::move(thread_res).Unwrap();
840} 810}
841 811
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index b8623e831..bafd1ced7 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -482,8 +482,7 @@ static ResultCode WaitSynchronization(Core::System& system, Handle* index, VAddr
482static ResultCode WaitSynchronization32(Core::System& system, u32 timeout_low, u32 handles_address, 482static ResultCode WaitSynchronization32(Core::System& system, u32 timeout_low, u32 handles_address,
483 s32 handle_count, u32 timeout_high, Handle* index) { 483 s32 handle_count, u32 timeout_high, Handle* index) {
484 const s64 nano_seconds{(static_cast<s64>(timeout_high) << 32) | static_cast<s64>(timeout_low)}; 484 const s64 nano_seconds{(static_cast<s64>(timeout_high) << 32) | static_cast<s64>(timeout_low)};
485 return WaitSynchronization(system, index, handles_address, static_cast<u32>(handle_count), 485 return WaitSynchronization(system, index, handles_address, handle_count, nano_seconds);
486 nano_seconds);
487} 486}
488 487
489/// Resumes a thread waiting on WaitSynchronization 488/// Resumes a thread waiting on WaitSynchronization
@@ -2003,7 +2002,7 @@ static ResultCode GetThreadCoreMask(Core::System& system, Handle thread_handle,
2003 return ERR_INVALID_HANDLE; 2002 return ERR_INVALID_HANDLE;
2004 } 2003 }
2005 2004
2006 *core = static_cast<u32>(thread->GetIdealCore()); 2005 *core = thread->GetIdealCore();
2007 *mask = thread->GetAffinityMask(); 2006 *mask = thread->GetAffinityMask();
2008 2007
2009 return RESULT_SUCCESS; 2008 return RESULT_SUCCESS;
@@ -2071,7 +2070,7 @@ static ResultCode SetThreadCoreMask(Core::System& system, Handle thread_handle,
2071 return ERR_INVALID_HANDLE; 2070 return ERR_INVALID_HANDLE;
2072 } 2071 }
2073 2072
2074 return thread->SetCoreAndAffinityMask(static_cast<s32>(core), affinity_mask); 2073 return thread->SetCoreAndAffinityMask(core, affinity_mask);
2075} 2074}
2076 2075
2077static ResultCode SetThreadCoreMask32(Core::System& system, Handle thread_handle, u32 core, 2076static ResultCode SetThreadCoreMask32(Core::System& system, Handle thread_handle, u32 core,
diff --git a/src/core/hle/kernel/svc_wrap.h b/src/core/hle/kernel/svc_wrap.h
index 9284a4c84..0b6dd9df0 100644
--- a/src/core/hle/kernel/svc_wrap.h
+++ b/src/core/hle/kernel/svc_wrap.h
@@ -11,11 +11,11 @@
11 11
12namespace Kernel { 12namespace Kernel {
13 13
14static inline u64 Param(const Core::System& system, std::size_t n) { 14static inline u64 Param(const Core::System& system, int n) {
15 return system.CurrentArmInterface().GetReg(n); 15 return system.CurrentArmInterface().GetReg(n);
16} 16}
17 17
18static inline u32 Param32(const Core::System& system, std::size_t n) { 18static inline u32 Param32(const Core::System& system, int n) {
19 return static_cast<u32>(system.CurrentArmInterface().GetReg(n)); 19 return static_cast<u32>(system.CurrentArmInterface().GetReg(n));
20} 20}
21 21
@@ -29,7 +29,7 @@ static inline void FuncReturn(Core::System& system, u64 result) {
29} 29}
30 30
31static inline void FuncReturn32(Core::System& system, u32 result) { 31static inline void FuncReturn32(Core::System& system, u32 result) {
32 system.CurrentArmInterface().SetReg(0, static_cast<u64>(result)); 32 system.CurrentArmInterface().SetReg(0, (u64)result);
33} 33}
34 34
35//////////////////////////////////////////////////////////////////////////////////////////////////// 35////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -386,10 +386,9 @@ template <ResultCode func(Core::System&, Handle*, u32, u32, u32, u32, s32)>
386void SvcWrap32(Core::System& system) { 386void SvcWrap32(Core::System& system) {
387 Handle param_1 = 0; 387 Handle param_1 = 0;
388 388
389 const u32 retval = 389 const u32 retval = func(system, &param_1, Param32(system, 0), Param32(system, 1),
390 func(system, &param_1, Param32(system, 0), Param32(system, 1), Param32(system, 2), 390 Param32(system, 2), Param32(system, 3), Param32(system, 4))
391 Param32(system, 3), static_cast<s32>(Param32(system, 4))) 391 .raw;
392 .raw;
393 392
394 system.CurrentArmInterface().SetReg(1, param_1); 393 system.CurrentArmInterface().SetReg(1, param_1);
395 FuncReturn(system, retval); 394 FuncReturn(system, retval);
@@ -543,8 +542,8 @@ void SvcWrap32(Core::System& system) {
543template <ResultCode func(Core::System&, u32, u32, s32, u32, Handle*)> 542template <ResultCode func(Core::System&, u32, u32, s32, u32, Handle*)>
544void SvcWrap32(Core::System& system) { 543void SvcWrap32(Core::System& system) {
545 u32 param_1 = 0; 544 u32 param_1 = 0;
546 const u32 retval = func(system, Param32(system, 0), Param32(system, 1), 545 const u32 retval = func(system, Param32(system, 0), Param32(system, 1), Param32(system, 2),
547 static_cast<s32>(Param32(system, 2)), Param32(system, 3), &param_1) 546 Param32(system, 3), &param_1)
548 .raw; 547 .raw;
549 system.CurrentArmInterface().SetReg(1, param_1); 548 system.CurrentArmInterface().SetReg(1, param_1);
550 FuncReturn(system, retval); 549 FuncReturn(system, retval);
diff --git a/src/core/hle/kernel/synchronization.cpp b/src/core/hle/kernel/synchronization.cpp
index 653f722b3..8b875d853 100644
--- a/src/core/hle/kernel/synchronization.cpp
+++ b/src/core/hle/kernel/synchronization.cpp
@@ -51,7 +51,7 @@ std::pair<ResultCode, Handle> Synchronization::WaitFor(
51 // We found a ready object, acquire it and set the result value 51 // We found a ready object, acquire it and set the result value
52 SynchronizationObject* object = itr->get(); 52 SynchronizationObject* object = itr->get();
53 object->Acquire(thread); 53 object->Acquire(thread);
54 const auto index = static_cast<u32>(std::distance(sync_objects.begin(), itr)); 54 const u32 index = static_cast<s32>(std::distance(sync_objects.begin(), itr));
55 lock.CancelSleep(); 55 lock.CancelSleep();
56 return {RESULT_SUCCESS, index}; 56 return {RESULT_SUCCESS, index};
57 } 57 }
@@ -105,7 +105,7 @@ std::pair<ResultCode, Handle> Synchronization::WaitFor(
105 }); 105 });
106 ASSERT(itr != sync_objects.end()); 106 ASSERT(itr != sync_objects.end());
107 signaling_object->Acquire(thread); 107 signaling_object->Acquire(thread);
108 const auto index = static_cast<u32>(std::distance(sync_objects.begin(), itr)); 108 const u32 index = static_cast<s32>(std::distance(sync_objects.begin(), itr));
109 return {signaling_result, index}; 109 return {signaling_result, index};
110 } 110 }
111 return {signaling_result, -1}; 111 return {signaling_result, -1};
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp
index 323e740e9..d132aba34 100644
--- a/src/core/hle/kernel/thread.cpp
+++ b/src/core/hle/kernel/thread.cpp
@@ -525,7 +525,7 @@ ResultCode Thread::SetCoreAndAffinityMask(s32 new_core, u64 new_affinity_mask) {
525 if (old_affinity_mask != new_affinity_mask) { 525 if (old_affinity_mask != new_affinity_mask) {
526 const s32 old_core = processor_id; 526 const s32 old_core = processor_id;
527 if (processor_id >= 0 && ((affinity_mask >> processor_id) & 1) == 0) { 527 if (processor_id >= 0 && ((affinity_mask >> processor_id) & 1) == 0) {
528 if (ideal_core < 0) { 528 if (static_cast<s32>(ideal_core) < 0) {
529 processor_id = HighestSetCore(affinity_mask, Core::Hardware::NUM_CPU_CORES); 529 processor_id = HighestSetCore(affinity_mask, Core::Hardware::NUM_CPU_CORES);
530 } else { 530 } else {
531 processor_id = ideal_core; 531 processor_id = ideal_core;
diff --git a/src/core/hle/kernel/thread.h b/src/core/hle/kernel/thread.h
index 21b22ca45..8daf79fac 100644
--- a/src/core/hle/kernel/thread.h
+++ b/src/core/hle/kernel/thread.h
@@ -470,7 +470,7 @@ public:
470 470
471 bool InvokeHLECallback(std::shared_ptr<Thread> thread); 471 bool InvokeHLECallback(std::shared_ptr<Thread> thread);
472 472
473 s32 GetIdealCore() const { 473 u32 GetIdealCore() const {
474 return ideal_core; 474 return ideal_core;
475 } 475 }
476 476
@@ -654,8 +654,8 @@ private:
654 654
655 Scheduler* scheduler = nullptr; 655 Scheduler* scheduler = nullptr;
656 656
657 s32 ideal_core = -1; 657 u32 ideal_core{0xFFFFFFFF};
658 u64 affinity_mask = 1; 658 u64 affinity_mask{0x1};
659 659
660 s32 ideal_core_override = -1; 660 s32 ideal_core_override = -1;
661 u64 affinity_mask_override = 0x1; 661 u64 affinity_mask_override = 0x1;
diff --git a/src/core/hle/service/acc/profile_manager.cpp b/src/core/hle/service/acc/profile_manager.cpp
index 9c302043a..9b829e957 100644
--- a/src/core/hle/service/acc/profile_manager.cpp
+++ b/src/core/hle/service/acc/profile_manager.cpp
@@ -41,15 +41,12 @@ constexpr char ACC_SAVE_AVATORS_BASE_PATH[] = "/system/save/8000000000000010/su/
41ProfileManager::ProfileManager() { 41ProfileManager::ProfileManager() {
42 ParseUserSaveFile(); 42 ParseUserSaveFile();
43 43
44 if (user_count == 0) { 44 if (user_count == 0)
45 CreateNewUser(UUID::Generate(), "yuzu"); 45 CreateNewUser(UUID::Generate(), "yuzu");
46 }
47 46
48 auto current = static_cast<size_t>( 47 auto current = std::clamp<int>(Settings::values.current_user, 0, MAX_USERS - 1);
49 std::clamp(Settings::values.current_user, 0, static_cast<s32>(MAX_USERS - 1))); 48 if (UserExistsIndex(current))
50 if (UserExistsIndex(current)) {
51 current = 0; 49 current = 0;
52 }
53 50
54 OpenUser(*GetUser(current)); 51 OpenUser(*GetUser(current));
55} 52}
@@ -192,8 +189,8 @@ std::size_t ProfileManager::GetUserCount() const {
192/// booting 189/// booting
193 190
194std::size_t ProfileManager::GetOpenUserCount() const { 191std::size_t ProfileManager::GetOpenUserCount() const {
195 return static_cast<std::size_t>(std::count_if(profiles.begin(), profiles.end(), 192 return std::count_if(profiles.begin(), profiles.end(),
196 [](const ProfileInfo& p) { return p.is_open; })); 193 [](const ProfileInfo& p) { return p.is_open; });
197} 194}
198 195
199/// Checks if a user id exists in our profile manager 196/// Checks if a user id exists in our profile manager
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp
index 995b7e5c6..d7a81f64a 100644
--- a/src/core/hle/service/am/am.cpp
+++ b/src/core/hle/service/am/am.cpp
@@ -1311,7 +1311,7 @@ void IApplicationFunctions::PopLaunchParameter(Kernel::HLERequestContext& ctx) {
1311 params.is_account_selected = 1; 1311 params.is_account_selected = 1;
1312 1312
1313 Account::ProfileManager profile_manager{}; 1313 Account::ProfileManager profile_manager{};
1314 const auto uuid = profile_manager.GetUser(static_cast<u32>(Settings::values.current_user)); 1314 const auto uuid = profile_manager.GetUser(Settings::values.current_user);
1315 ASSERT(uuid); 1315 ASSERT(uuid);
1316 params.current_user = uuid->uuid; 1316 params.current_user = uuid->uuid;
1317 1317
diff --git a/src/core/hle/service/am/applets/controller.cpp b/src/core/hle/service/am/applets/controller.cpp
index 17788d7a5..2151da783 100644
--- a/src/core/hle/service/am/applets/controller.cpp
+++ b/src/core/hle/service/am/applets/controller.cpp
@@ -178,23 +178,23 @@ void Controller::Execute() {
178} 178}
179 179
180void Controller::ConfigurationComplete() { 180void Controller::ConfigurationComplete() {
181 const auto& players = Settings::values.players; 181 ControllerSupportResultInfo result_info{};
182
183 const s8 player_count =
184 is_single_mode
185 ? 1
186 : static_cast<s8>(std::count_if(players.begin(), players.end() - 2,
187 [](const auto& player) { return player.connected; }));
188 182
189 const auto index = static_cast<u32>(std::distance( 183 const auto& players = Settings::values.players;
190 players.begin(), std::find_if(players.begin(), players.end(),
191 [](const auto& player) { return player.connected; })));
192 184
193 // If enable_single_mode is enabled, player_count is 1 regardless of any other parameters. 185 // If enable_single_mode is enabled, player_count is 1 regardless of any other parameters.
194 // Otherwise, only count connected players from P1-P8. 186 // Otherwise, only count connected players from P1-P8.
195 ControllerSupportResultInfo result_info{}; 187 result_info.player_count =
196 result_info.player_count = player_count; 188 is_single_mode ? 1
197 result_info.selected_id = HID::Controller_NPad::IndexToNPad(index); 189 : static_cast<s8>(std::count_if(
190 players.begin(), players.end() - 2,
191 [](Settings::PlayerInput player) { return player.connected; }));
192
193 result_info.selected_id = HID::Controller_NPad::IndexToNPad(
194 std::distance(players.begin(),
195 std::find_if(players.begin(), players.end(),
196 [](Settings::PlayerInput player) { return player.connected; })));
197
198 result_info.result = 0; 198 result_info.result = 0;
199 199
200 LOG_DEBUG(Service_HID, "Result Info: player_count={}, selected_id={}, result={}", 200 LOG_DEBUG(Service_HID, "Result Info: player_count={}, selected_id={}, result={}",
diff --git a/src/core/hle/service/audio/audout_u.cpp b/src/core/hle/service/audio/audout_u.cpp
index a345a68e6..9b4910e53 100644
--- a/src/core/hle/service/audio/audout_u.cpp
+++ b/src/core/hle/service/audio/audout_u.cpp
@@ -69,10 +69,9 @@ public:
69 buffer_event = 69 buffer_event =
70 Kernel::WritableEvent::CreateEventPair(system.Kernel(), "IAudioOutBufferReleased"); 70 Kernel::WritableEvent::CreateEventPair(system.Kernel(), "IAudioOutBufferReleased");
71 71
72 stream = 72 stream = audio_core.OpenStream(system.CoreTiming(), audio_params.sample_rate,
73 audio_core.OpenStream(system.CoreTiming(), static_cast<u32>(audio_params.sample_rate), 73 audio_params.channel_count, std::move(unique_name),
74 audio_params.channel_count, std::move(unique_name), 74 [this] { buffer_event.writable->Signal(); });
75 [this] { buffer_event.writable->Signal(); });
76 } 75 }
77 76
78private: 77private:
diff --git a/src/core/hle/service/audio/hwopus.cpp b/src/core/hle/service/audio/hwopus.cpp
index 16a6deb7e..f1d81602c 100644
--- a/src/core/hle/service/audio/hwopus.cpp
+++ b/src/core/hle/service/audio/hwopus.cpp
@@ -50,8 +50,8 @@ public:
50 Enabled, 50 Enabled,
51 }; 51 };
52 52
53 explicit OpusDecoderState(OpusDecoderPtr decoder_, s32 sample_rate_, u32 channel_count_) 53 explicit OpusDecoderState(OpusDecoderPtr decoder, u32 sample_rate, u32 channel_count)
54 : decoder{std::move(decoder_)}, sample_rate{sample_rate_}, channel_count{channel_count_} {} 54 : decoder{std::move(decoder)}, sample_rate{sample_rate}, channel_count{channel_count} {}
55 55
56 // Decodes interleaved Opus packets. Optionally allows reporting time taken to 56 // Decodes interleaved Opus packets. Optionally allows reporting time taken to
57 // perform the decoding, as well as any relevant extra behavior. 57 // perform the decoding, as well as any relevant extra behavior.
@@ -113,16 +113,15 @@ private:
113 return false; 113 return false;
114 } 114 }
115 115
116 const auto* const frame = input.data() + sizeof(OpusPacketHeader); 116 const auto frame = input.data() + sizeof(OpusPacketHeader);
117 const auto decoded_sample_count = opus_packet_get_nb_samples( 117 const auto decoded_sample_count = opus_packet_get_nb_samples(
118 frame, static_cast<opus_int32>(input.size() - sizeof(OpusPacketHeader)), sample_rate); 118 frame, static_cast<opus_int32>(input.size() - sizeof(OpusPacketHeader)),
119 const auto decoded_size = 119 static_cast<opus_int32>(sample_rate));
120 static_cast<u32>(decoded_sample_count) * channel_count * sizeof(u16); 120 if (decoded_sample_count * channel_count * sizeof(u16) > raw_output_sz) {
121 if (decoded_size > raw_output_sz) {
122 LOG_ERROR( 121 LOG_ERROR(
123 Audio, 122 Audio,
124 "Decoded data does not fit into the output data, decoded_sz={}, raw_output_sz={}", 123 "Decoded data does not fit into the output data, decoded_sz={}, raw_output_sz={}",
125 decoded_size, raw_output_sz); 124 decoded_sample_count * channel_count * sizeof(u16), raw_output_sz);
126 return false; 125 return false;
127 } 126 }
128 127
@@ -138,11 +137,11 @@ private:
138 } 137 }
139 138
140 const auto end_time = std::chrono::high_resolution_clock::now() - start_time; 139 const auto end_time = std::chrono::high_resolution_clock::now() - start_time;
141 sample_count = static_cast<u32>(out_sample_count); 140 sample_count = out_sample_count;
142 consumed = static_cast<u32>(sizeof(OpusPacketHeader) + hdr.size); 141 consumed = static_cast<u32>(sizeof(OpusPacketHeader) + hdr.size);
143 if (out_performance_time != nullptr) { 142 if (out_performance_time != nullptr) {
144 *out_performance_time = static_cast<u64>( 143 *out_performance_time =
145 std::chrono::duration_cast<std::chrono::milliseconds>(end_time).count()); 144 std::chrono::duration_cast<std::chrono::milliseconds>(end_time).count();
146 } 145 }
147 146
148 return true; 147 return true;
@@ -155,7 +154,7 @@ private:
155 } 154 }
156 155
157 OpusDecoderPtr decoder; 156 OpusDecoderPtr decoder;
158 s32 sample_rate; 157 u32 sample_rate;
159 u32 channel_count; 158 u32 channel_count;
160}; 159};
161 160
@@ -213,7 +212,7 @@ std::size_t WorkerBufferSize(u32 channel_count) {
213 ASSERT_MSG(channel_count == 1 || channel_count == 2, "Invalid channel count"); 212 ASSERT_MSG(channel_count == 1 || channel_count == 2, "Invalid channel count");
214 constexpr int num_streams = 1; 213 constexpr int num_streams = 1;
215 const int num_stereo_streams = channel_count == 2 ? 1 : 0; 214 const int num_stereo_streams = channel_count == 2 ? 1 : 0;
216 return static_cast<size_t>(opus_multistream_decoder_get_size(num_streams, num_stereo_streams)); 215 return opus_multistream_decoder_get_size(num_streams, num_stereo_streams);
217} 216}
218 217
219// Creates the mapping table that maps the input channels to the particular 218// Creates the mapping table that maps the input channels to the particular
@@ -245,7 +244,7 @@ void HwOpus::GetWorkBufferSize(Kernel::HLERequestContext& ctx) {
245 "Invalid sample rate"); 244 "Invalid sample rate");
246 ASSERT_MSG(channel_count == 1 || channel_count == 2, "Invalid channel count"); 245 ASSERT_MSG(channel_count == 1 || channel_count == 2, "Invalid channel count");
247 246
248 const auto worker_buffer_sz = static_cast<u32>(WorkerBufferSize(channel_count)); 247 const u32 worker_buffer_sz = static_cast<u32>(WorkerBufferSize(channel_count));
249 LOG_DEBUG(Audio, "worker_buffer_sz={}", worker_buffer_sz); 248 LOG_DEBUG(Audio, "worker_buffer_sz={}", worker_buffer_sz);
250 249
251 IPC::ResponseBuilder rb{ctx, 3}; 250 IPC::ResponseBuilder rb{ctx, 3};
@@ -255,7 +254,7 @@ void HwOpus::GetWorkBufferSize(Kernel::HLERequestContext& ctx) {
255 254
256void HwOpus::OpenOpusDecoder(Kernel::HLERequestContext& ctx) { 255void HwOpus::OpenOpusDecoder(Kernel::HLERequestContext& ctx) {
257 IPC::RequestParser rp{ctx}; 256 IPC::RequestParser rp{ctx};
258 const auto sample_rate = rp.Pop<s32>(); 257 const auto sample_rate = rp.Pop<u32>();
259 const auto channel_count = rp.Pop<u32>(); 258 const auto channel_count = rp.Pop<u32>();
260 const auto buffer_sz = rp.Pop<u32>(); 259 const auto buffer_sz = rp.Pop<u32>();
261 260
diff --git a/src/core/hle/service/bcat/backend/backend.h b/src/core/hle/service/bcat/backend/backend.h
index 1e5e93290..48bbbe66f 100644
--- a/src/core/hle/service/bcat/backend/backend.h
+++ b/src/core/hle/service/bcat/backend/backend.h
@@ -53,10 +53,10 @@ struct DeliveryCacheProgressImpl {
53 ResultCode result = RESULT_SUCCESS; 53 ResultCode result = RESULT_SUCCESS;
54 DirectoryName current_directory; 54 DirectoryName current_directory;
55 FileName current_file; 55 FileName current_file;
56 u64 current_downloaded_bytes; ///< Bytes downloaded on current file. 56 s64 current_downloaded_bytes; ///< Bytes downloaded on current file.
57 u64 current_total_bytes; ///< Bytes total on current file. 57 s64 current_total_bytes; ///< Bytes total on current file.
58 u64 total_downloaded_bytes; ///< Bytes downloaded on overall download. 58 s64 total_downloaded_bytes; ///< Bytes downloaded on overall download.
59 u64 total_bytes; ///< Bytes total on overall download. 59 s64 total_bytes; ///< Bytes total on overall download.
60 INSERT_PADDING_BYTES( 60 INSERT_PADDING_BYTES(
61 0x198); ///< Appears to be unused in official code, possibly reserved for future use. 61 0x198); ///< Appears to be unused in official code, possibly reserved for future use.
62}; 62};
diff --git a/src/core/hle/service/bcat/backend/boxcat.cpp b/src/core/hle/service/bcat/backend/boxcat.cpp
index e6cadf491..3b6f7498e 100644
--- a/src/core/hle/service/bcat/backend/boxcat.cpp
+++ b/src/core/hle/service/bcat/backend/boxcat.cpp
@@ -3,16 +3,7 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include <fmt/ostream.h> 5#include <fmt/ostream.h>
6
7#if defined(__GNUC__)
8#pragma GCC diagnostic push
9#pragma GCC diagnostic ignored "-Wsign-conversion"
10#endif
11#include <httplib.h> 6#include <httplib.h>
12#if defined(__GNUC__)
13#pragma GCC diagnostic pop
14#endif
15
16#include <mbedtls/sha256.h> 7#include <mbedtls/sha256.h>
17#include <nlohmann/json.hpp> 8#include <nlohmann/json.hpp>
18#include "common/hex_util.h" 9#include "common/hex_util.h"
diff --git a/src/core/hle/service/bcat/module.cpp b/src/core/hle/service/bcat/module.cpp
index 5a7e9f930..db0e06ca1 100644
--- a/src/core/hle/service/bcat/module.cpp
+++ b/src/core/hle/service/bcat/module.cpp
@@ -454,8 +454,7 @@ private:
454 write_size = std::min<u64>(write_size, files.size()); 454 write_size = std::min<u64>(write_size, files.size());
455 std::vector<DeliveryCacheDirectoryEntry> entries(write_size); 455 std::vector<DeliveryCacheDirectoryEntry> entries(write_size);
456 std::transform( 456 std::transform(
457 files.begin(), files.begin() + static_cast<s64>(write_size), entries.begin(), 457 files.begin(), files.begin() + write_size, entries.begin(), [](const auto& file) {
458 [](const auto& file) {
459 FileName name{}; 458 FileName name{};
460 std::memcpy(name.data(), file->GetName().data(), 459 std::memcpy(name.data(), file->GetName().data(),
461 std::min(file->GetName().size(), name.size())); 460 std::min(file->GetName().size(), name.size()));
diff --git a/src/core/hle/service/filesystem/fsp_srv.cpp b/src/core/hle/service/filesystem/fsp_srv.cpp
index 993686f1d..649128be4 100644
--- a/src/core/hle/service/filesystem/fsp_srv.cpp
+++ b/src/core/hle/service/filesystem/fsp_srv.cpp
@@ -94,8 +94,7 @@ private:
94 } 94 }
95 95
96 // Read the data from the Storage backend 96 // Read the data from the Storage backend
97 const auto output = backend->ReadBytes(static_cast<u64>(length), static_cast<u64>(offset)); 97 std::vector<u8> output = backend->ReadBytes(length, offset);
98
99 // Write the data to memory 98 // Write the data to memory
100 ctx.WriteBuffer(output); 99 ctx.WriteBuffer(output);
101 100
@@ -152,7 +151,7 @@ private:
152 } 151 }
153 152
154 // Read the data from the Storage backend 153 // Read the data from the Storage backend
155 const auto output = backend->ReadBytes(static_cast<u64>(length), static_cast<u64>(offset)); 154 std::vector<u8> output = backend->ReadBytes(length, offset);
156 155
157 // Write the data to memory 156 // Write the data to memory
158 ctx.WriteBuffer(output); 157 ctx.WriteBuffer(output);
@@ -195,8 +194,7 @@ private:
195 // Write the data to the Storage backend 194 // Write the data to the Storage backend
196 const auto write_size = 195 const auto write_size =
197 static_cast<std::size_t>(std::distance(data.begin(), data.begin() + length)); 196 static_cast<std::size_t>(std::distance(data.begin(), data.begin() + length));
198 const std::size_t written = 197 const std::size_t written = backend->Write(data.data(), write_size, offset);
199 backend->Write(data.data(), write_size, static_cast<u64>(offset));
200 198
201 ASSERT_MSG(static_cast<s64>(written) == length, 199 ASSERT_MSG(static_cast<s64>(written) == length,
202 "Could not write all bytes to file (requested={:016X}, actual={:016X}).", length, 200 "Could not write all bytes to file (requested={:016X}, actual={:016X}).", length,
diff --git a/src/core/hle/service/hid/controllers/debug_pad.cpp b/src/core/hle/service/hid/controllers/debug_pad.cpp
index c2c1470a5..ad251ed4a 100644
--- a/src/core/hle/service/hid/controllers/debug_pad.cpp
+++ b/src/core/hle/service/hid/controllers/debug_pad.cpp
@@ -23,7 +23,7 @@ void Controller_DebugPad::OnRelease() {}
23 23
24void Controller_DebugPad::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, 24void Controller_DebugPad::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data,
25 std::size_t size) { 25 std::size_t size) {
26 shared_memory.header.timestamp = static_cast<s64>(core_timing.GetCPUTicks()); 26 shared_memory.header.timestamp = core_timing.GetCPUTicks();
27 shared_memory.header.total_entry_count = 17; 27 shared_memory.header.total_entry_count = 17;
28 28
29 if (!IsControllerActivated()) { 29 if (!IsControllerActivated()) {
@@ -33,11 +33,9 @@ void Controller_DebugPad::OnUpdate(const Core::Timing::CoreTiming& core_timing,
33 } 33 }
34 shared_memory.header.entry_count = 16; 34 shared_memory.header.entry_count = 16;
35 35
36 const auto& last_entry = 36 const auto& last_entry = shared_memory.pad_states[shared_memory.header.last_entry_index];
37 shared_memory.pad_states[static_cast<u64>(shared_memory.header.last_entry_index)];
38 shared_memory.header.last_entry_index = (shared_memory.header.last_entry_index + 1) % 17; 37 shared_memory.header.last_entry_index = (shared_memory.header.last_entry_index + 1) % 17;
39 auto& cur_entry = 38 auto& cur_entry = shared_memory.pad_states[shared_memory.header.last_entry_index];
40 shared_memory.pad_states[static_cast<u64>(shared_memory.header.last_entry_index)];
41 39
42 cur_entry.sampling_number = last_entry.sampling_number + 1; 40 cur_entry.sampling_number = last_entry.sampling_number + 1;
43 cur_entry.sampling_number2 = cur_entry.sampling_number; 41 cur_entry.sampling_number2 = cur_entry.sampling_number;
diff --git a/src/core/hle/service/hid/controllers/gesture.cpp b/src/core/hle/service/hid/controllers/gesture.cpp
index 0618b2a05..b7b7bfeae 100644
--- a/src/core/hle/service/hid/controllers/gesture.cpp
+++ b/src/core/hle/service/hid/controllers/gesture.cpp
@@ -19,7 +19,7 @@ void Controller_Gesture::OnRelease() {}
19 19
20void Controller_Gesture::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, 20void Controller_Gesture::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data,
21 std::size_t size) { 21 std::size_t size) {
22 shared_memory.header.timestamp = static_cast<s64>(core_timing.GetCPUTicks()); 22 shared_memory.header.timestamp = core_timing.GetCPUTicks();
23 shared_memory.header.total_entry_count = 17; 23 shared_memory.header.total_entry_count = 17;
24 24
25 if (!IsControllerActivated()) { 25 if (!IsControllerActivated()) {
@@ -29,11 +29,9 @@ void Controller_Gesture::OnUpdate(const Core::Timing::CoreTiming& core_timing, u
29 } 29 }
30 shared_memory.header.entry_count = 16; 30 shared_memory.header.entry_count = 16;
31 31
32 const auto& last_entry = 32 const auto& last_entry = shared_memory.gesture_states[shared_memory.header.last_entry_index];
33 shared_memory.gesture_states[static_cast<u64>(shared_memory.header.last_entry_index)];
34 shared_memory.header.last_entry_index = (shared_memory.header.last_entry_index + 1) % 17; 33 shared_memory.header.last_entry_index = (shared_memory.header.last_entry_index + 1) % 17;
35 auto& cur_entry = 34 auto& cur_entry = shared_memory.gesture_states[shared_memory.header.last_entry_index];
36 shared_memory.gesture_states[static_cast<u64>(shared_memory.header.last_entry_index)];
37 35
38 cur_entry.sampling_number = last_entry.sampling_number + 1; 36 cur_entry.sampling_number = last_entry.sampling_number + 1;
39 cur_entry.sampling_number2 = cur_entry.sampling_number; 37 cur_entry.sampling_number2 = cur_entry.sampling_number;
diff --git a/src/core/hle/service/hid/controllers/keyboard.cpp b/src/core/hle/service/hid/controllers/keyboard.cpp
index 0624be316..59b694cd4 100644
--- a/src/core/hle/service/hid/controllers/keyboard.cpp
+++ b/src/core/hle/service/hid/controllers/keyboard.cpp
@@ -21,7 +21,7 @@ void Controller_Keyboard::OnRelease() {}
21 21
22void Controller_Keyboard::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, 22void Controller_Keyboard::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data,
23 std::size_t size) { 23 std::size_t size) {
24 shared_memory.header.timestamp = static_cast<s64>(core_timing.GetCPUTicks()); 24 shared_memory.header.timestamp = core_timing.GetCPUTicks();
25 shared_memory.header.total_entry_count = 17; 25 shared_memory.header.total_entry_count = 17;
26 26
27 if (!IsControllerActivated()) { 27 if (!IsControllerActivated()) {
@@ -31,11 +31,9 @@ void Controller_Keyboard::OnUpdate(const Core::Timing::CoreTiming& core_timing,
31 } 31 }
32 shared_memory.header.entry_count = 16; 32 shared_memory.header.entry_count = 16;
33 33
34 const auto& last_entry = 34 const auto& last_entry = shared_memory.pad_states[shared_memory.header.last_entry_index];
35 shared_memory.pad_states[static_cast<u64>(shared_memory.header.last_entry_index)];
36 shared_memory.header.last_entry_index = (shared_memory.header.last_entry_index + 1) % 17; 35 shared_memory.header.last_entry_index = (shared_memory.header.last_entry_index + 1) % 17;
37 auto& cur_entry = 36 auto& cur_entry = shared_memory.pad_states[shared_memory.header.last_entry_index];
38 shared_memory.pad_states[static_cast<u64>(shared_memory.header.last_entry_index)];
39 37
40 cur_entry.sampling_number = last_entry.sampling_number + 1; 38 cur_entry.sampling_number = last_entry.sampling_number + 1;
41 cur_entry.sampling_number2 = cur_entry.sampling_number; 39 cur_entry.sampling_number2 = cur_entry.sampling_number;
diff --git a/src/core/hle/service/hid/controllers/mouse.cpp b/src/core/hle/service/hid/controllers/mouse.cpp
index 10e2373bc..ac40989c5 100644
--- a/src/core/hle/service/hid/controllers/mouse.cpp
+++ b/src/core/hle/service/hid/controllers/mouse.cpp
@@ -19,7 +19,7 @@ void Controller_Mouse::OnRelease() {}
19 19
20void Controller_Mouse::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, 20void Controller_Mouse::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data,
21 std::size_t size) { 21 std::size_t size) {
22 shared_memory.header.timestamp = static_cast<s64>(core_timing.GetCPUTicks()); 22 shared_memory.header.timestamp = core_timing.GetCPUTicks();
23 shared_memory.header.total_entry_count = 17; 23 shared_memory.header.total_entry_count = 17;
24 24
25 if (!IsControllerActivated()) { 25 if (!IsControllerActivated()) {
@@ -29,11 +29,9 @@ void Controller_Mouse::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8*
29 } 29 }
30 shared_memory.header.entry_count = 16; 30 shared_memory.header.entry_count = 16;
31 31
32 auto& last_entry = 32 auto& last_entry = shared_memory.mouse_states[shared_memory.header.last_entry_index];
33 shared_memory.mouse_states[static_cast<u64>(shared_memory.header.last_entry_index)];
34 shared_memory.header.last_entry_index = (shared_memory.header.last_entry_index + 1) % 17; 33 shared_memory.header.last_entry_index = (shared_memory.header.last_entry_index + 1) % 17;
35 auto& cur_entry = 34 auto& cur_entry = shared_memory.mouse_states[shared_memory.header.last_entry_index];
36 shared_memory.mouse_states[static_cast<u64>(shared_memory.header.last_entry_index)];
37 35
38 cur_entry.sampling_number = last_entry.sampling_number + 1; 36 cur_entry.sampling_number = last_entry.sampling_number + 1;
39 cur_entry.sampling_number2 = cur_entry.sampling_number; 37 cur_entry.sampling_number2 = cur_entry.sampling_number;
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp
index 2422c0190..e311bc18c 100644
--- a/src/core/hle/service/hid/controllers/npad.cpp
+++ b/src/core/hle/service/hid/controllers/npad.cpp
@@ -341,29 +341,26 @@ void Controller_NPad::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8*
341 } 341 }
342 for (std::size_t i = 0; i < shared_memory_entries.size(); i++) { 342 for (std::size_t i = 0; i < shared_memory_entries.size(); i++) {
343 auto& npad = shared_memory_entries[i]; 343 auto& npad = shared_memory_entries[i];
344 const std::array controller_npads{ 344 const std::array<NPadGeneric*, 7> controller_npads{&npad.main_controller_states,
345 &npad.main_controller_states, 345 &npad.handheld_states,
346 &npad.handheld_states, 346 &npad.dual_states,
347 &npad.dual_states, 347 &npad.left_joy_states,
348 &npad.left_joy_states, 348 &npad.right_joy_states,
349 &npad.right_joy_states, 349 &npad.pokeball_states,
350 &npad.pokeball_states, 350 &npad.libnx};
351 &npad.libnx,
352 };
353 351
354 for (auto* main_controller : controller_npads) { 352 for (auto* main_controller : controller_npads) {
355 main_controller->common.entry_count = 16; 353 main_controller->common.entry_count = 16;
356 main_controller->common.total_entry_count = 17; 354 main_controller->common.total_entry_count = 17;
357 355
358 const auto& last_entry = 356 const auto& last_entry =
359 main_controller->npad[static_cast<u64>(main_controller->common.last_entry_index)]; 357 main_controller->npad[main_controller->common.last_entry_index];
360 358
361 main_controller->common.timestamp = static_cast<s64>(core_timing.GetCPUTicks()); 359 main_controller->common.timestamp = core_timing.GetCPUTicks();
362 main_controller->common.last_entry_index = 360 main_controller->common.last_entry_index =
363 (main_controller->common.last_entry_index + 1) % 17; 361 (main_controller->common.last_entry_index + 1) % 17;
364 362
365 auto& cur_entry = 363 auto& cur_entry = main_controller->npad[main_controller->common.last_entry_index];
366 main_controller->npad[static_cast<u64>(main_controller->common.last_entry_index)];
367 364
368 cur_entry.timestamp = last_entry.timestamp + 1; 365 cur_entry.timestamp = last_entry.timestamp + 1;
369 cur_entry.timestamp2 = cur_entry.timestamp; 366 cur_entry.timestamp2 = cur_entry.timestamp;
@@ -374,29 +371,22 @@ void Controller_NPad::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8*
374 if (controller_type == NPadControllerType::None || !connected_controllers[i].is_connected) { 371 if (controller_type == NPadControllerType::None || !connected_controllers[i].is_connected) {
375 continue; 372 continue;
376 } 373 }
377 const auto npad_index = static_cast<u32>(i); 374 const u32 npad_index = static_cast<u32>(i);
378 375
379 RequestPadStateUpdate(npad_index); 376 RequestPadStateUpdate(npad_index);
380 auto& pad_state = npad_pad_states[npad_index]; 377 auto& pad_state = npad_pad_states[npad_index];
381 378
382 auto& main_controller = 379 auto& main_controller =
383 npad.main_controller_states 380 npad.main_controller_states.npad[npad.main_controller_states.common.last_entry_index];
384 .npad[static_cast<u64>(npad.main_controller_states.common.last_entry_index)];
385 auto& handheld_entry = 381 auto& handheld_entry =
386 npad.handheld_states 382 npad.handheld_states.npad[npad.handheld_states.common.last_entry_index];
387 .npad[static_cast<u64>(npad.handheld_states.common.last_entry_index)]; 383 auto& dual_entry = npad.dual_states.npad[npad.dual_states.common.last_entry_index];
388 auto& dual_entry = 384 auto& left_entry = npad.left_joy_states.npad[npad.left_joy_states.common.last_entry_index];
389 npad.dual_states.npad[static_cast<u64>(npad.dual_states.common.last_entry_index)];
390 auto& left_entry =
391 npad.left_joy_states
392 .npad[static_cast<u64>(npad.left_joy_states.common.last_entry_index)];
393 auto& right_entry = 385 auto& right_entry =
394 npad.right_joy_states 386 npad.right_joy_states.npad[npad.right_joy_states.common.last_entry_index];
395 .npad[static_cast<u64>(npad.right_joy_states.common.last_entry_index)];
396 auto& pokeball_entry = 387 auto& pokeball_entry =
397 npad.pokeball_states 388 npad.pokeball_states.npad[npad.pokeball_states.common.last_entry_index];
398 .npad[static_cast<u64>(npad.pokeball_states.common.last_entry_index)]; 389 auto& libnx_entry = npad.libnx.npad[npad.libnx.common.last_entry_index];
399 auto& libnx_entry = npad.libnx.npad[static_cast<u64>(npad.libnx.common.last_entry_index)];
400 390
401 libnx_entry.connection_status.raw = 0; 391 libnx_entry.connection_status.raw = 0;
402 libnx_entry.connection_status.IsConnected.Assign(1); 392 libnx_entry.connection_status.IsConnected.Assign(1);
@@ -510,14 +500,13 @@ void Controller_NPad::OnMotionUpdate(const Core::Timing::CoreTiming& core_timing
510 sixaxis_sensor->common.total_entry_count = 17; 500 sixaxis_sensor->common.total_entry_count = 17;
511 501
512 const auto& last_entry = 502 const auto& last_entry =
513 sixaxis_sensor->sixaxis[static_cast<u64>(sixaxis_sensor->common.last_entry_index)]; 503 sixaxis_sensor->sixaxis[sixaxis_sensor->common.last_entry_index];
514 504
515 sixaxis_sensor->common.timestamp = static_cast<s64>(core_timing.GetCPUTicks()); 505 sixaxis_sensor->common.timestamp = core_timing.GetCPUTicks();
516 sixaxis_sensor->common.last_entry_index = 506 sixaxis_sensor->common.last_entry_index =
517 (sixaxis_sensor->common.last_entry_index + 1) % 17; 507 (sixaxis_sensor->common.last_entry_index + 1) % 17;
518 508
519 auto& cur_entry = 509 auto& cur_entry = sixaxis_sensor->sixaxis[sixaxis_sensor->common.last_entry_index];
520 sixaxis_sensor->sixaxis[static_cast<u64>(sixaxis_sensor->common.last_entry_index)];
521 510
522 cur_entry.timestamp = last_entry.timestamp + 1; 511 cur_entry.timestamp = last_entry.timestamp + 1;
523 cur_entry.timestamp2 = cur_entry.timestamp; 512 cur_entry.timestamp2 = cur_entry.timestamp;
@@ -540,21 +529,17 @@ void Controller_NPad::OnMotionUpdate(const Core::Timing::CoreTiming& core_timing
540 } 529 }
541 530
542 auto& full_sixaxis_entry = 531 auto& full_sixaxis_entry =
543 npad.sixaxis_full.sixaxis[static_cast<u64>(npad.sixaxis_full.common.last_entry_index)]; 532 npad.sixaxis_full.sixaxis[npad.sixaxis_full.common.last_entry_index];
544 auto& handheld_sixaxis_entry = 533 auto& handheld_sixaxis_entry =
545 npad.sixaxis_handheld 534 npad.sixaxis_handheld.sixaxis[npad.sixaxis_handheld.common.last_entry_index];
546 .sixaxis[static_cast<u64>(npad.sixaxis_handheld.common.last_entry_index)];
547 auto& dual_left_sixaxis_entry = 535 auto& dual_left_sixaxis_entry =
548 npad.sixaxis_dual_left 536 npad.sixaxis_dual_left.sixaxis[npad.sixaxis_dual_left.common.last_entry_index];
549 .sixaxis[static_cast<u64>(npad.sixaxis_dual_left.common.last_entry_index)];
550 auto& dual_right_sixaxis_entry = 537 auto& dual_right_sixaxis_entry =
551 npad.sixaxis_dual_right 538 npad.sixaxis_dual_right.sixaxis[npad.sixaxis_dual_right.common.last_entry_index];
552 .sixaxis[static_cast<u64>(npad.sixaxis_dual_right.common.last_entry_index)];
553 auto& left_sixaxis_entry = 539 auto& left_sixaxis_entry =
554 npad.sixaxis_left.sixaxis[static_cast<u64>(npad.sixaxis_left.common.last_entry_index)]; 540 npad.sixaxis_left.sixaxis[npad.sixaxis_left.common.last_entry_index];
555 auto& right_sixaxis_entry = 541 auto& right_sixaxis_entry =
556 npad.sixaxis_right 542 npad.sixaxis_right.sixaxis[npad.sixaxis_right.common.last_entry_index];
557 .sixaxis[static_cast<u64>(npad.sixaxis_right.common.last_entry_index)];
558 543
559 switch (controller_type) { 544 switch (controller_type) {
560 case NPadControllerType::None: 545 case NPadControllerType::None:
diff --git a/src/core/hle/service/hid/controllers/stubbed.cpp b/src/core/hle/service/hid/controllers/stubbed.cpp
index f9cb61667..e7483bfa2 100644
--- a/src/core/hle/service/hid/controllers/stubbed.cpp
+++ b/src/core/hle/service/hid/controllers/stubbed.cpp
@@ -22,12 +22,12 @@ void Controller_Stubbed::OnUpdate(const Core::Timing::CoreTiming& core_timing, u
22 return; 22 return;
23 } 23 }
24 24
25 const CommonHeader header{ 25 CommonHeader header{};
26 .timestamp = static_cast<s64>(core_timing.GetCPUTicks()), 26 header.timestamp = core_timing.GetCPUTicks();
27 .total_entry_count = 17, 27 header.total_entry_count = 17;
28 .last_entry_index = 0, 28 header.entry_count = 0;
29 .entry_count = 0, 29 header.last_entry_index = 0;
30 }; 30
31 std::memcpy(data + common_offset, &header, sizeof(CommonHeader)); 31 std::memcpy(data + common_offset, &header, sizeof(CommonHeader));
32} 32}
33 33
diff --git a/src/core/hle/service/hid/controllers/touchscreen.cpp b/src/core/hle/service/hid/controllers/touchscreen.cpp
index 06f4134a2..0df395e85 100644
--- a/src/core/hle/service/hid/controllers/touchscreen.cpp
+++ b/src/core/hle/service/hid/controllers/touchscreen.cpp
@@ -22,7 +22,7 @@ void Controller_Touchscreen::OnRelease() {}
22 22
23void Controller_Touchscreen::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, 23void Controller_Touchscreen::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data,
24 std::size_t size) { 24 std::size_t size) {
25 shared_memory.header.timestamp = static_cast<s64>(core_timing.GetCPUTicks()); 25 shared_memory.header.timestamp = core_timing.GetCPUTicks();
26 shared_memory.header.total_entry_count = 17; 26 shared_memory.header.total_entry_count = 17;
27 27
28 if (!IsControllerActivated()) { 28 if (!IsControllerActivated()) {
@@ -33,12 +33,9 @@ void Controller_Touchscreen::OnUpdate(const Core::Timing::CoreTiming& core_timin
33 shared_memory.header.entry_count = 16; 33 shared_memory.header.entry_count = 16;
34 34
35 const auto& last_entry = 35 const auto& last_entry =
36 shared_memory 36 shared_memory.shared_memory_entries[shared_memory.header.last_entry_index];
37 .shared_memory_entries[static_cast<u64>(shared_memory.header.last_entry_index)];
38 shared_memory.header.last_entry_index = (shared_memory.header.last_entry_index + 1) % 17; 37 shared_memory.header.last_entry_index = (shared_memory.header.last_entry_index + 1) % 17;
39 auto& cur_entry = 38 auto& cur_entry = shared_memory.shared_memory_entries[shared_memory.header.last_entry_index];
40 shared_memory
41 .shared_memory_entries[static_cast<u64>(shared_memory.header.last_entry_index)];
42 39
43 cur_entry.sampling_number = last_entry.sampling_number + 1; 40 cur_entry.sampling_number = last_entry.sampling_number + 1;
44 cur_entry.sampling_number2 = cur_entry.sampling_number; 41 cur_entry.sampling_number2 = cur_entry.sampling_number;
diff --git a/src/core/hle/service/hid/controllers/touchscreen.h b/src/core/hle/service/hid/controllers/touchscreen.h
index 746acbd1c..4d9042adc 100644
--- a/src/core/hle/service/hid/controllers/touchscreen.h
+++ b/src/core/hle/service/hid/controllers/touchscreen.h
@@ -69,6 +69,6 @@ private:
69 TouchScreenSharedMemory shared_memory{}; 69 TouchScreenSharedMemory shared_memory{};
70 std::unique_ptr<Input::TouchDevice> touch_device; 70 std::unique_ptr<Input::TouchDevice> touch_device;
71 std::unique_ptr<Input::TouchDevice> touch_btn_device; 71 std::unique_ptr<Input::TouchDevice> touch_btn_device;
72 u64_le last_touch{}; 72 s64_le last_touch{};
73}; 73};
74} // namespace Service::HID 74} // namespace Service::HID
diff --git a/src/core/hle/service/hid/controllers/xpad.cpp b/src/core/hle/service/hid/controllers/xpad.cpp
index 60417abb8..2503ef241 100644
--- a/src/core/hle/service/hid/controllers/xpad.cpp
+++ b/src/core/hle/service/hid/controllers/xpad.cpp
@@ -20,7 +20,7 @@ void Controller_XPad::OnRelease() {}
20void Controller_XPad::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, 20void Controller_XPad::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data,
21 std::size_t size) { 21 std::size_t size) {
22 for (auto& xpad_entry : shared_memory.shared_memory_entries) { 22 for (auto& xpad_entry : shared_memory.shared_memory_entries) {
23 xpad_entry.header.timestamp = static_cast<s64>(core_timing.GetCPUTicks()); 23 xpad_entry.header.timestamp = core_timing.GetCPUTicks();
24 xpad_entry.header.total_entry_count = 17; 24 xpad_entry.header.total_entry_count = 17;
25 25
26 if (!IsControllerActivated()) { 26 if (!IsControllerActivated()) {
@@ -30,11 +30,9 @@ void Controller_XPad::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8*
30 } 30 }
31 xpad_entry.header.entry_count = 16; 31 xpad_entry.header.entry_count = 16;
32 32
33 const auto& last_entry = 33 const auto& last_entry = xpad_entry.pad_states[xpad_entry.header.last_entry_index];
34 xpad_entry.pad_states[static_cast<u64>(xpad_entry.header.last_entry_index)];
35 xpad_entry.header.last_entry_index = (xpad_entry.header.last_entry_index + 1) % 17; 34 xpad_entry.header.last_entry_index = (xpad_entry.header.last_entry_index + 1) % 17;
36 auto& cur_entry = 35 auto& cur_entry = xpad_entry.pad_states[xpad_entry.header.last_entry_index];
37 xpad_entry.pad_states[static_cast<u64>(xpad_entry.header.last_entry_index)];
38 36
39 cur_entry.sampling_number = last_entry.sampling_number + 1; 37 cur_entry.sampling_number = last_entry.sampling_number + 1;
40 cur_entry.sampling_number2 = cur_entry.sampling_number; 38 cur_entry.sampling_number2 = cur_entry.sampling_number;
diff --git a/src/core/hle/service/ldr/ldr.cpp b/src/core/hle/service/ldr/ldr.cpp
index 9ad5bbf0d..d8cd10e31 100644
--- a/src/core/hle/service/ldr/ldr.cpp
+++ b/src/core/hle/service/ldr/ldr.cpp
@@ -23,7 +23,7 @@ namespace Service::LDR {
23 23
24constexpr ResultCode ERROR_INSUFFICIENT_ADDRESS_SPACE{ErrorModule::RO, 2}; 24constexpr ResultCode ERROR_INSUFFICIENT_ADDRESS_SPACE{ErrorModule::RO, 2};
25 25
26[[maybe_unused]] constexpr ResultCode ERROR_INVALID_MEMORY_STATE{ErrorModule::Loader, 51}; 26constexpr ResultCode ERROR_INVALID_MEMORY_STATE{ErrorModule::Loader, 51};
27constexpr ResultCode ERROR_INVALID_NRO{ErrorModule::Loader, 52}; 27constexpr ResultCode ERROR_INVALID_NRO{ErrorModule::Loader, 52};
28constexpr ResultCode ERROR_INVALID_NRR{ErrorModule::Loader, 53}; 28constexpr ResultCode ERROR_INVALID_NRR{ErrorModule::Loader, 53};
29constexpr ResultCode ERROR_MISSING_NRR_HASH{ErrorModule::Loader, 54}; 29constexpr ResultCode ERROR_MISSING_NRR_HASH{ErrorModule::Loader, 54};
@@ -33,7 +33,7 @@ constexpr ResultCode ERROR_ALREADY_LOADED{ErrorModule::Loader, 57};
33constexpr ResultCode ERROR_INVALID_ALIGNMENT{ErrorModule::Loader, 81}; 33constexpr ResultCode ERROR_INVALID_ALIGNMENT{ErrorModule::Loader, 81};
34constexpr ResultCode ERROR_INVALID_SIZE{ErrorModule::Loader, 82}; 34constexpr ResultCode ERROR_INVALID_SIZE{ErrorModule::Loader, 82};
35constexpr ResultCode ERROR_INVALID_NRO_ADDRESS{ErrorModule::Loader, 84}; 35constexpr ResultCode ERROR_INVALID_NRO_ADDRESS{ErrorModule::Loader, 84};
36[[maybe_unused]] constexpr ResultCode ERROR_INVALID_NRR_ADDRESS{ErrorModule::Loader, 85}; 36constexpr ResultCode ERROR_INVALID_NRR_ADDRESS{ErrorModule::Loader, 85};
37constexpr ResultCode ERROR_NOT_INITIALIZED{ErrorModule::Loader, 87}; 37constexpr ResultCode ERROR_NOT_INITIALIZED{ErrorModule::Loader, 87};
38 38
39constexpr std::size_t MAXIMUM_LOADED_RO{0x40}; 39constexpr std::size_t MAXIMUM_LOADED_RO{0x40};
diff --git a/src/core/hle/service/mii/manager.cpp b/src/core/hle/service/mii/manager.cpp
index 1b75c2ebe..d73b90015 100644
--- a/src/core/hle/service/mii/manager.cpp
+++ b/src/core/hle/service/mii/manager.cpp
@@ -240,10 +240,10 @@ MiiStoreData BuildRandomStoreData(Age age, Gender gender, Race race, const Commo
240 bf.eye_type.Assign( 240 bf.eye_type.Assign(
241 eye_type_info.values[GetRandomValue<std::size_t>(eye_type_info.values_count)]); 241 eye_type_info.values[GetRandomValue<std::size_t>(eye_type_info.values_count)]);
242 242
243 const auto eye_rotate_1{gender != Gender::Male ? 4U : 2U}; 243 const auto eye_rotate_1{gender != Gender::Male ? 4 : 2};
244 const auto eye_rotate_2{gender != Gender::Male ? 3U : 4U}; 244 const auto eye_rotate_2{gender != Gender::Male ? 3 : 4};
245 const auto eye_rotate_offset{32U - EyeRotateLookup[eye_rotate_1] + eye_rotate_2}; 245 const auto eye_rotate_offset{32 - EyeRotateLookup[eye_rotate_1] + eye_rotate_2};
246 const auto eye_rotate{32U - EyeRotateLookup[bf.eye_type]}; 246 const auto eye_rotate{32 - EyeRotateLookup[bf.eye_type]};
247 247
248 bf.eye_color.Assign( 248 bf.eye_color.Assign(
249 EyeColorLookup[eye_color_info 249 EyeColorLookup[eye_color_info
@@ -257,11 +257,11 @@ MiiStoreData BuildRandomStoreData(Age age, Gender gender, Race race, const Commo
257 bf.eyebrow_type.Assign( 257 bf.eyebrow_type.Assign(
258 eyebrow_type_info.values[GetRandomValue<std::size_t>(eyebrow_type_info.values_count)]); 258 eyebrow_type_info.values[GetRandomValue<std::size_t>(eyebrow_type_info.values_count)]);
259 259
260 const auto eyebrow_rotate_1{race == Race::Asian ? 6U : 0U}; 260 const auto eyebrow_rotate_1{race == Race::Asian ? 6 : 0};
261 const auto eyebrow_y{race == Race::Asian ? 9U : 10U}; 261 const auto eyebrow_y{race == Race::Asian ? 9 : 10};
262 const auto eyebrow_rotate_offset{32U - EyebrowRotateLookup[eyebrow_rotate_1] + 6}; 262 const auto eyebrow_rotate_offset{32 - EyebrowRotateLookup[eyebrow_rotate_1] + 6};
263 const auto eyebrow_rotate{ 263 const auto eyebrow_rotate{
264 32U - EyebrowRotateLookup[static_cast<std::size_t>(bf.eyebrow_type.Value())]}; 264 32 - EyebrowRotateLookup[static_cast<std::size_t>(bf.eyebrow_type.Value())]};
265 265
266 bf.eyebrow_color.Assign(bf.hair_color); 266 bf.eyebrow_color.Assign(bf.hair_color);
267 bf.eyebrow_scale.Assign(4); 267 bf.eyebrow_scale.Assign(4);
@@ -270,14 +270,14 @@ MiiStoreData BuildRandomStoreData(Age age, Gender gender, Race race, const Commo
270 bf.eyebrow_x.Assign(2); 270 bf.eyebrow_x.Assign(2);
271 bf.eyebrow_y.Assign(axis_y + eyebrow_y); 271 bf.eyebrow_y.Assign(axis_y + eyebrow_y);
272 272
273 const auto nose_scale{gender == Gender::Female ? 3U : 4U}; 273 const auto nose_scale{gender == Gender::Female ? 3 : 4};
274 274
275 bf.nose_type.Assign( 275 bf.nose_type.Assign(
276 nose_type_info.values[GetRandomValue<std::size_t>(nose_type_info.values_count)]); 276 nose_type_info.values[GetRandomValue<std::size_t>(nose_type_info.values_count)]);
277 bf.nose_scale.Assign(nose_scale); 277 bf.nose_scale.Assign(nose_scale);
278 bf.nose_y.Assign(axis_y + 9); 278 bf.nose_y.Assign(axis_y + 9);
279 279
280 const auto mouth_color{gender == Gender::Female ? GetRandomValue<u32>(4) : 0U}; 280 const auto mouth_color{gender == Gender::Female ? GetRandomValue<int>(4) : 0};
281 281
282 bf.mouth_type.Assign( 282 bf.mouth_type.Assign(
283 mouth_type_info.values[GetRandomValue<std::size_t>(mouth_type_info.values_count)]); 283 mouth_type_info.values[GetRandomValue<std::size_t>(mouth_type_info.values_count)]);
diff --git a/src/core/hle/service/nfp/nfp.cpp b/src/core/hle/service/nfp/nfp.cpp
index 0dd23ec9e..a0469ffbd 100644
--- a/src/core/hle/service/nfp/nfp.cpp
+++ b/src/core/hle/service/nfp/nfp.cpp
@@ -217,7 +217,7 @@ private:
217 const auto& amiibo = nfp_interface.GetAmiiboBuffer(); 217 const auto& amiibo = nfp_interface.GetAmiiboBuffer();
218 const TagInfo tag_info{ 218 const TagInfo tag_info{
219 .uuid = amiibo.uuid, 219 .uuid = amiibo.uuid,
220 .uuid_length = static_cast<u8>(amiibo.uuid.size()), 220 .uuid_length = static_cast<u8>(tag_info.uuid.size()),
221 .padding_1 = {}, 221 .padding_1 = {},
222 .protocol = 1, // TODO(ogniK): Figure out actual values 222 .protocol = 1, // TODO(ogniK): Figure out actual values
223 .tag_type = 2, 223 .tag_type = 2,
diff --git a/src/core/hle/service/ns/ns.cpp b/src/core/hle/service/ns/ns.cpp
index 3edee6303..58ee1f712 100644
--- a/src/core/hle/service/ns/ns.cpp
+++ b/src/core/hle/service/ns/ns.cpp
@@ -368,7 +368,7 @@ ResultVal<u8> IApplicationManagerInterface::GetApplicationDesiredLanguage(
368 368
369 // Get language code from settings 369 // Get language code from settings
370 const auto language_code = 370 const auto language_code =
371 Set::GetLanguageCodeFromIndex(static_cast<u32>(Settings::values.language_index.GetValue())); 371 Set::GetLanguageCodeFromIndex(Settings::values.language_index.GetValue());
372 372
373 // Convert to application language, get priority list 373 // Convert to application language, get priority list
374 const auto application_language = ConvertToApplicationLanguage(language_code); 374 const auto application_language = ConvertToApplicationLanguage(language_code);
diff --git a/src/core/hle/service/ns/pl_u.cpp b/src/core/hle/service/ns/pl_u.cpp
index 5ccec2637..40838a225 100644
--- a/src/core/hle/service/ns/pl_u.cpp
+++ b/src/core/hle/service/ns/pl_u.cpp
@@ -50,9 +50,19 @@ constexpr std::array<std::pair<FontArchives, const char*>, 7> SHARED_FONTS{
50 std::make_pair(FontArchives::Extension, "nintendo_ext2_003.bfttf"), 50 std::make_pair(FontArchives::Extension, "nintendo_ext2_003.bfttf"),
51}; 51};
52 52
53constexpr std::array<const char*, 7> SHARED_FONTS_TTF{
54 "FontStandard.ttf",
55 "FontChineseSimplified.ttf",
56 "FontExtendedChineseSimplified.ttf",
57 "FontChineseTraditional.ttf",
58 "FontKorean.ttf",
59 "FontNintendoExtended.ttf",
60 "FontNintendoExtended2.ttf",
61};
62
53// The below data is specific to shared font data dumped from Switch on f/w 2.2 63// The below data is specific to shared font data dumped from Switch on f/w 2.2
54// Virtual address and offsets/sizes likely will vary by dump 64// Virtual address and offsets/sizes likely will vary by dump
55[[maybe_unused]] constexpr VAddr SHARED_FONT_MEM_VADDR{0x00000009d3016000ULL}; 65constexpr VAddr SHARED_FONT_MEM_VADDR{0x00000009d3016000ULL};
56constexpr u32 EXPECTED_RESULT{0x7f9a0218}; // What we expect the decrypted bfttf first 4 bytes to be 66constexpr u32 EXPECTED_RESULT{0x7f9a0218}; // What we expect the decrypted bfttf first 4 bytes to be
57constexpr u32 EXPECTED_MAGIC{0x36f81a1e}; // What we expect the encrypted bfttf first 4 bytes to be 67constexpr u32 EXPECTED_MAGIC{0x36f81a1e}; // What we expect the encrypted bfttf first 4 bytes to be
58constexpr u64 SHARED_FONT_MEM_SIZE{0x1100000}; 68constexpr u64 SHARED_FONT_MEM_SIZE{0x1100000};
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp
index 3a5bebff3..f2529a12e 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp
@@ -155,7 +155,7 @@ u32 nvhost_as_gpu::MapBufferEx(const std::vector<u8>& input, std::vector<u8>& ou
155 155
156 const auto object{nvmap_dev->GetObject(params.nvmap_handle)}; 156 const auto object{nvmap_dev->GetObject(params.nvmap_handle)};
157 if (!object) { 157 if (!object) {
158 LOG_ERROR(Service_NVDRV, "invalid nvmap_handle={:X}", params.nvmap_handle); 158 LOG_CRITICAL(Service_NVDRV, "invalid nvmap_handle={:X}", params.nvmap_handle);
159 std::memcpy(output.data(), &params, output.size()); 159 std::memcpy(output.data(), &params, output.size());
160 return NvErrCodes::InvalidInput; 160 return NvErrCodes::InvalidInput;
161 } 161 }
@@ -167,24 +167,21 @@ u32 nvhost_as_gpu::MapBufferEx(const std::vector<u8>& input, std::vector<u8>& ou
167 auto& gpu = system.GPU(); 167 auto& gpu = system.GPU();
168 168
169 u64 page_size{params.page_size}; 169 u64 page_size{params.page_size};
170 if (page_size == 0) { 170 if (!page_size) {
171 page_size = object->align; 171 page_size = object->align;
172 } 172 }
173 173
174 if ((params.flags & AddressSpaceFlags::Remap) != AddressSpaceFlags::None) { 174 if ((params.flags & AddressSpaceFlags::Remap) != AddressSpaceFlags::None) {
175 const auto buffer_map = FindBufferMap(static_cast<GPUVAddr>(params.offset)); 175 if (const auto buffer_map{FindBufferMap(params.offset)}; buffer_map) {
176 176 const auto cpu_addr{static_cast<VAddr>(buffer_map->CpuAddr() + params.buffer_offset)};
177 if (buffer_map) {
178 const auto cpu_addr{
179 static_cast<VAddr>(buffer_map->CpuAddr() + static_cast<u64>(params.buffer_offset))};
180 const auto gpu_addr{static_cast<GPUVAddr>(params.offset + params.buffer_offset)}; 177 const auto gpu_addr{static_cast<GPUVAddr>(params.offset + params.buffer_offset)};
181 178
182 if (!gpu.MemoryManager().Map(cpu_addr, gpu_addr, params.mapping_size)) { 179 if (!gpu.MemoryManager().Map(cpu_addr, gpu_addr, params.mapping_size)) {
183 LOG_ERROR(Service_NVDRV, 180 LOG_CRITICAL(Service_NVDRV,
184 "Remap failed, flags={:X}, nvmap_handle={:X}, buffer_offset={}, " 181 "remap failed, flags={:X}, nvmap_handle={:X}, buffer_offset={}, "
185 "mapping_size = {}, offset={}", 182 "mapping_size = {}, offset={}",
186 params.flags, params.nvmap_handle, params.buffer_offset, 183 params.flags, params.nvmap_handle, params.buffer_offset,
187 params.mapping_size, params.offset); 184 params.mapping_size, params.offset);
188 185
189 std::memcpy(output.data(), &params, output.size()); 186 std::memcpy(output.data(), &params, output.size());
190 return NvErrCodes::InvalidInput; 187 return NvErrCodes::InvalidInput;
@@ -193,7 +190,7 @@ u32 nvhost_as_gpu::MapBufferEx(const std::vector<u8>& input, std::vector<u8>& ou
193 std::memcpy(output.data(), &params, output.size()); 190 std::memcpy(output.data(), &params, output.size());
194 return NvErrCodes::Success; 191 return NvErrCodes::Success;
195 } else { 192 } else {
196 LOG_ERROR(Service_NVDRV, "Address not mapped. offset={}", params.offset); 193 LOG_CRITICAL(Service_NVDRV, "address not mapped offset={}", params.offset);
197 194
198 std::memcpy(output.data(), &params, output.size()); 195 std::memcpy(output.data(), &params, output.size());
199 return NvErrCodes::InvalidInput; 196 return NvErrCodes::InvalidInput;
@@ -203,27 +200,25 @@ u32 nvhost_as_gpu::MapBufferEx(const std::vector<u8>& input, std::vector<u8>& ou
203 // We can only map objects that have already been assigned a CPU address. 200 // We can only map objects that have already been assigned a CPU address.
204 ASSERT(object->status == nvmap::Object::Status::Allocated); 201 ASSERT(object->status == nvmap::Object::Status::Allocated);
205 202
206 const auto physical_address{object->addr + static_cast<VAddr>(params.buffer_offset)}; 203 const auto physical_address{object->addr + params.buffer_offset};
207 u64 size{params.mapping_size}; 204 u64 size{params.mapping_size};
208 if (size == 0) { 205 if (!size) {
209 size = object->size; 206 size = object->size;
210 } 207 }
211 208
212 const bool is_alloc{(params.flags & AddressSpaceFlags::FixedOffset) == AddressSpaceFlags::None}; 209 const bool is_alloc{(params.flags & AddressSpaceFlags::FixedOffset) == AddressSpaceFlags::None};
213 if (is_alloc) { 210 if (is_alloc) {
214 params.offset = 211 params.offset = gpu.MemoryManager().MapAllocate(physical_address, size, page_size);
215 static_cast<s64>(gpu.MemoryManager().MapAllocate(physical_address, size, page_size));
216 } else { 212 } else {
217 params.offset = static_cast<s64>( 213 params.offset = gpu.MemoryManager().Map(physical_address, params.offset, size);
218 gpu.MemoryManager().Map(physical_address, static_cast<GPUVAddr>(params.offset), size));
219 } 214 }
220 215
221 auto result{NvErrCodes::Success}; 216 auto result{NvErrCodes::Success};
222 if (params.offset == 0) { 217 if (!params.offset) {
223 LOG_ERROR(Service_NVDRV, "Failed to map size={}", size); 218 LOG_CRITICAL(Service_NVDRV, "failed to map size={}", size);
224 result = NvErrCodes::InvalidInput; 219 result = NvErrCodes::InvalidInput;
225 } else { 220 } else {
226 AddBufferMap(static_cast<GPUVAddr>(params.offset), size, physical_address, is_alloc); 221 AddBufferMap(params.offset, size, physical_address, is_alloc);
227 } 222 }
228 223
229 std::memcpy(output.data(), &params, output.size()); 224 std::memcpy(output.data(), &params, output.size());
@@ -234,13 +229,12 @@ u32 nvhost_as_gpu::UnmapBuffer(const std::vector<u8>& input, std::vector<u8>& ou
234 IoctlUnmapBuffer params{}; 229 IoctlUnmapBuffer params{};
235 std::memcpy(&params, input.data(), input.size()); 230 std::memcpy(&params, input.data(), input.size());
236 231
237 const auto offset = static_cast<GPUVAddr>(params.offset); 232 LOG_DEBUG(Service_NVDRV, "called, offset=0x{:X}", params.offset);
238 LOG_DEBUG(Service_NVDRV, "called, offset=0x{:X}", offset);
239 233
240 if (const auto size{RemoveBufferMap(offset)}; size) { 234 if (const auto size{RemoveBufferMap(params.offset)}; size) {
241 system.GPU().MemoryManager().Unmap(offset, *size); 235 system.GPU().MemoryManager().Unmap(params.offset, *size);
242 } else { 236 } else {
243 LOG_ERROR(Service_NVDRV, "invalid offset=0x{:X}", offset); 237 LOG_ERROR(Service_NVDRV, "invalid offset=0x{:X}", params.offset);
244 } 238 }
245 239
246 std::memcpy(output.data(), &params, output.size()); 240 std::memcpy(output.data(), &params, output.size());
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp
index 07d851d0e..b27ee0502 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp
@@ -63,7 +63,8 @@ u32 nvhost_ctrl::IocCtrlEventWait(const std::vector<u8>& input, std::vector<u8>&
63 return NvResult::BadParameter; 63 return NvResult::BadParameter;
64 } 64 }
65 65
66 const u32 event_id = params.value & 0x00FF; 66 u32 event_id = params.value & 0x00FF;
67
67 if (event_id >= MaxNvEvents) { 68 if (event_id >= MaxNvEvents) {
68 std::memcpy(output.data(), &params, sizeof(params)); 69 std::memcpy(output.data(), &params, sizeof(params));
69 return NvResult::BadParameter; 70 return NvResult::BadParameter;
@@ -77,17 +78,16 @@ u32 nvhost_ctrl::IocCtrlEventWait(const std::vector<u8>& input, std::vector<u8>&
77 event.writable->Signal(); 78 event.writable->Signal();
78 return NvResult::Success; 79 return NvResult::Success;
79 } 80 }
80
81 auto lock = gpu.LockSync(); 81 auto lock = gpu.LockSync();
82 const u32 current_syncpoint_value = gpu.GetSyncpointValue(params.syncpt_id); 82 const u32 current_syncpoint_value = gpu.GetSyncpointValue(params.syncpt_id);
83 const s32 diff = static_cast<s32>(current_syncpoint_value - params.threshold); 83 const s32 diff = current_syncpoint_value - params.threshold;
84 if (diff >= 0) { 84 if (diff >= 0) {
85 event.writable->Signal(); 85 event.writable->Signal();
86 params.value = current_syncpoint_value; 86 params.value = current_syncpoint_value;
87 std::memcpy(output.data(), &params, sizeof(params)); 87 std::memcpy(output.data(), &params, sizeof(params));
88 return NvResult::Success; 88 return NvResult::Success;
89 } 89 }
90 const u32 target_value = current_syncpoint_value - static_cast<u32>(diff); 90 const u32 target_value = current_syncpoint_value - diff;
91 91
92 if (!is_async) { 92 if (!is_async) {
93 params.value = 0; 93 params.value = 0;
@@ -98,7 +98,7 @@ u32 nvhost_ctrl::IocCtrlEventWait(const std::vector<u8>& input, std::vector<u8>&
98 return NvResult::Timeout; 98 return NvResult::Timeout;
99 } 99 }
100 100
101 const EventState status = events_interface.status[event_id]; 101 EventState status = events_interface.status[event_id];
102 if (event_id < MaxNvEvents || status == EventState::Free || status == EventState::Registered) { 102 if (event_id < MaxNvEvents || status == EventState::Free || status == EventState::Registered) {
103 events_interface.SetEventStatus(event_id, EventState::Waiting); 103 events_interface.SetEventStatus(event_id, EventState::Waiting);
104 events_interface.assigned_syncpt[event_id] = params.syncpt_id; 104 events_interface.assigned_syncpt[event_id] = params.syncpt_id;
@@ -114,7 +114,7 @@ u32 nvhost_ctrl::IocCtrlEventWait(const std::vector<u8>& input, std::vector<u8>&
114 if (!is_async && ctrl.fresh_call) { 114 if (!is_async && ctrl.fresh_call) {
115 ctrl.must_delay = true; 115 ctrl.must_delay = true;
116 ctrl.timeout = params.timeout; 116 ctrl.timeout = params.timeout;
117 ctrl.event_id = static_cast<s32>(event_id); 117 ctrl.event_id = event_id;
118 return NvResult::Timeout; 118 return NvResult::Timeout;
119 } 119 }
120 std::memcpy(output.data(), &params, sizeof(params)); 120 std::memcpy(output.data(), &params, sizeof(params));
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp
index 5e51b37be..f1966ac0e 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp
@@ -127,7 +127,7 @@ u32 nvhost_gpu::AllocGPFIFOEx2(const std::vector<u8>& input, std::vector<u8>& ou
127 params.unk3); 127 params.unk3);
128 128
129 auto& gpu = system.GPU(); 129 auto& gpu = system.GPU();
130 params.fence_out.id = static_cast<s32>(assigned_syncpoints); 130 params.fence_out.id = assigned_syncpoints;
131 params.fence_out.value = gpu.GetSyncpointValue(assigned_syncpoints); 131 params.fence_out.value = gpu.GetSyncpointValue(assigned_syncpoints);
132 assigned_syncpoints++; 132 assigned_syncpoints++;
133 std::memcpy(output.data(), &params, output.size()); 133 std::memcpy(output.data(), &params, output.size());
@@ -166,8 +166,7 @@ u32 nvhost_gpu::SubmitGPFIFO(const std::vector<u8>& input, std::vector<u8>& outp
166 UNIMPLEMENTED_IF(params.flags.add_increment.Value() != 0); 166 UNIMPLEMENTED_IF(params.flags.add_increment.Value() != 0);
167 167
168 auto& gpu = system.GPU(); 168 auto& gpu = system.GPU();
169 const u32 current_syncpoint_value = 169 u32 current_syncpoint_value = gpu.GetSyncpointValue(params.fence_out.id);
170 gpu.GetSyncpointValue(static_cast<u32>(params.fence_out.id));
171 if (params.flags.increment.Value()) { 170 if (params.flags.increment.Value()) {
172 params.fence_out.value += current_syncpoint_value; 171 params.fence_out.value += current_syncpoint_value;
173 } else { 172 } else {
@@ -201,8 +200,7 @@ u32 nvhost_gpu::KickoffPB(const std::vector<u8>& input, std::vector<u8>& output,
201 UNIMPLEMENTED_IF(params.flags.add_increment.Value() != 0); 200 UNIMPLEMENTED_IF(params.flags.add_increment.Value() != 0);
202 201
203 auto& gpu = system.GPU(); 202 auto& gpu = system.GPU();
204 const u32 current_syncpoint_value = 203 u32 current_syncpoint_value = gpu.GetSyncpointValue(params.fence_out.id);
205 gpu.GetSyncpointValue(static_cast<u32>(params.fence_out.id));
206 if (params.flags.increment.Value()) { 204 if (params.flags.increment.Value()) {
207 params.fence_out.value += current_syncpoint_value; 205 params.fence_out.value += current_syncpoint_value;
208 } else { 206 } else {
diff --git a/src/core/hle/service/nvdrv/interface.cpp b/src/core/hle/service/nvdrv/interface.cpp
index 2f4f73487..88fbfa9b0 100644
--- a/src/core/hle/service/nvdrv/interface.cpp
+++ b/src/core/hle/service/nvdrv/interface.cpp
@@ -61,9 +61,9 @@ void NVDRV::IoctlBase(Kernel::HLERequestContext& ctx, IoctlVersion version) {
61 if (ctrl.must_delay) { 61 if (ctrl.must_delay) {
62 ctrl.fresh_call = false; 62 ctrl.fresh_call = false;
63 ctx.SleepClientThread( 63 ctx.SleepClientThread(
64 "NVServices::DelayedResponse", static_cast<u64>(ctrl.timeout), 64 "NVServices::DelayedResponse", ctrl.timeout,
65 [=, this](std::shared_ptr<Kernel::Thread>, Kernel::HLERequestContext& ctx_, 65 [=, this](std::shared_ptr<Kernel::Thread> thread, Kernel::HLERequestContext& ctx_,
66 Kernel::ThreadWakeupReason) { 66 Kernel::ThreadWakeupReason reason) {
67 IoctlCtrl ctrl2{ctrl}; 67 IoctlCtrl ctrl2{ctrl};
68 std::vector<u8> tmp_output = output; 68 std::vector<u8> tmp_output = output;
69 std::vector<u8> tmp_output2 = output2; 69 std::vector<u8> tmp_output2 = output2;
@@ -77,7 +77,7 @@ void NVDRV::IoctlBase(Kernel::HLERequestContext& ctx, IoctlVersion version) {
77 rb.Push(RESULT_SUCCESS); 77 rb.Push(RESULT_SUCCESS);
78 rb.Push(ioctl_result); 78 rb.Push(ioctl_result);
79 }, 79 },
80 nvdrv->GetEventWriteable(static_cast<u32>(ctrl.event_id))); 80 nvdrv->GetEventWriteable(ctrl.event_id));
81 } else { 81 } else {
82 ctx.WriteBuffer(output); 82 ctx.WriteBuffer(output);
83 if (version == IoctlVersion::Version3) { 83 if (version == IoctlVersion::Version3) {
diff --git a/src/core/hle/service/nvflinger/nvflinger.cpp b/src/core/hle/service/nvflinger/nvflinger.cpp
index 621a429bc..c64673dba 100644
--- a/src/core/hle/service/nvflinger/nvflinger.cpp
+++ b/src/core/hle/service/nvflinger/nvflinger.cpp
@@ -247,7 +247,7 @@ void NVFlinger::Compose() {
247 guard->unlock(); 247 guard->unlock();
248 for (u32 fence_id = 0; fence_id < multi_fence.num_fences; fence_id++) { 248 for (u32 fence_id = 0; fence_id < multi_fence.num_fences; fence_id++) {
249 const auto& fence = multi_fence.fences[fence_id]; 249 const auto& fence = multi_fence.fences[fence_id];
250 gpu.WaitFence(static_cast<u32>(fence.id), fence.value); 250 gpu.WaitFence(fence.id, fence.value);
251 } 251 }
252 guard->lock(); 252 guard->lock();
253 253
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp
index bc7476a5b..ba9159ee0 100644
--- a/src/core/hle/service/service.cpp
+++ b/src/core/hle/service/service.cpp
@@ -80,10 +80,10 @@ namespace Service {
80 std::string_view port_name, 80 std::string_view port_name,
81 const u32* cmd_buff) { 81 const u32* cmd_buff) {
82 // Number of params == bits 0-5 + bits 6-11 82 // Number of params == bits 0-5 + bits 6-11
83 const u32 num_params = (cmd_buff[0] & 0x3F) + ((cmd_buff[0] >> 6) & 0x3F); 83 int num_params = (cmd_buff[0] & 0x3F) + ((cmd_buff[0] >> 6) & 0x3F);
84 84
85 std::string function_string = fmt::format("function '{}': port={}", name, port_name); 85 std::string function_string = fmt::format("function '{}': port={}", name, port_name);
86 for (u32 i = 1; i <= num_params; ++i) { 86 for (int i = 1; i <= num_params; ++i) {
87 function_string += fmt::format(", cmd_buff[{}]=0x{:X}", i, cmd_buff[i]); 87 function_string += fmt::format(", cmd_buff[{}]=0x{:X}", i, cmd_buff[i]);
88 } 88 }
89 return function_string; 89 return function_string;
diff --git a/src/core/hle/service/set/set.cpp b/src/core/hle/service/set/set.cpp
index 82a7aecc7..e64777668 100644
--- a/src/core/hle/service/set/set.cpp
+++ b/src/core/hle/service/set/set.cpp
@@ -91,8 +91,7 @@ void GetAvailableLanguageCodesImpl(Kernel::HLERequestContext& ctx, std::size_t m
91} 91}
92 92
93void GetKeyCodeMapImpl(Kernel::HLERequestContext& ctx) { 93void GetKeyCodeMapImpl(Kernel::HLERequestContext& ctx) {
94 const auto language_code = 94 const auto language_code = available_language_codes[Settings::values.language_index.GetValue()];
95 available_language_codes[static_cast<u32>(Settings::values.language_index.GetValue())];
96 const auto key_code = 95 const auto key_code =
97 std::find_if(language_to_layout.cbegin(), language_to_layout.cend(), 96 std::find_if(language_to_layout.cbegin(), language_to_layout.cend(),
98 [=](const auto& element) { return element.first == language_code; }); 97 [=](const auto& element) { return element.first == language_code; });
@@ -168,8 +167,7 @@ void SET::GetLanguageCode(Kernel::HLERequestContext& ctx) {
168 167
169 IPC::ResponseBuilder rb{ctx, 4}; 168 IPC::ResponseBuilder rb{ctx, 4};
170 rb.Push(RESULT_SUCCESS); 169 rb.Push(RESULT_SUCCESS);
171 rb.PushEnum( 170 rb.PushEnum(available_language_codes[Settings::values.language_index.GetValue()]);
172 available_language_codes[static_cast<u32>(Settings::values.language_index.GetValue())]);
173} 171}
174 172
175void SET::GetRegionCode(Kernel::HLERequestContext& ctx) { 173void SET::GetRegionCode(Kernel::HLERequestContext& ctx) {
diff --git a/src/core/hle/service/sockets/bsd.cpp b/src/core/hle/service/sockets/bsd.cpp
index 7cb70064c..a74be9370 100644
--- a/src/core/hle/service/sockets/bsd.cpp
+++ b/src/core/hle/service/sockets/bsd.cpp
@@ -437,9 +437,9 @@ std::pair<s32, Errno> BSD::SocketImpl(Domain domain, Type type, Protocol protoco
437 UNIMPLEMENTED_MSG("SOCK_RAW errno management"); 437 UNIMPLEMENTED_MSG("SOCK_RAW errno management");
438 } 438 }
439 439
440 [[maybe_unused]] const bool unk_flag = (static_cast<u32>(type) & 0x20000000U) != 0; 440 [[maybe_unused]] const bool unk_flag = (static_cast<u32>(type) & 0x20000000) != 0;
441 UNIMPLEMENTED_IF_MSG(unk_flag, "Unknown flag in type"); 441 UNIMPLEMENTED_IF_MSG(unk_flag, "Unknown flag in type");
442 type = static_cast<Type>(static_cast<u32>(type) & ~0x20000000U); 442 type = static_cast<Type>(static_cast<u32>(type) & ~0x20000000);
443 443
444 const s32 fd = FindFreeFileDescriptorHandle(); 444 const s32 fd = FindFreeFileDescriptorHandle();
445 if (fd < 0) { 445 if (fd < 0) {
@@ -447,7 +447,7 @@ std::pair<s32, Errno> BSD::SocketImpl(Domain domain, Type type, Protocol protoco
447 return {-1, Errno::MFILE}; 447 return {-1, Errno::MFILE};
448 } 448 }
449 449
450 FileDescriptor& descriptor = GetFileDescriptor(fd).emplace(); 450 FileDescriptor& descriptor = file_descriptors[fd].emplace();
451 // ENONMEM might be thrown here 451 // ENONMEM might be thrown here
452 452
453 LOG_INFO(Service, "New socket fd={}", fd); 453 LOG_INFO(Service, "New socket fd={}", fd);
@@ -461,7 +461,7 @@ std::pair<s32, Errno> BSD::SocketImpl(Domain domain, Type type, Protocol protoco
461 461
462std::pair<s32, Errno> BSD::PollImpl(std::vector<u8>& write_buffer, std::vector<u8> read_buffer, 462std::pair<s32, Errno> BSD::PollImpl(std::vector<u8>& write_buffer, std::vector<u8> read_buffer,
463 s32 nfds, s32 timeout) { 463 s32 nfds, s32 timeout) {
464 if (write_buffer.size() < static_cast<size_t>(nfds) * sizeof(PollFD)) { 464 if (write_buffer.size() < nfds * sizeof(PollFD)) {
465 return {-1, Errno::INVAL}; 465 return {-1, Errno::INVAL};
466 } 466 }
467 467
@@ -471,7 +471,7 @@ std::pair<s32, Errno> BSD::PollImpl(std::vector<u8>& write_buffer, std::vector<u
471 } 471 }
472 472
473 const size_t length = std::min(read_buffer.size(), write_buffer.size()); 473 const size_t length = std::min(read_buffer.size(), write_buffer.size());
474 std::vector<PollFD> fds(static_cast<size_t>(nfds)); 474 std::vector<PollFD> fds(nfds);
475 std::memcpy(fds.data(), read_buffer.data(), length); 475 std::memcpy(fds.data(), read_buffer.data(), length);
476 476
477 if (timeout >= 0) { 477 if (timeout >= 0) {
@@ -497,7 +497,7 @@ std::pair<s32, Errno> BSD::PollImpl(std::vector<u8>& write_buffer, std::vector<u
497 return {0, Errno::SUCCESS}; 497 return {0, Errno::SUCCESS};
498 } 498 }
499 499
500 const std::optional<FileDescriptor>& descriptor = GetFileDescriptor(pollfd.fd); 500 const std::optional<FileDescriptor>& descriptor = file_descriptors[pollfd.fd];
501 if (!descriptor) { 501 if (!descriptor) {
502 LOG_ERROR(Service, "File descriptor handle={} is not allocated", pollfd.fd); 502 LOG_ERROR(Service, "File descriptor handle={} is not allocated", pollfd.fd);
503 pollfd.revents = POLL_NVAL; 503 pollfd.revents = POLL_NVAL;
@@ -508,7 +508,7 @@ std::pair<s32, Errno> BSD::PollImpl(std::vector<u8>& write_buffer, std::vector<u
508 std::vector<Network::PollFD> host_pollfds(fds.size()); 508 std::vector<Network::PollFD> host_pollfds(fds.size());
509 std::transform(fds.begin(), fds.end(), host_pollfds.begin(), [this](PollFD pollfd) { 509 std::transform(fds.begin(), fds.end(), host_pollfds.begin(), [this](PollFD pollfd) {
510 Network::PollFD result; 510 Network::PollFD result;
511 result.socket = GetFileDescriptor(pollfd.fd)->socket.get(); 511 result.socket = file_descriptors[pollfd.fd]->socket.get();
512 result.events = TranslatePollEventsToHost(pollfd.events); 512 result.events = TranslatePollEventsToHost(pollfd.events);
513 result.revents = 0; 513 result.revents = 0;
514 return result; 514 return result;
@@ -536,13 +536,13 @@ std::pair<s32, Errno> BSD::AcceptImpl(s32 fd, std::vector<u8>& write_buffer) {
536 return {-1, Errno::MFILE}; 536 return {-1, Errno::MFILE};
537 } 537 }
538 538
539 FileDescriptor& descriptor = *GetFileDescriptor(fd); 539 FileDescriptor& descriptor = *file_descriptors[fd];
540 auto [result, bsd_errno] = descriptor.socket->Accept(); 540 auto [result, bsd_errno] = descriptor.socket->Accept();
541 if (bsd_errno != Network::Errno::SUCCESS) { 541 if (bsd_errno != Network::Errno::SUCCESS) {
542 return {-1, Translate(bsd_errno)}; 542 return {-1, Translate(bsd_errno)};
543 } 543 }
544 544
545 FileDescriptor& new_descriptor = GetFileDescriptor(new_fd).emplace(); 545 FileDescriptor& new_descriptor = file_descriptors[new_fd].emplace();
546 new_descriptor.socket = std::move(result.socket); 546 new_descriptor.socket = std::move(result.socket);
547 new_descriptor.is_connection_based = descriptor.is_connection_based; 547 new_descriptor.is_connection_based = descriptor.is_connection_based;
548 548
@@ -561,7 +561,7 @@ Errno BSD::BindImpl(s32 fd, const std::vector<u8>& addr) {
561 SockAddrIn addr_in; 561 SockAddrIn addr_in;
562 std::memcpy(&addr_in, addr.data(), sizeof(addr_in)); 562 std::memcpy(&addr_in, addr.data(), sizeof(addr_in));
563 563
564 return Translate(GetFileDescriptor(fd)->socket->Bind(Translate(addr_in))); 564 return Translate(file_descriptors[fd]->socket->Bind(Translate(addr_in)));
565} 565}
566 566
567Errno BSD::ConnectImpl(s32 fd, const std::vector<u8>& addr) { 567Errno BSD::ConnectImpl(s32 fd, const std::vector<u8>& addr) {
@@ -573,7 +573,7 @@ Errno BSD::ConnectImpl(s32 fd, const std::vector<u8>& addr) {
573 SockAddrIn addr_in; 573 SockAddrIn addr_in;
574 std::memcpy(&addr_in, addr.data(), sizeof(addr_in)); 574 std::memcpy(&addr_in, addr.data(), sizeof(addr_in));
575 575
576 return Translate(GetFileDescriptor(fd)->socket->Connect(Translate(addr_in))); 576 return Translate(file_descriptors[fd]->socket->Connect(Translate(addr_in)));
577} 577}
578 578
579Errno BSD::GetPeerNameImpl(s32 fd, std::vector<u8>& write_buffer) { 579Errno BSD::GetPeerNameImpl(s32 fd, std::vector<u8>& write_buffer) {
@@ -581,7 +581,7 @@ Errno BSD::GetPeerNameImpl(s32 fd, std::vector<u8>& write_buffer) {
581 return Errno::BADF; 581 return Errno::BADF;
582 } 582 }
583 583
584 const auto [addr_in, bsd_errno] = GetFileDescriptor(fd)->socket->GetPeerName(); 584 const auto [addr_in, bsd_errno] = file_descriptors[fd]->socket->GetPeerName();
585 if (bsd_errno != Network::Errno::SUCCESS) { 585 if (bsd_errno != Network::Errno::SUCCESS) {
586 return Translate(bsd_errno); 586 return Translate(bsd_errno);
587 } 587 }
@@ -597,7 +597,7 @@ Errno BSD::GetSockNameImpl(s32 fd, std::vector<u8>& write_buffer) {
597 return Errno::BADF; 597 return Errno::BADF;
598 } 598 }
599 599
600 const auto [addr_in, bsd_errno] = GetFileDescriptor(fd)->socket->GetSockName(); 600 const auto [addr_in, bsd_errno] = file_descriptors[fd]->socket->GetSockName();
601 if (bsd_errno != Network::Errno::SUCCESS) { 601 if (bsd_errno != Network::Errno::SUCCESS) {
602 return Translate(bsd_errno); 602 return Translate(bsd_errno);
603 } 603 }
@@ -612,7 +612,7 @@ Errno BSD::ListenImpl(s32 fd, s32 backlog) {
612 if (!IsFileDescriptorValid(fd)) { 612 if (!IsFileDescriptorValid(fd)) {
613 return Errno::BADF; 613 return Errno::BADF;
614 } 614 }
615 return Translate(GetFileDescriptor(fd)->socket->Listen(backlog)); 615 return Translate(file_descriptors[fd]->socket->Listen(backlog));
616} 616}
617 617
618std::pair<s32, Errno> BSD::FcntlImpl(s32 fd, FcntlCmd cmd, s32 arg) { 618std::pair<s32, Errno> BSD::FcntlImpl(s32 fd, FcntlCmd cmd, s32 arg) {
@@ -620,14 +620,14 @@ std::pair<s32, Errno> BSD::FcntlImpl(s32 fd, FcntlCmd cmd, s32 arg) {
620 return {-1, Errno::BADF}; 620 return {-1, Errno::BADF};
621 } 621 }
622 622
623 FileDescriptor& descriptor = *GetFileDescriptor(fd); 623 FileDescriptor& descriptor = *file_descriptors[fd];
624 624
625 switch (cmd) { 625 switch (cmd) {
626 case FcntlCmd::GETFL: 626 case FcntlCmd::GETFL:
627 ASSERT(arg == 0); 627 ASSERT(arg == 0);
628 return {descriptor.flags, Errno::SUCCESS}; 628 return {descriptor.flags, Errno::SUCCESS};
629 case FcntlCmd::SETFL: { 629 case FcntlCmd::SETFL: {
630 const bool enable = (static_cast<u32>(arg) & FLAG_O_NONBLOCK) != 0; 630 const bool enable = (arg & FLAG_O_NONBLOCK) != 0;
631 const Errno bsd_errno = Translate(descriptor.socket->SetNonBlock(enable)); 631 const Errno bsd_errno = Translate(descriptor.socket->SetNonBlock(enable));
632 if (bsd_errno != Errno::SUCCESS) { 632 if (bsd_errno != Errno::SUCCESS) {
633 return {-1, bsd_errno}; 633 return {-1, bsd_errno};
@@ -648,7 +648,7 @@ Errno BSD::SetSockOptImpl(s32 fd, u32 level, OptName optname, size_t optlen, con
648 return Errno::BADF; 648 return Errno::BADF;
649 } 649 }
650 650
651 Network::Socket* const socket = GetFileDescriptor(fd)->socket.get(); 651 Network::Socket* const socket = file_descriptors[fd]->socket.get();
652 652
653 if (optname == OptName::LINGER) { 653 if (optname == OptName::LINGER) {
654 ASSERT(optlen == sizeof(Linger)); 654 ASSERT(optlen == sizeof(Linger));
@@ -689,14 +689,14 @@ Errno BSD::ShutdownImpl(s32 fd, s32 how) {
689 return Errno::BADF; 689 return Errno::BADF;
690 } 690 }
691 const Network::ShutdownHow host_how = Translate(static_cast<ShutdownHow>(how)); 691 const Network::ShutdownHow host_how = Translate(static_cast<ShutdownHow>(how));
692 return Translate(GetFileDescriptor(fd)->socket->Shutdown(host_how)); 692 return Translate(file_descriptors[fd]->socket->Shutdown(host_how));
693} 693}
694 694
695std::pair<s32, Errno> BSD::RecvImpl(s32 fd, u32 flags, std::vector<u8>& message) { 695std::pair<s32, Errno> BSD::RecvImpl(s32 fd, u32 flags, std::vector<u8>& message) {
696 if (!IsFileDescriptorValid(fd)) { 696 if (!IsFileDescriptorValid(fd)) {
697 return {-1, Errno::BADF}; 697 return {-1, Errno::BADF};
698 } 698 }
699 return Translate(GetFileDescriptor(fd)->socket->Recv(flags, message)); 699 return Translate(file_descriptors[fd]->socket->Recv(flags, message));
700} 700}
701 701
702std::pair<s32, Errno> BSD::RecvFromImpl(s32 fd, u32 flags, std::vector<u8>& message, 702std::pair<s32, Errno> BSD::RecvFromImpl(s32 fd, u32 flags, std::vector<u8>& message,
@@ -705,7 +705,7 @@ std::pair<s32, Errno> BSD::RecvFromImpl(s32 fd, u32 flags, std::vector<u8>& mess
705 return {-1, Errno::BADF}; 705 return {-1, Errno::BADF};
706 } 706 }
707 707
708 FileDescriptor& descriptor = *GetFileDescriptor(fd); 708 FileDescriptor& descriptor = *file_descriptors[fd];
709 709
710 Network::SockAddrIn addr_in{}; 710 Network::SockAddrIn addr_in{};
711 Network::SockAddrIn* p_addr_in = nullptr; 711 Network::SockAddrIn* p_addr_in = nullptr;
@@ -719,7 +719,7 @@ std::pair<s32, Errno> BSD::RecvFromImpl(s32 fd, u32 flags, std::vector<u8>& mess
719 // Apply flags 719 // Apply flags
720 if ((flags & FLAG_MSG_DONTWAIT) != 0) { 720 if ((flags & FLAG_MSG_DONTWAIT) != 0) {
721 flags &= ~FLAG_MSG_DONTWAIT; 721 flags &= ~FLAG_MSG_DONTWAIT;
722 if ((static_cast<u32>(descriptor.flags) & FLAG_O_NONBLOCK) == 0) { 722 if ((descriptor.flags & FLAG_O_NONBLOCK) == 0) {
723 descriptor.socket->SetNonBlock(true); 723 descriptor.socket->SetNonBlock(true);
724 } 724 }
725 } 725 }
@@ -727,7 +727,7 @@ std::pair<s32, Errno> BSD::RecvFromImpl(s32 fd, u32 flags, std::vector<u8>& mess
727 const auto [ret, bsd_errno] = Translate(descriptor.socket->RecvFrom(flags, message, p_addr_in)); 727 const auto [ret, bsd_errno] = Translate(descriptor.socket->RecvFrom(flags, message, p_addr_in));
728 728
729 // Restore original state 729 // Restore original state
730 if ((static_cast<u32>(descriptor.flags) & FLAG_O_NONBLOCK) == 0) { 730 if ((descriptor.flags & FLAG_O_NONBLOCK) == 0) {
731 descriptor.socket->SetNonBlock(false); 731 descriptor.socket->SetNonBlock(false);
732 } 732 }
733 733
@@ -748,7 +748,7 @@ std::pair<s32, Errno> BSD::SendImpl(s32 fd, u32 flags, const std::vector<u8>& me
748 if (!IsFileDescriptorValid(fd)) { 748 if (!IsFileDescriptorValid(fd)) {
749 return {-1, Errno::BADF}; 749 return {-1, Errno::BADF};
750 } 750 }
751 return Translate(GetFileDescriptor(fd)->socket->Send(message, flags)); 751 return Translate(file_descriptors[fd]->socket->Send(message, flags));
752} 752}
753 753
754std::pair<s32, Errno> BSD::SendToImpl(s32 fd, u32 flags, const std::vector<u8>& message, 754std::pair<s32, Errno> BSD::SendToImpl(s32 fd, u32 flags, const std::vector<u8>& message,
@@ -767,8 +767,7 @@ std::pair<s32, Errno> BSD::SendToImpl(s32 fd, u32 flags, const std::vector<u8>&
767 p_addr_in = &addr_in; 767 p_addr_in = &addr_in;
768 } 768 }
769 769
770 const auto& descriptor = GetFileDescriptor(fd); 770 return Translate(file_descriptors[fd]->socket->SendTo(flags, message, p_addr_in));
771 return Translate(descriptor->socket->SendTo(flags, message, p_addr_in));
772} 771}
773 772
774Errno BSD::CloseImpl(s32 fd) { 773Errno BSD::CloseImpl(s32 fd) {
@@ -776,21 +775,20 @@ Errno BSD::CloseImpl(s32 fd) {
776 return Errno::BADF; 775 return Errno::BADF;
777 } 776 }
778 777
779 auto& descriptor = GetFileDescriptor(fd); 778 const Errno bsd_errno = Translate(file_descriptors[fd]->socket->Close());
780 const Errno bsd_errno = Translate(descriptor->socket->Close());
781 if (bsd_errno != Errno::SUCCESS) { 779 if (bsd_errno != Errno::SUCCESS) {
782 return bsd_errno; 780 return bsd_errno;
783 } 781 }
784 782
785 LOG_INFO(Service, "Close socket fd={}", fd); 783 LOG_INFO(Service, "Close socket fd={}", fd);
786 784
787 descriptor.reset(); 785 file_descriptors[fd].reset();
788 return bsd_errno; 786 return bsd_errno;
789} 787}
790 788
791s32 BSD::FindFreeFileDescriptorHandle() noexcept { 789s32 BSD::FindFreeFileDescriptorHandle() noexcept {
792 for (s32 fd = 0; fd < static_cast<s32>(file_descriptors.size()); ++fd) { 790 for (s32 fd = 0; fd < static_cast<s32>(file_descriptors.size()); ++fd) {
793 if (!GetFileDescriptor(fd)) { 791 if (!file_descriptors[fd]) {
794 return fd; 792 return fd;
795 } 793 }
796 } 794 }
@@ -802,7 +800,7 @@ bool BSD::IsFileDescriptorValid(s32 fd) const noexcept {
802 LOG_ERROR(Service, "Invalid file descriptor handle={}", fd); 800 LOG_ERROR(Service, "Invalid file descriptor handle={}", fd);
803 return false; 801 return false;
804 } 802 }
805 if (!GetFileDescriptor(fd)) { 803 if (!file_descriptors[fd]) {
806 LOG_ERROR(Service, "File descriptor handle={} is not allocated", fd); 804 LOG_ERROR(Service, "File descriptor handle={} is not allocated", fd);
807 return false; 805 return false;
808 } 806 }
@@ -815,12 +813,10 @@ bool BSD::IsBlockingSocket(s32 fd) const noexcept {
815 if (fd > static_cast<s32>(MAX_FD) || fd < 0) { 813 if (fd > static_cast<s32>(MAX_FD) || fd < 0) {
816 return false; 814 return false;
817 } 815 }
818 816 if (!file_descriptors[fd]) {
819 const auto& descriptor = GetFileDescriptor(fd);
820 if (!descriptor) {
821 return false; 817 return false;
822 } 818 }
823 return (static_cast<u32>(descriptor->flags) & FLAG_O_NONBLOCK) != 0; 819 return (file_descriptors[fd]->flags & FLAG_O_NONBLOCK) != 0;
824} 820}
825 821
826void BSD::BuildErrnoResponse(Kernel::HLERequestContext& ctx, Errno bsd_errno) const noexcept { 822void BSD::BuildErrnoResponse(Kernel::HLERequestContext& ctx, Errno bsd_errno) const noexcept {
@@ -831,14 +827,6 @@ void BSD::BuildErrnoResponse(Kernel::HLERequestContext& ctx, Errno bsd_errno) co
831 rb.PushEnum(bsd_errno); 827 rb.PushEnum(bsd_errno);
832} 828}
833 829
834std::optional<BSD::FileDescriptor>& BSD::GetFileDescriptor(s32 fd) {
835 return file_descriptors[static_cast<u32>(fd)];
836}
837
838const std::optional<BSD::FileDescriptor>& BSD::GetFileDescriptor(s32 fd) const {
839 return file_descriptors[static_cast<u32>(fd)];
840}
841
842BSD::BSD(Core::System& system, const char* name) 830BSD::BSD(Core::System& system, const char* name)
843 : ServiceFramework(name), worker_pool{system, this} { 831 : ServiceFramework(name), worker_pool{system, this} {
844 // clang-format off 832 // clang-format off
diff --git a/src/core/hle/service/sockets/bsd.h b/src/core/hle/service/sockets/bsd.h
index ac9523d83..357531951 100644
--- a/src/core/hle/service/sockets/bsd.h
+++ b/src/core/hle/service/sockets/bsd.h
@@ -167,9 +167,6 @@ private:
167 167
168 void BuildErrnoResponse(Kernel::HLERequestContext& ctx, Errno bsd_errno) const noexcept; 168 void BuildErrnoResponse(Kernel::HLERequestContext& ctx, Errno bsd_errno) const noexcept;
169 169
170 std::optional<FileDescriptor>& GetFileDescriptor(s32 fd);
171 const std::optional<FileDescriptor>& GetFileDescriptor(s32 fd) const;
172
173 std::array<std::optional<FileDescriptor>, MAX_FD> file_descriptors; 170 std::array<std::optional<FileDescriptor>, MAX_FD> file_descriptors;
174 171
175 BlockingWorkerPool<BSD, PollWork, AcceptWork, ConnectWork, RecvWork, RecvFromWork, SendWork, 172 BlockingWorkerPool<BSD, PollWork, AcceptWork, ConnectWork, RecvWork, RecvFromWork, SendWork,
diff --git a/src/core/hle/service/sockets/sockets_translate.cpp b/src/core/hle/service/sockets/sockets_translate.cpp
index 50c2a455d..2e626fd86 100644
--- a/src/core/hle/service/sockets/sockets_translate.cpp
+++ b/src/core/hle/service/sockets/sockets_translate.cpp
@@ -64,7 +64,6 @@ Network::Type Translate(Type type) {
64 return Network::Type::DGRAM; 64 return Network::Type::DGRAM;
65 default: 65 default:
66 UNIMPLEMENTED_MSG("Unimplemented type={}", static_cast<int>(type)); 66 UNIMPLEMENTED_MSG("Unimplemented type={}", static_cast<int>(type));
67 return {};
68 } 67 }
69} 68}
70 69
diff --git a/src/core/hle/service/time/time_zone_manager.cpp b/src/core/hle/service/time/time_zone_manager.cpp
index df0ed924d..bdf0439f2 100644
--- a/src/core/hle/service/time/time_zone_manager.cpp
+++ b/src/core/hle/service/time/time_zone_manager.cpp
@@ -117,8 +117,7 @@ static constexpr int GetMonthLength(bool is_leap_year, int month) {
117 constexpr std::array<int, 12> month_lengths{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 117 constexpr std::array<int, 12> month_lengths{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
118 constexpr std::array<int, 12> month_lengths_leap{31, 29, 31, 30, 31, 30, 118 constexpr std::array<int, 12> month_lengths_leap{31, 29, 31, 30, 31, 30,
119 31, 31, 30, 31, 30, 31}; 119 31, 31, 30, 31, 30, 31};
120 const auto month_index = static_cast<u32>(month); 120 return is_leap_year ? month_lengths_leap[month] : month_lengths[month];
121 return is_leap_year ? month_lengths_leap[month_index] : month_lengths[month_index];
122} 121}
123 122
124static constexpr bool IsDigit(char value) { 123static constexpr bool IsDigit(char value) {
@@ -321,7 +320,7 @@ static bool ParsePosixName(const char* name, TimeZoneRule& rule) {
321 int dest_len{}; 320 int dest_len{};
322 int dest_offset{}; 321 int dest_offset{};
323 const char* dest_name{name + offset}; 322 const char* dest_name{name + offset};
324 if (rule.chars.size() < static_cast<std::size_t>(char_count)) { 323 if (rule.chars.size() < std::size_t(char_count)) {
325 return {}; 324 return {};
326 } 325 }
327 326
@@ -344,7 +343,7 @@ static bool ParsePosixName(const char* name, TimeZoneRule& rule) {
344 return {}; 343 return {};
345 } 344 }
346 char_count += dest_len + 1; 345 char_count += dest_len + 1;
347 if (rule.chars.size() < static_cast<std::size_t>(char_count)) { 346 if (rule.chars.size() < std::size_t(char_count)) {
348 return {}; 347 return {};
349 } 348 }
350 if (name[offset] != '\0' && name[offset] != ',' && name[offset] != ';') { 349 if (name[offset] != '\0' && name[offset] != ',' && name[offset] != ';') {
@@ -387,7 +386,7 @@ static bool ParsePosixName(const char* name, TimeZoneRule& rule) {
387 rule.default_type = 0; 386 rule.default_type = 0;
388 387
389 s64 jan_first{}; 388 s64 jan_first{};
390 u32 time_count{}; 389 int time_count{};
391 int jan_offset{}; 390 int jan_offset{};
392 int year_beginning{epoch_year}; 391 int year_beginning{epoch_year};
393 do { 392 do {
@@ -415,7 +414,7 @@ static bool ParsePosixName(const char* name, TimeZoneRule& rule) {
415 if (is_reversed || 414 if (is_reversed ||
416 (start_time < end_time && 415 (start_time < end_time &&
417 (end_time - start_time < (year_seconds + (std_offset - dest_offset))))) { 416 (end_time - start_time < (year_seconds + (std_offset - dest_offset))))) {
418 if (rule.ats.size() - 2 < time_count) { 417 if (rule.ats.size() - 2 < std::size_t(time_count)) {
419 break; 418 break;
420 } 419 }
421 420
@@ -439,7 +438,7 @@ static bool ParsePosixName(const char* name, TimeZoneRule& rule) {
439 } 438 }
440 jan_offset = 0; 439 jan_offset = 0;
441 } 440 }
442 rule.time_count = static_cast<s32>(time_count); 441 rule.time_count = time_count;
443 if (time_count == 0) { 442 if (time_count == 0) {
444 rule.type_count = 1; 443 rule.type_count = 1;
445 } else if (years_per_repeat < year - year_beginning) { 444 } else if (years_per_repeat < year - year_beginning) {
@@ -452,30 +451,26 @@ static bool ParsePosixName(const char* name, TimeZoneRule& rule) {
452 } 451 }
453 452
454 s64 their_std_offset{}; 453 s64 their_std_offset{};
455 for (u32 index = 0; index < static_cast<u32>(rule.time_count); ++index) { 454 for (int index{}; index < rule.time_count; ++index) {
456 const s8 type{rule.types[index]}; 455 const s8 type{rule.types[index]};
457 const auto& tti = rule.ttis[static_cast<u8>(type)]; 456 if (rule.ttis[type].is_standard_time_daylight) {
458 457 their_std_offset = -rule.ttis[type].gmt_offset;
459 if (tti.is_standard_time_daylight) {
460 their_std_offset = -tti.gmt_offset;
461 } 458 }
462 } 459 }
463 460
464 s64 their_offset{their_std_offset}; 461 s64 their_offset{their_std_offset};
465 for (u32 index = 0; index < static_cast<u32>(rule.time_count); ++index) { 462 for (int index{}; index < rule.time_count; ++index) {
466 const s8 type{rule.types[index]}; 463 const s8 type{rule.types[index]};
467 const auto& tti = rule.ttis[static_cast<u8>(type)]; 464 rule.types[index] = rule.ttis[type].is_dst ? 1 : 0;
468 465 if (!rule.ttis[type].is_gmt) {
469 rule.types[index] = tti.is_dst ? 1 : 0; 466 if (!rule.ttis[type].is_standard_time_daylight) {
470 if (!tti.is_gmt) {
471 if (!tti.is_standard_time_daylight) {
472 rule.ats[index] += dest_offset - their_std_offset; 467 rule.ats[index] += dest_offset - their_std_offset;
473 } else { 468 } else {
474 rule.ats[index] += std_offset - their_std_offset; 469 rule.ats[index] += std_offset - their_std_offset;
475 } 470 }
476 } 471 }
477 their_offset = -tti.gmt_offset; 472 their_offset = -rule.ttis[type].gmt_offset;
478 if (!tti.is_dst) { 473 if (!rule.ttis[type].is_dst) {
479 their_std_offset = their_offset; 474 their_std_offset = their_offset;
480 } 475 }
481 } 476 }
@@ -499,16 +494,16 @@ static bool ParsePosixName(const char* name, TimeZoneRule& rule) {
499 } 494 }
500 495
501 rule.char_count = char_count; 496 rule.char_count = char_count;
502 for (std::size_t index = 0; index < static_cast<std::size_t>(std_len); ++index) { 497 for (int index{}; index < std_len; ++index) {
503 rule.chars[index] = std_name[index]; 498 rule.chars[index] = std_name[index];
504 } 499 }
505 500
506 rule.chars[static_cast<size_t>(std_len++)] = '\0'; 501 rule.chars[std_len++] = '\0';
507 if (dest_len != 0) { 502 if (dest_len != 0) {
508 for (int index = 0; index < dest_len; ++index) { 503 for (int index{}; index < dest_len; ++index) {
509 rule.chars[static_cast<std::size_t>(std_len + index)] = dest_name[index]; 504 rule.chars[std_len + index] = dest_name[index];
510 } 505 }
511 rule.chars[static_cast<std::size_t>(std_len + dest_len)] = '\0'; 506 rule.chars[std_len + dest_len] = '\0';
512 } 507 }
513 508
514 return true; 509 return true;
@@ -536,33 +531,33 @@ static bool ParseTimeZoneBinary(TimeZoneRule& time_zone_rule, FileSys::VirtualFi
536 531
537 int time_count{}; 532 int time_count{};
538 u64 read_offset = sizeof(TzifHeader); 533 u64 read_offset = sizeof(TzifHeader);
539 for (size_t index = 0; index < static_cast<size_t>(time_zone_rule.time_count); ++index) { 534 for (int index{}; index < time_zone_rule.time_count; ++index) {
540 s64_be at{}; 535 s64_be at{};
541 vfs_file->ReadObject<s64_be>(&at, read_offset); 536 vfs_file->ReadObject<s64_be>(&at, read_offset);
542 time_zone_rule.types[index] = 1; 537 time_zone_rule.types[index] = 1;
543 if (time_count != 0 && at <= time_zone_rule.ats[static_cast<size_t>(time_count) - 1]) { 538 if (time_count != 0 && at <= time_zone_rule.ats[time_count - 1]) {
544 if (at < time_zone_rule.ats[static_cast<size_t>(time_count) - 1]) { 539 if (at < time_zone_rule.ats[time_count - 1]) {
545 return {}; 540 return {};
546 } 541 }
547 time_zone_rule.types[index - 1] = 0; 542 time_zone_rule.types[index - 1] = 0;
548 time_count--; 543 time_count--;
549 } 544 }
550 time_zone_rule.ats[static_cast<size_t>(time_count++)] = at; 545 time_zone_rule.ats[time_count++] = at;
551 read_offset += sizeof(s64_be); 546 read_offset += sizeof(s64_be);
552 } 547 }
553 time_count = 0; 548 time_count = 0;
554 for (size_t index = 0; index < static_cast<size_t>(time_zone_rule.time_count); ++index) { 549 for (int index{}; index < time_zone_rule.time_count; ++index) {
555 const auto type{static_cast<s8>(*vfs_file->ReadByte(read_offset))}; 550 const u8 type{*vfs_file->ReadByte(read_offset)};
556 read_offset += sizeof(s8); 551 read_offset += sizeof(u8);
557 if (time_zone_rule.time_count <= type) { 552 if (time_zone_rule.time_count <= type) {
558 return {}; 553 return {};
559 } 554 }
560 if (time_zone_rule.types[index] != 0) { 555 if (time_zone_rule.types[index] != 0) {
561 time_zone_rule.types[static_cast<size_t>(time_count++)] = type; 556 time_zone_rule.types[time_count++] = type;
562 } 557 }
563 } 558 }
564 time_zone_rule.time_count = time_count; 559 time_zone_rule.time_count = time_count;
565 for (size_t index = 0; index < static_cast<size_t>(time_zone_rule.type_count); ++index) { 560 for (int index{}; index < time_zone_rule.type_count; ++index) {
566 TimeTypeInfo& ttis{time_zone_rule.ttis[index]}; 561 TimeTypeInfo& ttis{time_zone_rule.ttis[index]};
567 u32_be gmt_offset{}; 562 u32_be gmt_offset{};
568 vfs_file->ReadObject<u32_be>(&gmt_offset, read_offset); 563 vfs_file->ReadObject<u32_be>(&gmt_offset, read_offset);
@@ -584,11 +579,10 @@ static bool ParseTimeZoneBinary(TimeZoneRule& time_zone_rule, FileSys::VirtualFi
584 ttis.abbreviation_list_index = abbreviation_list_index; 579 ttis.abbreviation_list_index = abbreviation_list_index;
585 } 580 }
586 581
587 vfs_file->ReadArray(time_zone_rule.chars.data(), static_cast<u32>(time_zone_rule.char_count), 582 vfs_file->ReadArray(time_zone_rule.chars.data(), time_zone_rule.char_count, read_offset);
588 read_offset); 583 time_zone_rule.chars[time_zone_rule.char_count] = '\0';
589 time_zone_rule.chars[static_cast<u32>(time_zone_rule.char_count)] = '\0'; 584 read_offset += time_zone_rule.char_count;
590 read_offset += static_cast<u64>(time_zone_rule.char_count); 585 for (int index{}; index < time_zone_rule.type_count; ++index) {
591 for (size_t index = 0; index < static_cast<size_t>(time_zone_rule.type_count); ++index) {
592 if (header.ttis_std_count == 0) { 586 if (header.ttis_std_count == 0) {
593 time_zone_rule.ttis[index].is_standard_time_daylight = false; 587 time_zone_rule.ttis[index].is_standard_time_daylight = false;
594 } else { 588 } else {
@@ -601,7 +595,7 @@ static bool ParseTimeZoneBinary(TimeZoneRule& time_zone_rule, FileSys::VirtualFi
601 } 595 }
602 } 596 }
603 597
604 for (size_t index = 0; index < static_cast<size_t>(time_zone_rule.type_count); ++index) { 598 for (int index{}; index < time_zone_rule.type_count; ++index) {
605 if (header.ttis_std_count == 0) { 599 if (header.ttis_std_count == 0) {
606 time_zone_rule.ttis[index].is_gmt = false; 600 time_zone_rule.ttis[index].is_gmt = false;
607 } else { 601 } else {
@@ -625,14 +619,13 @@ static bool ParseTimeZoneBinary(TimeZoneRule& time_zone_rule, FileSys::VirtualFi
625 } 619 }
626 620
627 std::array<char, time_zone_name_max + 1> temp_name{}; 621 std::array<char, time_zone_name_max + 1> temp_name{};
628 vfs_file->ReadArray(temp_name.data(), static_cast<size_t>(bytes_read), read_offset); 622 vfs_file->ReadArray(temp_name.data(), bytes_read, read_offset);
629 if (bytes_read > 2 && temp_name[0] == '\n' && 623 if (bytes_read > 2 && temp_name[0] == '\n' && temp_name[bytes_read - 1] == '\n' &&
630 temp_name[static_cast<u64>(bytes_read - 1)] == '\n' && 624 std::size_t(time_zone_rule.type_count) + 2 <= time_zone_rule.ttis.size()) {
631 static_cast<std::size_t>(time_zone_rule.type_count) + 2 <= time_zone_rule.ttis.size()) { 625 temp_name[bytes_read - 1] = '\0';
632 temp_name[static_cast<u64>(bytes_read - 1)] = '\0';
633 626
634 std::array<char, time_zone_name_max> name{}; 627 std::array<char, time_zone_name_max> name{};
635 std::memcpy(name.data(), temp_name.data() + 1, static_cast<std::size_t>(bytes_read - 1)); 628 std::memcpy(name.data(), temp_name.data() + 1, std::size_t(bytes_read - 1));
636 629
637 TimeZoneRule temp_rule; 630 TimeZoneRule temp_rule;
638 if (ParsePosixName(name.data(), temp_rule)) { 631 if (ParsePosixName(name.data(), temp_rule)) {
@@ -649,24 +642,24 @@ static bool ParseTimeZoneBinary(TimeZoneRule& time_zone_rule, FileSys::VirtualFi
649 s32 default_type{}; 642 s32 default_type{};
650 643
651 for (default_type = 0; default_type < time_zone_rule.time_count; default_type++) { 644 for (default_type = 0; default_type < time_zone_rule.time_count; default_type++) {
652 if (time_zone_rule.types[static_cast<u32>(default_type)] == 0) { 645 if (time_zone_rule.types[default_type] == 0) {
653 break; 646 break;
654 } 647 }
655 } 648 }
656 649
657 default_type = default_type < time_zone_rule.time_count ? -1 : 0; 650 default_type = default_type < time_zone_rule.time_count ? -1 : 0;
658 if (default_type < 0 && time_zone_rule.time_count > 0 && 651 if (default_type < 0 && time_zone_rule.time_count > 0 &&
659 time_zone_rule.ttis[static_cast<u8>(time_zone_rule.types[0])].is_dst) { 652 time_zone_rule.ttis[time_zone_rule.types[0]].is_dst) {
660 default_type = time_zone_rule.types[0]; 653 default_type = time_zone_rule.types[0];
661 while (--default_type >= 0) { 654 while (--default_type >= 0) {
662 if (!time_zone_rule.ttis[static_cast<u32>(default_type)].is_dst) { 655 if (!time_zone_rule.ttis[default_type].is_dst) {
663 break; 656 break;
664 } 657 }
665 } 658 }
666 } 659 }
667 if (default_type < 0) { 660 if (default_type < 0) {
668 default_type = 0; 661 default_type = 0;
669 while (time_zone_rule.ttis[static_cast<u32>(default_type)].is_dst) { 662 while (time_zone_rule.ttis[default_type].is_dst) {
670 if (++default_type >= time_zone_rule.type_count) { 663 if (++default_type >= time_zone_rule.type_count) {
671 default_type = 0; 664 default_type = 0;
672 break; 665 break;
@@ -756,12 +749,12 @@ static ResultCode ToCalendarTimeInternal(const TimeZoneRule& rules, s64 time,
756 CalendarTimeInternal& calendar_time, 749 CalendarTimeInternal& calendar_time,
757 CalendarAdditionalInfo& calendar_additional_info) { 750 CalendarAdditionalInfo& calendar_additional_info) {
758 if ((rules.go_ahead && time < rules.ats[0]) || 751 if ((rules.go_ahead && time < rules.ats[0]) ||
759 (rules.go_back && time > rules.ats[static_cast<size_t>(rules.time_count - 1)])) { 752 (rules.go_back && time > rules.ats[rules.time_count - 1])) {
760 s64 seconds{}; 753 s64 seconds{};
761 if (time < rules.ats[0]) { 754 if (time < rules.ats[0]) {
762 seconds = rules.ats[0] - time; 755 seconds = rules.ats[0] - time;
763 } else { 756 } else {
764 seconds = time - rules.ats[static_cast<size_t>(rules.time_count - 1)]; 757 seconds = time - rules.ats[rules.time_count - 1];
765 } 758 }
766 seconds--; 759 seconds--;
767 760
@@ -774,8 +767,7 @@ static ResultCode ToCalendarTimeInternal(const TimeZoneRule& rules, s64 time,
774 } else { 767 } else {
775 new_time -= seconds; 768 new_time -= seconds;
776 } 769 }
777 if (new_time < rules.ats[0] && 770 if (new_time < rules.ats[0] && new_time > rules.ats[rules.time_count - 1]) {
778 new_time > rules.ats[static_cast<size_t>(rules.time_count - 1)]) {
779 return ERROR_TIME_NOT_FOUND; 771 return ERROR_TIME_NOT_FOUND;
780 } 772 }
781 if (const ResultCode result{ 773 if (const ResultCode result{
@@ -799,27 +791,25 @@ static ResultCode ToCalendarTimeInternal(const TimeZoneRule& rules, s64 time,
799 s32 low{1}; 791 s32 low{1};
800 s32 high{rules.time_count}; 792 s32 high{rules.time_count};
801 while (low < high) { 793 while (low < high) {
802 const s32 mid{(low + high) >> 1}; 794 s32 mid{(low + high) >> 1};
803 if (time < rules.ats[static_cast<size_t>(mid)]) { 795 if (time < rules.ats[mid]) {
804 high = mid; 796 high = mid;
805 } else { 797 } else {
806 low = mid + 1; 798 low = mid + 1;
807 } 799 }
808 } 800 }
809 tti_index = rules.types[static_cast<size_t>(low - 1)]; 801 tti_index = rules.types[low - 1];
810 } 802 }
811 803
812 if (const ResultCode result{ 804 if (const ResultCode result{CreateCalendarTime(time, rules.ttis[tti_index].gmt_offset,
813 CreateCalendarTime(time, rules.ttis[static_cast<u32>(tti_index)].gmt_offset, 805 calendar_time, calendar_additional_info)};
814 calendar_time, calendar_additional_info)};
815 result != RESULT_SUCCESS) { 806 result != RESULT_SUCCESS) {
816 return result; 807 return result;
817 } 808 }
818 809
819 const auto& tti = rules.ttis[static_cast<size_t>(tti_index)]; 810 calendar_additional_info.is_dst = rules.ttis[tti_index].is_dst;
820 calendar_additional_info.is_dst = tti.is_dst; 811 const char* time_zone{&rules.chars[rules.ttis[tti_index].abbreviation_list_index]};
821 const char* time_zone{&rules.chars[static_cast<size_t>(tti.abbreviation_list_index)]}; 812 for (int index{}; time_zone[index] != '\0'; ++index) {
822 for (size_t index = 0; time_zone[index] != '\0'; ++index) {
823 calendar_additional_info.timezone_name[index] = time_zone[index]; 813 calendar_additional_info.timezone_name[index] = time_zone[index];
824 } 814 }
825 return RESULT_SUCCESS; 815 return RESULT_SUCCESS;
diff --git a/src/core/hle/service/time/time_zone_service.cpp b/src/core/hle/service/time/time_zone_service.cpp
index 8a0227021..ff3a10b3e 100644
--- a/src/core/hle/service/time/time_zone_service.cpp
+++ b/src/core/hle/service/time/time_zone_service.cpp
@@ -49,12 +49,12 @@ void ITimeZoneService::LoadTimeZoneRule(Kernel::HLERequestContext& ctx) {
49 const auto raw_location_name{rp.PopRaw<std::array<u8, 0x24>>()}; 49 const auto raw_location_name{rp.PopRaw<std::array<u8, 0x24>>()};
50 50
51 std::string location_name; 51 std::string location_name;
52 for (const auto byte : raw_location_name) { 52 for (const auto& byte : raw_location_name) {
53 // Strip extra bytes 53 // Strip extra bytes
54 if (byte == '\0') { 54 if (byte == '\0') {
55 break; 55 break;
56 } 56 }
57 location_name.push_back(static_cast<char>(byte)); 57 location_name.push_back(byte);
58 } 58 }
59 59
60 LOG_DEBUG(Service_Time, "called, location_name={}", location_name); 60 LOG_DEBUG(Service_Time, "called, location_name={}", location_name);
diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp
index 86d0527fc..dca1fcb18 100644
--- a/src/core/loader/elf.cpp
+++ b/src/core/loader/elf.cpp
@@ -220,19 +220,18 @@ public:
220 } 220 }
221 const char* GetSectionName(int section) const; 221 const char* GetSectionName(int section) const;
222 const u8* GetSectionDataPtr(int section) const { 222 const u8* GetSectionDataPtr(int section) const {
223 if (section < 0 || section >= header->e_shnum) { 223 if (section < 0 || section >= header->e_shnum)
224 return nullptr;
225 if (sections[section].sh_type != SHT_NOBITS)
226 return GetPtr(sections[section].sh_offset);
227 else
224 return nullptr; 228 return nullptr;
225 }
226 if (sections[section].sh_type != SHT_NOBITS) {
227 return GetPtr(static_cast<int>(sections[section].sh_offset));
228 }
229 return nullptr;
230 } 229 }
231 bool IsCodeSection(int section) const { 230 bool IsCodeSection(int section) const {
232 return sections[section].sh_type == SHT_PROGBITS; 231 return sections[section].sh_type == SHT_PROGBITS;
233 } 232 }
234 const u8* GetSegmentPtr(int segment) { 233 const u8* GetSegmentPtr(int segment) {
235 return GetPtr(static_cast<int>(segments[segment].p_offset)); 234 return GetPtr(segments[segment].p_offset);
236 } 235 }
237 u32 GetSectionAddr(SectionID section) const { 236 u32 GetSectionAddr(SectionID section) const {
238 return sectionAddrs[section]; 237 return sectionAddrs[section];
@@ -259,14 +258,14 @@ ElfReader::ElfReader(void* ptr) {
259} 258}
260 259
261const char* ElfReader::GetSectionName(int section) const { 260const char* ElfReader::GetSectionName(int section) const {
262 if (sections[section].sh_type == SHT_NULL) { 261 if (sections[section].sh_type == SHT_NULL)
263 return nullptr; 262 return nullptr;
264 }
265 263
266 const auto name_offset = sections[section].sh_name; 264 int name_offset = sections[section].sh_name;
267 if (const auto* ptr = reinterpret_cast<const char*>(GetSectionDataPtr(header->e_shstrndx))) { 265 const char* ptr = reinterpret_cast<const char*>(GetSectionDataPtr(header->e_shstrndx));
266
267 if (ptr)
268 return ptr + name_offset; 268 return ptr + name_offset;
269 }
270 269
271 return nullptr; 270 return nullptr;
272} 271}
@@ -292,7 +291,7 @@ Kernel::CodeSet ElfReader::LoadInto(VAddr vaddr) {
292 for (unsigned int i = 0; i < header->e_phnum; ++i) { 291 for (unsigned int i = 0; i < header->e_phnum; ++i) {
293 const Elf32_Phdr* p = &segments[i]; 292 const Elf32_Phdr* p = &segments[i];
294 if (p->p_type == PT_LOAD) { 293 if (p->p_type == PT_LOAD) {
295 total_image_size += (p->p_memsz + 0xFFF) & ~0xFFFU; 294 total_image_size += (p->p_memsz + 0xFFF) & ~0xFFF;
296 } 295 }
297 } 296 }
298 297
@@ -301,14 +300,14 @@ Kernel::CodeSet ElfReader::LoadInto(VAddr vaddr) {
301 300
302 Kernel::CodeSet codeset; 301 Kernel::CodeSet codeset;
303 302
304 for (u32 i = 0; i < header->e_phnum; ++i) { 303 for (unsigned int i = 0; i < header->e_phnum; ++i) {
305 const Elf32_Phdr* p = &segments[i]; 304 const Elf32_Phdr* p = &segments[i];
306 LOG_DEBUG(Loader, "Type: {} Vaddr: {:08X} Filesz: {:08X} Memsz: {:08X} ", p->p_type, 305 LOG_DEBUG(Loader, "Type: {} Vaddr: {:08X} Filesz: {:08X} Memsz: {:08X} ", p->p_type,
307 p->p_vaddr, p->p_filesz, p->p_memsz); 306 p->p_vaddr, p->p_filesz, p->p_memsz);
308 307
309 if (p->p_type == PT_LOAD) { 308 if (p->p_type == PT_LOAD) {
310 Kernel::CodeSet::Segment* codeset_segment; 309 Kernel::CodeSet::Segment* codeset_segment;
311 const u32 permission_flags = p->p_flags & (PF_R | PF_W | PF_X); 310 u32 permission_flags = p->p_flags & (PF_R | PF_W | PF_X);
312 if (permission_flags == (PF_R | PF_X)) { 311 if (permission_flags == (PF_R | PF_X)) {
313 codeset_segment = &codeset.CodeSegment(); 312 codeset_segment = &codeset.CodeSegment();
314 } else if (permission_flags == (PF_R)) { 313 } else if (permission_flags == (PF_R)) {
@@ -330,14 +329,14 @@ Kernel::CodeSet ElfReader::LoadInto(VAddr vaddr) {
330 } 329 }
331 330
332 const VAddr segment_addr = base_addr + p->p_vaddr; 331 const VAddr segment_addr = base_addr + p->p_vaddr;
333 const u32 aligned_size = (p->p_memsz + 0xFFF) & ~0xFFFU; 332 const u32 aligned_size = (p->p_memsz + 0xFFF) & ~0xFFF;
334 333
335 codeset_segment->offset = current_image_position; 334 codeset_segment->offset = current_image_position;
336 codeset_segment->addr = segment_addr; 335 codeset_segment->addr = segment_addr;
337 codeset_segment->size = aligned_size; 336 codeset_segment->size = aligned_size;
338 337
339 std::memcpy(program_image.data() + current_image_position, 338 std::memcpy(program_image.data() + current_image_position, GetSegmentPtr(i),
340 GetSegmentPtr(static_cast<int>(i)), p->p_filesz); 339 p->p_filesz);
341 current_image_position += aligned_size; 340 current_image_position += aligned_size;
342 } 341 }
343 } 342 }
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index 2ce12df88..b88aa5c40 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -197,7 +197,7 @@ struct Memory::Impl {
197 std::string string; 197 std::string string;
198 string.reserve(max_length); 198 string.reserve(max_length);
199 for (std::size_t i = 0; i < max_length; ++i) { 199 for (std::size_t i = 0; i < max_length; ++i) {
200 const auto c = static_cast<char>(Read8(vaddr)); 200 const char c = Read8(vaddr);
201 if (c == '\0') { 201 if (c == '\0') {
202 break; 202 break;
203 } 203 }
diff --git a/src/core/network/network.cpp b/src/core/network/network.cpp
index d280f7a28..4b3bb4366 100644
--- a/src/core/network/network.cpp
+++ b/src/core/network/network.cpp
@@ -96,7 +96,7 @@ int LastError() {
96 96
97bool EnableNonBlock(SOCKET fd, bool enable) { 97bool EnableNonBlock(SOCKET fd, bool enable) {
98 u_long value = enable ? 1 : 0; 98 u_long value = enable ? 1 : 0;
99 return ioctlsocket(fd, static_cast<long>(FIONBIO), &value) != SOCKET_ERROR; 99 return ioctlsocket(fd, FIONBIO, &value) != SOCKET_ERROR;
100} 100}
101 101
102#elif __unix__ // ^ _WIN32 v __unix__ 102#elif __unix__ // ^ _WIN32 v __unix__
@@ -140,9 +140,7 @@ sockaddr TranslateFromSockAddrIn(SockAddrIn input) {
140 140
141 result.sin_port = htons(input.portno); 141 result.sin_port = htons(input.portno);
142 142
143 result.sin_addr.s_addr = static_cast<in_addr_t>( 143 result.sin_addr.s_addr = input.ip[0] | input.ip[1] << 8 | input.ip[2] << 16 | input.ip[3] << 24;
144 input.ip[0] | static_cast<u32>(input.ip[1] << 8) | static_cast<u32>(input.ip[2] << 16) |
145 static_cast<u32>(input.ip[3] << 24));
146 144
147 sockaddr addr; 145 sockaddr addr;
148 std::memcpy(&addr, &result, sizeof(addr)); 146 std::memcpy(&addr, &result, sizeof(addr));
@@ -150,7 +148,7 @@ sockaddr TranslateFromSockAddrIn(SockAddrIn input) {
150} 148}
151 149
152int WSAPoll(WSAPOLLFD* fds, ULONG nfds, int timeout) { 150int WSAPoll(WSAPOLLFD* fds, ULONG nfds, int timeout) {
153 return poll(fds, static_cast<nfds_t>(nfds), timeout); 151 return poll(fds, nfds, timeout);
154} 152}
155 153
156int closesocket(SOCKET fd) { 154int closesocket(SOCKET fd) {
@@ -160,7 +158,7 @@ int closesocket(SOCKET fd) {
160linger MakeLinger(bool enable, u32 linger_value) { 158linger MakeLinger(bool enable, u32 linger_value) {
161 linger value; 159 linger value;
162 value.l_onoff = enable ? 1 : 0; 160 value.l_onoff = enable ? 1 : 0;
163 value.l_linger = static_cast<s32>(linger_value); 161 value.l_linger = linger_value;
164 return value; 162 return value;
165} 163}
166 164
@@ -339,7 +337,7 @@ std::pair<s32, Errno> Poll(std::vector<PollFD>& pollfds, s32 timeout) {
339 std::transform(pollfds.begin(), pollfds.end(), host_pollfds.begin(), [](PollFD fd) { 337 std::transform(pollfds.begin(), pollfds.end(), host_pollfds.begin(), [](PollFD fd) {
340 WSAPOLLFD result; 338 WSAPOLLFD result;
341 result.fd = fd.socket->fd; 339 result.fd = fd.socket->fd;
342 result.events = static_cast<s16>(TranslatePollEvents(fd.events)); 340 result.events = TranslatePollEvents(fd.events);
343 result.revents = 0; 341 result.revents = 0;
344 return result; 342 return result;
345 }); 343 });
@@ -501,12 +499,12 @@ Errno Socket::Shutdown(ShutdownHow how) {
501 } 499 }
502} 500}
503 501
504std::pair<s32, Errno> Socket::Recv(u32 flags, std::vector<u8>& message) { 502std::pair<s32, Errno> Socket::Recv(int flags, std::vector<u8>& message) {
505 ASSERT(flags == 0); 503 ASSERT(flags == 0);
506 ASSERT(message.size() < static_cast<size_t>(std::numeric_limits<int>::max())); 504 ASSERT(message.size() < static_cast<size_t>(std::numeric_limits<int>::max()));
507 505
508 const auto result = recv(fd, reinterpret_cast<char*>(message.data()), 506 const auto result =
509 static_cast<socklen_t>(message.size()), 0); 507 recv(fd, reinterpret_cast<char*>(message.data()), static_cast<int>(message.size()), 0);
510 if (result != SOCKET_ERROR) { 508 if (result != SOCKET_ERROR) {
511 return {static_cast<s32>(result), Errno::SUCCESS}; 509 return {static_cast<s32>(result), Errno::SUCCESS};
512 } 510 }
@@ -524,7 +522,7 @@ std::pair<s32, Errno> Socket::Recv(u32 flags, std::vector<u8>& message) {
524 } 522 }
525} 523}
526 524
527std::pair<s32, Errno> Socket::RecvFrom(u32 flags, std::vector<u8>& message, SockAddrIn* addr) { 525std::pair<s32, Errno> Socket::RecvFrom(int flags, std::vector<u8>& message, SockAddrIn* addr) {
528 ASSERT(flags == 0); 526 ASSERT(flags == 0);
529 ASSERT(message.size() < static_cast<size_t>(std::numeric_limits<int>::max())); 527 ASSERT(message.size() < static_cast<size_t>(std::numeric_limits<int>::max()));
530 528
@@ -534,7 +532,7 @@ std::pair<s32, Errno> Socket::RecvFrom(u32 flags, std::vector<u8>& message, Sock
534 sockaddr* const p_addr_in = addr ? &addr_in : nullptr; 532 sockaddr* const p_addr_in = addr ? &addr_in : nullptr;
535 533
536 const auto result = recvfrom(fd, reinterpret_cast<char*>(message.data()), 534 const auto result = recvfrom(fd, reinterpret_cast<char*>(message.data()),
537 static_cast<socklen_t>(message.size()), 0, p_addr_in, p_addrlen); 535 static_cast<int>(message.size()), 0, p_addr_in, p_addrlen);
538 if (result != SOCKET_ERROR) { 536 if (result != SOCKET_ERROR) {
539 if (addr) { 537 if (addr) {
540 ASSERT(addrlen == sizeof(addr_in)); 538 ASSERT(addrlen == sizeof(addr_in));
@@ -556,12 +554,12 @@ std::pair<s32, Errno> Socket::RecvFrom(u32 flags, std::vector<u8>& message, Sock
556 } 554 }
557} 555}
558 556
559std::pair<s32, Errno> Socket::Send(const std::vector<u8>& message, u32 flags) { 557std::pair<s32, Errno> Socket::Send(const std::vector<u8>& message, int flags) {
560 ASSERT(message.size() < static_cast<size_t>(std::numeric_limits<int>::max())); 558 ASSERT(message.size() < static_cast<size_t>(std::numeric_limits<int>::max()));
561 ASSERT(flags == 0); 559 ASSERT(flags == 0);
562 560
563 const auto result = send(fd, reinterpret_cast<const char*>(message.data()), 561 const auto result = send(fd, reinterpret_cast<const char*>(message.data()),
564 static_cast<socklen_t>(message.size()), 0); 562 static_cast<int>(message.size()), 0);
565 if (result != SOCKET_ERROR) { 563 if (result != SOCKET_ERROR) {
566 return {static_cast<s32>(result), Errno::SUCCESS}; 564 return {static_cast<s32>(result), Errno::SUCCESS};
567 } 565 }
@@ -593,9 +591,8 @@ std::pair<s32, Errno> Socket::SendTo(u32 flags, const std::vector<u8>& message,
593 to = &host_addr_in; 591 to = &host_addr_in;
594 } 592 }
595 593
596 const auto result = 594 const auto result = sendto(fd, reinterpret_cast<const char*>(message.data()),
597 sendto(fd, reinterpret_cast<const char*>(message.data()), 595 static_cast<int>(message.size()), 0, to, tolen);
598 static_cast<socklen_t>(message.size()), 0, to, static_cast<socklen_t>(tolen));
599 if (result != SOCKET_ERROR) { 596 if (result != SOCKET_ERROR) {
600 return {static_cast<s32>(result), Errno::SUCCESS}; 597 return {static_cast<s32>(result), Errno::SUCCESS};
601 } 598 }
diff --git a/src/core/network/network.h b/src/core/network/network.h
index b95bf68f8..0622e4593 100644
--- a/src/core/network/network.h
+++ b/src/core/network/network.h
@@ -67,12 +67,12 @@ struct PollFD {
67 u16 revents; 67 u16 revents;
68}; 68};
69 69
70constexpr u32 POLL_IN = 1 << 0; 70constexpr u16 POLL_IN = 1 << 0;
71constexpr u32 POLL_PRI = 1 << 1; 71constexpr u16 POLL_PRI = 1 << 1;
72constexpr u32 POLL_OUT = 1 << 2; 72constexpr u16 POLL_OUT = 1 << 2;
73constexpr u32 POLL_ERR = 1 << 3; 73constexpr u16 POLL_ERR = 1 << 3;
74constexpr u32 POLL_HUP = 1 << 4; 74constexpr u16 POLL_HUP = 1 << 4;
75constexpr u32 POLL_NVAL = 1 << 5; 75constexpr u16 POLL_NVAL = 1 << 5;
76 76
77class NetworkInstance { 77class NetworkInstance {
78public: 78public:
diff --git a/src/core/network/sockets.h b/src/core/network/sockets.h
index 1682cbd4e..7bdff0fe4 100644
--- a/src/core/network/sockets.h
+++ b/src/core/network/sockets.h
@@ -56,11 +56,11 @@ public:
56 56
57 Errno Shutdown(ShutdownHow how); 57 Errno Shutdown(ShutdownHow how);
58 58
59 std::pair<s32, Errno> Recv(u32 flags, std::vector<u8>& message); 59 std::pair<s32, Errno> Recv(int flags, std::vector<u8>& message);
60 60
61 std::pair<s32, Errno> RecvFrom(u32 flags, std::vector<u8>& message, SockAddrIn* addr); 61 std::pair<s32, Errno> RecvFrom(int flags, std::vector<u8>& message, SockAddrIn* addr);
62 62
63 std::pair<s32, Errno> Send(const std::vector<u8>& message, u32 flags); 63 std::pair<s32, Errno> Send(const std::vector<u8>& message, int flags);
64 64
65 std::pair<s32, Errno> SendTo(u32 flags, const std::vector<u8>& message, const SockAddrIn* addr); 65 std::pair<s32, Errno> SendTo(u32 flags, const std::vector<u8>& message, const SockAddrIn* addr);
66 66