Merge xam-user-signin-state/p0-canary-mirror

This commit is contained in:
MechaCat02
2026-05-06 20:08:17 +02:00

View File

@@ -45,7 +45,7 @@ pub fn register_exports(state: &mut KernelState) {
// User // User
state.register_export(Xam, 0x020A, "XamUserGetXUID", xam_user_get_xuid); state.register_export(Xam, 0x020A, "XamUserGetXUID", xam_user_get_xuid);
state.register_export(Xam, 0x020E, "XamUserGetName", xam_user_get_name); state.register_export(Xam, 0x020E, "XamUserGetName", xam_user_get_name);
state.register_export(Xam, 0x0210, "XamUserGetSigninState", stub_return_zero); state.register_export(Xam, 0x0210, "XamUserGetSigninState", xam_user_get_signin_state);
state.register_export(Xam, 0x0219, "XamUserReadProfileSettings", xam_user_read_profile_settings); state.register_export(Xam, 0x0219, "XamUserReadProfileSettings", xam_user_read_profile_settings);
state.register_export(Xam, 0x021A, "XamUserWriteProfileSettings", stub_success); state.register_export(Xam, 0x021A, "XamUserWriteProfileSettings", stub_success);
@@ -329,6 +329,12 @@ fn xam_user_read_profile_settings(ctx: &mut PpcContext, _mem: &GuestMemory, _sta
ctx.gpr[3] = 0x0000_048B; // ERROR_NOT_FOUND ctx.gpr[3] = 0x0000_048B; // ERROR_NOT_FOUND
} }
fn xam_user_get_signin_state(ctx: &mut PpcContext, _mem: &GuestMemory, _state: &mut KernelState) {
// r3 = user_index
let user_index = ctx.gpr[3] as u32;
ctx.gpr[3] = if user_index == 0 { 1 } else { 0 };
}
// ===== System ===== // ===== System =====
fn xam_get_execution_id(ctx: &mut PpcContext, mem: &GuestMemory, state: &mut KernelState) { fn xam_get_execution_id(ctx: &mut PpcContext, mem: &GuestMemory, state: &mut KernelState) {
@@ -572,6 +578,22 @@ mod tests {
assert_eq!(ctx.gpr[3], 8); assert_eq!(ctx.gpr[3], 8);
} }
#[test]
fn xam_user_get_signin_state_user0_signed_in_locally() {
let (mut ctx, mem, mut state) = fresh();
ctx.gpr[3] = 0;
xam_user_get_signin_state(&mut ctx, &mem, &mut state);
assert_eq!(ctx.gpr[3], 1);
ctx.gpr[3] = 1;
xam_user_get_signin_state(&mut ctx, &mem, &mut state);
assert_eq!(ctx.gpr[3], 0);
ctx.gpr[3] = 4;
xam_user_get_signin_state(&mut ctx, &mem, &mut state);
assert_eq!(ctx.gpr[3], 0);
}
fn drain_notifications(state: &mut KernelState, mem: &GuestMemory, handle: u32) -> Vec<(u32, u32)> { fn drain_notifications(state: &mut KernelState, mem: &GuestMemory, handle: u32) -> Vec<(u32, u32)> {
let id_ptr = SCRATCH_BASE + 0x100; let id_ptr = SCRATCH_BASE + 0x100;
let param_ptr = SCRATCH_BASE + 0x104; let param_ptr = SCRATCH_BASE + 0x104;