ref: 6a89c47b1ce152b0ec15a3fb9df225ae4ea6287a
dir: /posix-arm64/patch.c/
#include <u.h>
#include <libc.h>
#include "mem.h"
int
patch(void* text, int size)
{
ulong i;
int ret = -1;
for(i = 0; i < size - BY2WD; i++){
// MOV X0, #immediate (could be D2800000 | syscall_number)
// BL X0 (could be D4000010 | offset)
// 0xD63F0000 is our BLR X0
// This sets up our jmp to the trampoline code
if ((*(ulong*)&text[i] & 0xFFFF0000) == 0xD2800000 && (*(ulong*)&text[i+BY2SE] & 0xFFFF0000) == 0xD4000000) {
ulong *ptr = (ulong*)&text[i+BY2SE];
*ptr &= 0xFFFF0000;
*ptr |= 0xD63F0000;
ret++;
}
}
return ret;
}