ref: 6d3e368f2d0796e366d2df8ed56e3b6fe0c42182
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 D4000000 | offset)
// 0xD63F0000 is our BLR X0
if ((*(ulong*)&text[i] & 0xFFFF0000) == 0xD2800000 && (*(ulong*)&text[i+BY2SE] & 0xFFFF0000) == 0xD4000000) {
long *ptr = (ulong*)&text[i];
ptr[1] = 0xD6;
ptr[0] = 0x3F;
ret++;
}
}
return ret;
}