Small Fixes

This commit is contained in:
TheBrokenRail 2024-08-21 18:19:07 -04:00
parent 63e2525ee9
commit 72372c7457
2 changed files with 34 additions and 41 deletions

View File

@ -1,50 +1,43 @@
#include <libreborn/libreborn.h> #include <libreborn/libreborn.h>
#include "patch-internal.h" #include "patch-internal.h"
// Extract Target Address From B(L) Instruction
static void *extract_from_bl_instruction(unsigned char *from, const uint32_t instruction) {
// Extract The Signed 24-Bit Immediate Value
int32_t imm24 = int32_t(instruction) & 0x00ffffff;
// Sign-Extend
if (imm24 & 0x00800000) {
imm24 |= int32_t(0xff000000);
}
// Calculate Offset
const int32_t offset = imm24 << 2;
// Compute Target Address
return from + 8 + offset;
}
void *extract_from_bl_instruction(unsigned char *from) {
return extract_from_bl_instruction(from, *(uint32_t *) from);
}
// Generate A BL Instruction // Generate A BL Instruction
#define INSTRUCTION_RANGE 32000000 uint32_t generate_bl_instruction(void *from, void *to, const int use_b_instruction) {
static uint64_t nice_diff_64(uint64_t a, uint64_t b) { const uint32_t from_addr = uint32_t(from);
if (a > b) { const uint32_t to_addr = uint32_t(to);
return a - b;
} else {
return b - a;
}
}
uint32_t generate_bl_instruction(void *from, void *to, int use_b_instruction) {
// Check Instruction Range
if (nice_diff_64((uint64_t) to, (uint64_t) from) > INSTRUCTION_RANGE) {
IMPOSSIBLE();
}
// Create New Instruction // Calculate The Offset
uint32_t instruction; const int32_t offset = int32_t((to_addr - from_addr - 8) >> 2); // Account For The 2-Bit Shift
unsigned char *instruction_array = (unsigned char *) &instruction;
instruction_array[3] = use_b_instruction ? B_INSTRUCTION : BL_INSTRUCTION;
// Determine PC // Create the instruction
unsigned char *pc = ((unsigned char *) from) + 8; uint32_t instruction = use_b_instruction ? B_INSTRUCTION : BL_INSTRUCTION;
int32_t offset = (int32_t) to - (int32_t) pc; instruction *= 0x1000000;
int32_t target = offset >> 2;
// Set Instruction Offset // Set The Offset (Last 24 Bits)
unsigned char *target_array = (unsigned char *) &target; instruction |= (offset & 0x00FFFFFF);
instruction_array[0] = target_array[0];
instruction_array[1] = target_array[1]; // Check
instruction_array[2] = target_array[2]; if (to != extract_from_bl_instruction((unsigned char *) from, instruction)) {
ERR("Unable To Create Branch Instruction From %p To %p", from, to);
}
// Return // Return
return instruction; return instruction;
} }
// Extract Target Address From B(L) Instruction
void *extract_from_bl_instruction(unsigned char *from) {
// Calculate PC
unsigned char *pc = ((unsigned char *) from) + 8;
// Extract Offset From Instruction
int32_t target = *(int32_t *) from;
target = (target << 8) >> 8;
int32_t offset = target << 2;
// Add PC To Offset
return (void *) (pc + offset);
}

View File

@ -15,7 +15,7 @@
// Allow Disabling Interaction // Allow Disabling Interaction
static void update_cursor(); static void update_cursor();
static int is_interactable = 1; static int is_interactable = 1;
void media_set_interactable(int toggle) { void media_set_interactable(const int toggle) {
if (bool(toggle) != is_interactable) { if (bool(toggle) != is_interactable) {
is_interactable = toggle; is_interactable = toggle;
update_cursor(); update_cursor();