shithub: drawcpu

ref: f6d48501c4c475c5c9cad077ae6b206e72e0c65d
dir: /posix-arm64/patch.c/

View raw version
#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;
}