Files
ps5debug-NG/common/include/proc.h
T
OpenSourcereR-dev aef612f6bd v1.2.4: Option E map augmentation, hybrid DMAP reads, SW BP wait4-race fix
Features
- Option E: CMD_PROC_MAPS now augments the vm_map list with Sony-aux regions
  (SceGnm/SceAgc/JIT/DMEM) that bypass vm_map, discovered via a kernel-side
  x86-64 page-table walk over the DMAP. FW-agnostic (runtime pmap-offset
  discovery + ground-truth validation); falls back to the plain vm_map result
  on any failure.
- Hybrid memory-read path: reads route DMAP-direct for vm_map-absent (aux)
  regions and mdbg otherwise (and as fallback), making aux scans ~4x faster on
  both the CMD_PROC_READ and server-side scan paths. No protocol change;
  byte-identical results.

Fixes
- SW breakpoint wait4-race: eliminate the multi-threaded epilogue-BP SIGSEGV
  storm (stale TRAP_TRACE/TRAP_BRKPT absorbers, PT_LWPINFO-gated sibling
  rewind, RIP-only fast caches, authid bump around rearm, SIGSEGV-storm guard).
- AOB-multi scan: unique-mode now exits only on invalidated >= pat_count
  (matches the original), fixing wrongly-reported-unique / truncated scans.

Performance / robustness
- BP-event latency: select timeout 1000->100 us, poll 100->50 us.
- Per-command debug-state locking (0xBDBB) to prevent BP-slot-table corruption
  under concurrent clients.
- Installer: double-load guard (loopback 744 probe), relocation pre-apply plus
  batched ptrace_io for faster injection, wait4 instead of a fixed sleep.

Refactor
- Firmware detection rewritten to a direct switch(fw & 0xffff0000) with
  per-case version annotations; behavior-preserving (verified equivalent).

Version 1.2.3 -> 1.2.4.
2026-05-30 12:00:00 +00:00

115 lines
4.7 KiB
C

// SPDX-License-Identifier: GPL-3.0-only
#pragma once
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
struct cmd_packet;
int proc_handle(int fd, struct cmd_packet *packet, unsigned char client_idx);
int proc_list_handle(int fd, struct cmd_packet *packet);
int proc_read_handle(int fd, struct cmd_packet *packet);
int proc_read_stack_handle(int fd, struct cmd_packet *packet);
int proc_write_handle(int fd, struct cmd_packet *packet);
int proc_maps_handle(int fd, struct cmd_packet *packet);
int proc_info_handle(int fd, struct cmd_packet *packet);
int proc_protect_handle(int fd, struct cmd_packet *packet);
int proc_unknown_d_handle(int fd, struct cmd_packet *packet);
int proc_install_handle(int fd, struct cmd_packet *packet);
int proc_call_handle(int fd, struct cmd_packet *packet);
int proc_elf_handle(int fd, struct cmd_packet *packet);
int proc_elf_rpc_handle(int fd, struct cmd_packet *packet);
long proc_load_elf_inject(uint32_t pid, char *elf_buf, const char *thread_name);
long sys_proc_elf(unsigned long pid, unsigned long elf, unsigned long length);
int ptrace_io_write_d(int pid, void *src_local, void *dst_target, uint64_t len);
int proc_alloc_handle(int fd, struct cmd_packet *packet);
int proc_free_handle(int fd, struct cmd_packet *packet);
int proc_alloc_hinted_handle(int fd, struct cmd_packet *packet);
int proc_disasm_region_handle(int fd, struct cmd_packet *packet);
int proc_extract_code_xrefs_handle(int fd, struct cmd_packet *packet);
int proc_find_xrefs_to_handle(int fd, struct cmd_packet *packet);
struct sys_proc_call_args;
int proc_remote_alloc(uint32_t pid, uint64_t *out_addr,
uint64_t length, uint64_t hint);
int proc_remote_free (uint32_t pid, uint64_t addr, uint64_t length);
int proc_remote_call (int pid, struct sys_proc_call_args *args);
struct elev_state {
unsigned long saved_authid;
uint8_t saved_caps[16];
int valid;
};
long ptrace_raw (int op, int pid, void *addr, int data);
long ptrace_elev(int op, int pid, void *addr, int data);
int elev_save_and_set(struct elev_state *st);
void elev_restore (struct elev_state *st);
long sys_proc_rw_w0(uint64_t pid, uint64_t address, uint64_t length,
void *data, uint64_t arg5);
long sys_proc_rw_w1(uint64_t pid, uint64_t address, uint64_t length,
void *data, uint64_t arg5);
int proc_scan_handle(int fd, struct cmd_packet *packet);
int proc_scan_aob_handle(int fd, struct cmd_packet *packet);
int proc_scan_aob_multi_handle(int fd, struct cmd_packet *packet);
int proc_scan_start_handle(int fd, struct cmd_packet *packet);
int proc_scan_count_handle(int fd, struct cmd_packet *packet);
int proc_scan_get_handle(int fd, struct cmd_packet *packet);
int proc_auth_handle(int fd, struct cmd_packet *packet);
int proc_assemble_handle(int fd, struct cmd_packet *packet);
bool proc_scan_legacy_compareValues(unsigned char cmpType, unsigned char valType,
uint64_t valueLength,
const void *scanValue,
const void *memValue,
const void *extraValue);
bool proc_scan_compareValues(unsigned char cmpType, unsigned char valType,
uint64_t valueLength,
const void *scanValue,
const void *memValue,
const void *prevValue,
const void *mask);
bool aob_match(uint64_t pattern_length,
const uint8_t *pattern,
const uint8_t *memory,
uint64_t unused,
const uint8_t *mask);
bool fuzzy_double_compare(double scanV, double memV, double tolerance);
bool fuzzy_float_compare(float scanV, float memV, float tolerance);
uint64_t proc_scan_getSizeOfValueType(unsigned char valType);
uint32_t auth_lfsr_next(void);
void auth_lfsr_set_state(uint32_t a, uint32_t b, uint32_t c, uint32_t d);
void auth_keystream_fill(uint8_t *out, uint64_t length);
void proc_auth_xor_keystream(const uint8_t *in, uint8_t *out, uint16_t length);
extern const uint8_t g_cmptype_needs_value [16];
extern const uint8_t g_cmptype_needs_extra [16];
extern const uint8_t g_cmptype_needs_previous[16];
extern uint32_t g_proc_auth_state;
int sys_proc_vm_map(uint32_t pid, void **out_maps, int *out_count);
struct proc_vm_map_entry;
int proc_ptwalk_augment(uint32_t pid,
struct proc_vm_map_entry *v, int v_count,
struct proc_vm_map_entry **out_buf, int *out_count);
int proc_ptwalk_read(uint32_t pid, uint64_t va, uint64_t len, void *dst);
int proc_aux_range_contains(uint32_t pid, uint64_t addr, uint64_t len);
void proc_read_mem(uint32_t pid, uint64_t addr, uint64_t len, void *buf);