unset ld env before running command
[ginge.git] / loader / patches.c
index a6e3192..901de51 100644 (file)
@@ -31,6 +31,13 @@ static const unsigned int sig_open_a1[] = {
 };
 #define sig_mask_open_a1 sig_mask_all
 
+static const unsigned int sig_hw_open[] = {
+  0xef900005, // svc  0x900005
+  0xe3700a01, // cmn  r0, #0x1000
+  0xe1a04000, // mov  r4, r0
+};
+#define sig_mask_hw_open sig_mask_all
+
 static const unsigned int sig_mmap[] = {
   0xe92d000f, // push {r0, r1, r2, r3}
   0xe1a0000d, // mov  r0, sp
@@ -113,12 +120,12 @@ static const unsigned int sig_execve[] = {
 };
 #define sig_mask_execve sig_mask_all
 
-static const unsigned int sig_execve2[] = {
+static const unsigned int sig_hw_execve[] = {
   0xef90000b, // svc 0x90000b
   0xe3700a01, // cmn r0, #4096
   0xe1a04000, // mov r4, r0
 };
-#define sig_mask_execve2 sig_mask_all
+#define sig_mask_hw_execve sig_mask_all
 
 static const unsigned int sig_chdir[] = {
   0xef90000c, // svc  0x90000c
@@ -130,6 +137,13 @@ static const unsigned int sig_mask_chdir[] = {
   0xffffffff, 0xffffffff, 0xffffffff, 0xff000000
 };
 
+static const unsigned int sig_readlink[] = {
+  0xef900055, // svc  0x900055
+  0xe3700a01, // cmn  r0, #0x1000
+  0x312fff1e, // bxcc lr
+};
+#define sig_mask_readlink sig_mask_all
+
 /* special */
 static const unsigned int sig_cache1[] = {
   0xee073f5e, // mcr 15, 0, r3, cr7, cr14, 2
@@ -163,8 +177,10 @@ asm( \
 "  ldmfd sp!, {r1-r3,r12,lr,pc}\n" \
 );
 
-SVC_CMN_R0_MOV_R4_WRAPPER(hw_read, w_read)
-SVC_CMN_R0_MOV_R4_WRAPPER(hw_ioctl, w_ioctl)
+SVC_CMN_R0_MOV_R4_WRAPPER(hw_open, w_open_raw)
+SVC_CMN_R0_MOV_R4_WRAPPER(hw_read, w_read_raw)
+SVC_CMN_R0_MOV_R4_WRAPPER(hw_ioctl, w_ioctl_raw)
+SVC_CMN_R0_MOV_R4_WRAPPER(hw_execve, w_execve_raw)
 
 #define PATCH_(p, f, t) { sig_##p, sig_mask_##p, ARRAY_SIZE(sig_##p), t, f, #p }
 #define PATCH(f) PATCH_(f, w_##f, 0)
@@ -179,6 +195,7 @@ static const struct {
 } patches[] = {
   PATCH (open),
   PATCH_(open_a1, w_open, 0),
+  PATCH_(hw_open, hw_open, 1),
   PATCH (mmap),
   PATCH (mmap2), // mmap2 syscall
   PATCH (munmap),
@@ -188,8 +205,9 @@ static const struct {
   PATCH (ioctl),
   PATCH_(hw_ioctl, hw_ioctl, 1),
   PATCH (sigaction),
-//  PATCH_(execve, execve2, 0), // hangs
+  PATCH_(hw_execve, hw_execve, 1),
   PATCH (chdir),
+  PATCH (readlink),
   PATCH_(cache1, NULL, 2),
   PATCH_(cache2, NULL, 2),
 };