[*] Binary protection state of imx-sdma.ko
No RELRO No Canary found NX disabled REL No RPATH No RUNPATH Symbols
[*] Function popen tear down of imx-sdma.ko
; assembly | /* r2dec pseudo code output */
| /* /logs/firmware/patool_extraction/rootfs.img_unblob_extracted/rootfs.img_extract/0-80367616.squashfs_v4_le_extract/usr/lib/modules/5.10.52-axis9/kernel/drivers/dma/imx-sdma.ko @ 0x8001e80 */
| #include <stdint.h>
|
; (fcn) sym.sdma_config_write () | void sdma_config_write (int32_t arg1, int32_t arg2) {
| r0 = arg1;
| r1 = arg2;
0x08001e80 push {r4, r5, r6, r7, r8, sb, sl, lr} |
0x08001e84 mov r3, 0 | r3 = 0;
0x08001e88 mov r4, r0 | r4 = r0;
0x08001e8c ldr r8, [r0, 0xcc] | r8 = *((r0 + 0xcc));
0x08001e90 mov r7, r2 | r7 = r2;
0x08001e94 cmp r2, 2 |
0x08001e98 str r3, [r0, 0x100] | *((r0 + 0x100)) = r3;
0x08001e9c strb r3, [r0, 0x138] | *((r0 + 0x138)) = r3;
| if (r2 == 2) {
0x08001ea0 beq 0x8002038 | goto label_3;
| }
0x08001ea4 cmp r2, 3 |
| if (r2 == 3) {
0x08001ea8 beq 0x8002000 | goto label_4;
| }
0x08001eac ldr r3, [r1, 8] | r3 = *((r1 + 8));
0x08001eb0 cmp r8, 0x1a |
0x08001eb4 str r3, [r0, 0xf0] | *((r0 + 0xf0)) = r3;
| if (r8 == 0x1a) {
0x08001eb8 ldrne r3, [r1, 0x18] | r3 = *((r1 + 0x18));
| }
| if (r8 == 0x1a) {
0x08001ebc ldrne r2, [r1, 0x10] | r2 = *((r1 + 0x10));
| }
| if (r8 != 0x1a) {
0x08001ec0 ldreq r3, [r1, 4] | r3 = *((r1 + 4));
| }
| if (r8 != 0x1a) {
0x08001ec4 streq r3, [r0, 0xf4] | *((r0 + 0xf4)) = r3;
| }
| if (r8 == 0x1a) {
0x08001ec8 mulne r3, r2, r3 | r3 = r2 * r3;
| }
| if (r8 == 0x1a) {
0x08001ecc strne r3, [r0, 0x100] | *((r0 + 0x100)) = r3;
| }
| if (r8 == 0x1a) {
0x08001ed0 ldrne r3, [r1, 0x10] | r3 = *((r1 + 0x10));
| }
0x08001ed4 strne r3, [r0, 0xd8] | *((r0 + 0xd8)) = r3;
| while (1) {
| label_0:
0x08001ed8 ldr r6, [r4, 0x88] | r6 = *((r4 + 0x88));
0x08001edc mov r1, 1 | r1 = 1;
0x08001ee0 ldr r5, [r4, 0x8c] | r5 = *((r4 + 0x8c));
0x08001ee4 add r6, r6, 0x2000 | r6 += 0x2000;
0x08001ee8 str r7, [r4, 0x90] | *((r4 + 0x90)) = r7;
0x08001eec lsl r2, r1, r5 | r2 = r1 << r5;
0x08001ef0 ldr r3, [r6, 0xa4c] | r3 = *((r6 + 0xa4c));
0x08001ef4 str r2, [r3, 8] | *((r3 + 8)) = r2;
0x08001ef8 mov r3, 0 | r3 = 0;
0x08001efc mov r2, 3 | r2 = 3;
0x08001f00 cmp r8, 0xf |
0x08001f04 str r3, [r4, 0xf8] | *((r4 + 0xf8)) = r3;
0x08001f08 str r3, [r4, 0xfc] | *((r4 + 0xfc)) = r3;
0x08001f0c str r3, [r4, 0x104] | *((r4 + 0x104)) = r3;
0x08001f10 str r3, [r4, 0x108] | *((r4 + 0x108)) = r3;
0x08001f14 str r2, [r4, 0x10c] | *((r4 + 0x10c)) = r2;
| if (r8 == 0xf) {
0x08001f18 beq 0x8002070 | goto label_5;
| }
0x08001f1c cmp r8, 0x10 |
| if (r8 == 0x10) {
0x08001f20 beq 0x800205c | goto label_6;
| }
0x08001f24 mov r2, r3 | r2 = r3;
0x08001f28 mov r0, r4 | r0 = r4;
0x08001f2c bl 0x80012c0 | sdma_config_ownership_constprop_0 ();
| label_1:
0x08001f30 ldr r2, [r4, 0x13c] | r2 = *((r4 + 0x13c));
0x08001f34 sub r3, r2, 1 | r3 = r2 - 1;
0x08001f38 cmp r3, 6 |
| if (r3 <= 6) {
0x08001f3c bhi 0x8001f54 |
0x08001f40 ldr r3, [r6, 0xa4c] | r3 = *((r6 + 0xa4c));
0x08001f44 lsl r5, r5, 2 | r5 <<= 2;
0x08001f48 add r5, r5, 0x100 | r5 += 0x100;
0x08001f4c add r3, r3, r5 | r3 += r5;
0x08001f50 str r2, [r3] | *(r3) = r2;
| }
0x08001f54 ldr r5, [r4, 0xd0] | r5 = *((r4 + 0xd0));
0x08001f58 mov r0, r4 | r0 = r4;
0x08001f5c mov r1, r5 | r1 = r5;
0x08001f60 bl 0x8001200 | sdma_event_enable_constprop_0 ();
0x08001f64 ldr sb, [r4, 0xd4] | sb = *((r4 + 0xd4));
0x08001f68 cmp sb, 0 |
| if (sb != 0) {
0x08001f6c bne 0x8002084 | goto label_7;
| }
| label_2:
0x08001f70 mov r3, 0 | r3 = 0;
0x08001f74 str r3, [r4, 0xdc] | *((r4 + 0xdc)) = r3;
0x08001f78 str r3, [r4, 0xe0] | *((r4 + 0xe0)) = r3;
0x08001f7c str r3, [r4, 0xe4] | *((r4 + 0xe4)) = r3;
0x08001f80 str r3, [r4, 0xe8] | *((r4 + 0xe8)) = r3;
0x08001f84 cmp r8, 0x1b |
| if (r8 > 0x1b) {
| /* switch table (28 cases) at 0x8001f90 */
0x08001f88 ldrls pc, [pc, r8, lsl 2] | offset_0 = r8 << 2;
| pc = *((pc + offset_0));
| }
0x08001f8c b 0x8002094 | goto label_8;
| label_4:
0x08002000 ldr r3, [r1, 4] | r3 = *((r1 + 4));
0x08002004 str r3, [r0, 0xf4] | *((r0 + 0xf4)) = r3;
0x08002008 ldr r3, [r1, 8] | r3 = *((r1 + 8));
0x0800200c str r3, [r0, 0xf0] | *((r0 + 0xf0)) = r3;
0x08002010 ldrb r2, [r1, 0x14] | r2 = *((r1 + 0x14));
0x08002014 str r2, [r0, 0x100] | *((r0 + 0x100)) = r2;
0x08002018 ldr r3, [r1, 0x18] | r3 = *((r1 + 0x18));
0x0800201c lsl r3, r3, 0x10 | r3 <<= 0x10;
0x08002020 and r3, r3, 0xff0000 | r3 &= 0xff0000;
0x08002024 orr r3, r3, r2 | r3 |= r2;
0x08002028 str r3, [r0, 0x100] | *((r0 + 0x100)) = r3;
0x0800202c ldr r3, [r1, 0x10] | r3 = *((r1 + 0x10));
0x08002030 str r3, [r0, 0xd8] | *((r0 + 0xd8)) = r3;
0x08002034 b 0x8001ed8 |
| }
| label_3:
0x08002038 ldr r3, [r1, 4] | r3 = *((r1 + 4));
0x0800203c str r3, [r0, 0xf0] | *((r0 + 0xf0)) = r3;
0x08002040 ldr r3, [r1, 0x14] | r3 = *((r1 + 0x14));
0x08002044 ldr r2, [r1, 0xc] | r2 = *((r1 + 0xc));
0x08002048 mul r3, r2, r3 | r3 = r2 * r3;
0x0800204c str r3, [r0, 0x100] | *((r0 + 0x100)) = r3;
0x08002050 ldr r3, [r1, 0xc] | r3 = *((r1 + 0xc));
0x08002054 str r3, [r0, 0xd8] | *((r0 + 0xd8)) = r3;
0x08002058 b 0x8001ed8 | goto label_0;
| label_6:
0x0800205c mov r2, r3 | r2 = r3;
0x08002060 mov r1, r3 | r1 = r3;
0x08002064 mov r0, r4 | r0 = r4;
0x08002068 bl 0x80012c0 | sdma_config_ownership_constprop_0 ();
0x0800206c b 0x8001f30 | goto label_1;
| label_5:
0x08002070 mov r2, r1 | r2 = r1;
0x08002074 mov r0, r4 | r0 = r4;
0x08002078 mov r1, r3 | r1 = r3;
0x0800207c bl 0x80012c0 | sdma_config_ownership_constprop_0 ();
0x08002080 b 0x8001f30 | goto label_1;
| label_7:
0x08002084 mov r1, sb | r1 = sb;
0x08002088 mov r0, r4 | r0 = r4;
0x0800208c bl 0x8001200 | sdma_event_enable_constprop_0 ();
0x08002090 b 0x8001f70 | goto label_2;
| label_8:
0x08002094 mov r3, 0 | r3 = 0;
0x08002098 cmp sb, r3 |
0x0800209c str r3, [r4, 0xdc] | *((r4 + 0xdc)) = r3;
0x080020a0 str r3, [r4, 0xe0] | *((r4 + 0xe0)) = r3;
0x080020a4 beq 0x8002160 |
| while (1) {
0x080020a8 ldrd r2, r3, [r4, 0xf0] | __asm ("ldrd r2, r3, [r4, 0xf0]");
0x080020ac str r2, [r4, 0x104] | *((r4 + 0x104)) = r2;
0x080020b0 str r3, [r4, 0x108] | *((r4 + 0x108)) = r3;
0x080020b4 mov r0, 0 | r0 = 0;
0x080020b8 pop {r4, r5, r6, r7, r8, sb, sl, pc} |
0x08002160 cmp r5, 0 |
0x08002164 add r3, r5, 0x1f | r3 = r5 + 0x1f;
| if (r5 < 0) {
0x08002168 movge r3, r5 | r3 = r5;
| }
0x0800216c add r1, r4, 0xf8 | r1 = r4 + 0xf8;
0x08002170 and r5, r5, 0x1f | r5 &= 0x1f;
0x08002174 mov r0, 1 | r0 = 1;
0x08002178 asr r3, r3, 5 | r3 >>= 5;
0x0800217c ldr r2, [r1, r3, lsl 2] | offset_1 = r3 << 2;
| r2 = *((r1 + offset_1));
0x08002180 orr r2, r2, r0, lsl r5 | r2 |= (r0 << r5);
0x08002184 str r2, [r1, r3, lsl 2] | offset_2 = r3 << 2;
| *((r1 + offset_2)) = r2;
0x08002188 b 0x80020a8 |
| }
| }
; assembly | /* r2dec pseudo code output */
| /* /logs/firmware/patool_extraction/rootfs.img_unblob_extracted/rootfs.img_extract/0-80367616.squashfs_v4_le_extract/usr/lib/modules/5.10.52-axis9/kernel/drivers/dma/imx-sdma.ko @ 0x8000b60 */
| #include <stdint.h>
|
| #define BIT_MASK(t,v) ((t)(-((v)!= 0)))&(((t)-1)>>((sizeof(t)*CHAR_BIT)-(v)))
|
; (fcn) sym.sdma_free_chan_resources () | void sdma_free_chan_resources (int32_t arg1) {
| int32_t var_0h;
| int32_t var_4h;
| int32_t var_ch;
| r0 = arg1;
0x08000b60 ldr r2, [r0, 0x88] | r2 = *((r0 + 0x88));
0x08000b64 add r3, r2, 0x2000 | r3 = r2 + 0x2000;
0x08000b68 ldr r1, [r3, 0xb78] | r1 = *((r3 + 0xb78));
0x08000b6c cmp r1, 0 |
| if (r1 != 0) {
0x08000b70 bxeq lr | return;
| }
0x08000b74 push {r4, r5, lr} |
0x08000b78 mov r4, r0 | r4 = r0;
0x08000b7c ldr r3, [r3, 0xb50] | r3 = *((r3 + 0xb50));
0x08000b80 sub sp, sp, 0xc |
0x08000b84 ldrb r3, [r3, 0xf] | r3 = *((r3 + 0xf));
0x08000b88 cmp r3, 0 |
0x08000b8c bne 0x8000c84 |
| while (1) {
0x08000b90 mov r0, r4 | r0 = r4;
0x08000b94 bl 0x8000900 | sdma_terminate_all ();
0x08000b98 add r0, r4, 0x3c | r0 = r4 + 0x3c;
0x08000b9c str sp, [sp] | *(sp) = sp;
0x08000ba0 str sp, [sp, 4] | var_4h = sp;
0x08000ba4 stmdaeq r0, {r0, r2, r3, r6, r7, r8, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r2, r3, r6, r7, r8, sl, fp, ip, sp, lr}");
0x08000ba8 mrs ip, apsr | ip = apsr;
0x08000bac cpsid i | __asm ("cpsid i");
0x08000bb0 mov r3, sp | r3 = sp;
0x08000bb4 bic r3, r3, 0x1fc0 | r3 = BIT_MASK (r3, 0x1fc0);
0x08000bb8 bic r3, r3, 0x3f | r3 = BIT_MASK (r3, 0x3f);
0x08000bbc ldr r2, [r3, 4] | r2 = *((r3 + 4));
0x08000bc0 add r2, r2, 1 | r2++;
0x08000bc4 str r2, [r3, 4] | *((r3 + 4)) = r2;
0x08000bc8 ldr r2, [r4, 0x78] | r2 = *((r4 + 0x78));
0x08000bcc add r3, r4, 0x78 | r3 = r4 + 0x78;
0x08000bd0 cmp r3, r2 |
| if (r3 != r2) {
0x08000bd4 beq 0x8000bfc |
0x08000bd8 ldr r2, [r4, 0x7c] | r2 = *((r4 + 0x7c));
0x08000bdc ldr r1, [sp, 4] | r1 = var_4h;
0x08000be0 ldr r0, [r4, 0x78] | r0 = *((r4 + 0x78));
0x08000be4 str r1, [r0, 4] | *((r0 + 4)) = r1;
0x08000be8 str r0, [r1] | *(r1) = r0;
0x08000bec str sp, [r2] | *(r2) = sp;
0x08000bf0 str r2, [sp, 4] | var_4h = r2;
0x08000bf4 str r3, [r4, 0x78] | *((r4 + 0x78)) = r3;
0x08000bf8 str r3, [r4, 0x7c] | *((r4 + 0x7c)) = r3;
| }
0x08000bfc msr cpsr_c, ip | cpsr_c = ip;
0x08000c00 mov r3, sp | r3 = sp;
0x08000c04 bic r3, r3, 0x1fc0 | r3 = BIT_MASK (r3, 0x1fc0);
0x08000c08 bic r3, r3, 0x3f | r3 = BIT_MASK (r3, 0x3f);
0x08000c0c ldr r2, [r3, 4] | r2 = *((r3 + 4));
0x08000c10 sub r2, r2, 1 | r2--;
0x08000c14 str r2, [r3, 4] | *((r3 + 4)) = r2;
0x08000c18 cmp r2, 0 |
| if (r2 == 0) {
0x08000c1c beq 0x8000cd0 | goto label_2;
| }
| label_1:
0x08000c20 mov r1, sp | r1 = sp;
0x08000c24 mov r0, r4 | r0 = r4;
0x08000c28 stmdaeq r0, {r0, r4, r6, r7, r8, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r4, r6, r7, r8, sl, fp, ip, sp, lr}");
0x08000c2c add r0, r4, 0x120 | r0 = r4 + 0x120;
0x08000c30 stmdaeq r0, {r0, r2, r4, r6, r7, r8, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r2, r4, r6, r7, r8, sl, fp, ip, sp, lr}");
0x08000c34 ldr r1, [r4, 0xd0] | r1 = *((r4 + 0xd0));
0x08000c38 mov r0, r4 | r0 = r4;
0x08000c3c bl 0x8000070 | sdma_event_disable ();
0x08000c40 ldr r1, [r4, 0xd4] | r1 = *((r4 + 0xd4));
0x08000c44 cmp r1, 0 |
| if (r1 != 0) {
0x08000c48 bne 0x8000cc4 | goto label_3;
| }
| label_0:
0x08000c4c mov r5, 0 | r5 = 0;
0x08000c50 ldr r0, [r4, 0xc8] | r0 = *((r4 + 0xc8));
0x08000c54 str r5, [r4, 0xd0] | *((r4 + 0xd0)) = r5;
0x08000c58 str r5, [r4, 0xd4] | *((r4 + 0xd4)) = r5;
0x08000c5c stmdaeq r0, {r0, r2, r4, r5, r7, r8, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r2, r4, r5, r7, r8, sl, fp, ip, sp, lr}");
0x08000c60 ldr r3, [r4, 0x88] | r3 = *((r4 + 0x88));
0x08000c64 str r5, [r4, 0xc8] | *((r4 + 0xc8)) = r5;
0x08000c68 add r2, r3, 0x2000 | r2 = r3 + 0x2000;
0x08000c6c ldr r2, [r2, 0xb50] | r2 = *((r2 + 0xb50));
0x08000c70 ldrb r2, [r2, 0xf] | r2 = *((r2 + 0xf));
0x08000c74 cmp r2, r5 |
| if (r2 != r5) {
0x08000c78 bne 0x8000c94 | goto label_4;
| }
0x08000c7c add sp, sp, 0xc |
0x08000c80 pop {r4, r5, pc} |
0x08000c84 ldr r0, [r2] | r0 = *(r2);
0x08000c88 mov r1, 4 | r1 = 4;
0x08000c8c stmdaeq r0, {r0, r6, r7, r8, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r6, r7, r8, sl, fp, ip, sp, lr}");
0x08000c90 b 0x8000b90 |
| }
| label_4:
0x08000c94 ldr r5, [r3] | r5 = *(r3);
0x08000c98 stmdaeq r0, {r0, r2, r6, r7, r8, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r2, r6, r7, r8, sl, fp, ip, sp, lr}");
0x08000c9c mov r2, r0 | r2 = r0;
0x08000ca0 mov r3, r1 | r3 = r1;
0x08000ca4 add r5, r5, 0x120 | r5 += 0x120;
0x08000ca8 mov r1, 0xd | r1 = 0xd;
0x08000cac strd r2, r3, [r5, -8] | __asm ("strd r2, r3, [r5, -8]");
0x08000cb0 ldr r3, [r4, 0x88] | r3 = *((r4 + 0x88));
0x08000cb4 ldr r0, [r3] | r0 = *(r3);
0x08000cb8 add sp, sp, 0xc |
0x08000cbc pop {r4, r5, lr} |
0x08000cc0 stmdaeq r0, {r0, r3, r6, r7, r8, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r3, r6, r7, r8, sl, fp, ip, sp, lr}");
| label_3:
0x08000cc4 mov r0, r4 | r0 = r4;
0x08000cc8 bl 0x8000070 | sdma_event_disable ();
0x08000ccc b 0x8000c4c | goto label_0;
| label_2:
0x08000cd0 ldr r3, [r3] | r3 = *(r3);
0x08000cd4 tst r3, 2 |
| if ((r3 & 2) == 0) {
0x08000cd8 beq 0x8000c20 | goto label_1;
| }
0x08000cdc stmdaeq r0, {r0, r2, r4, r7, r8, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r2, r4, r7, r8, sl, fp, ip, sp, lr}");
0x08000ce0 b 0x8000c20 | goto label_1;
| }
; assembly | /* r2dec pseudo code output */
| /* /logs/firmware/patool_extraction/rootfs.img_unblob_extracted/rootfs.img_extract/0-80367616.squashfs_v4_le_extract/usr/lib/modules/5.10.52-axis9/kernel/drivers/dma/imx-sdma.ko @ 0x80015c8 */
| #include <stdint.h>
|
; (fcn) sym.sdma_load_firmware () | void sdma_load_firmware (int32_t arg1, int32_t arg2) {
| int32_t var_0h;
| int32_t var_4h;
| int32_t var_8h;
| int32_t var_10h;
| r0 = arg1;
| r1 = arg2;
0x080015c8 push {r4, r5, r6, lr} |
0x080015cc mov r5, r1 | r5 = r1;
0x080015d0 subs r4, r0, 0 | r4 = r0 - 0;
0x080015d4 sub sp, sp, 0x10 |
| if (r4 == r0) {
0x080015d8 beq 0x800165c | goto label_1;
| }
0x080015dc ldr r3, [r4] | r3 = *(r4);
0x080015e0 cmp r3, 0x1b |
| if (r3 < 0x1b) {
0x080015e4 bls 0x8001610 | goto label_0;
| }
0x080015e8 add r6, r1, 0x2000 | r6 = r1 + 0x2000;
0x080015ec ldrb r2, [r6, 0xb70] | r2 = *((r6 + 0xb70));
0x080015f0 cmp r2, 0 |
| if (r2 != 0) {
0x080015f4 bne 0x8001610 | goto label_0;
| }
0x080015f8 ldr r1, [r4, 4] | r1 = *((r4 + 4));
0x080015fc movw r2, 0x4453 |
0x08001600 movt r2, 0x414d | r2 = 0x414d4453;
0x08001604 ldr r0, [r1] | r0 = *(r1);
0x08001608 cmp r0, r2 |
0x0800160c beq 0x8001620 |
| while (r3 <= r2) {
| label_0:
0x08001610 mov r0, r4 | r0 = r4;
0x08001614 add sp, sp, 0x10 |
0x08001618 pop {r4, r5, r6, lr} |
0x0800161c stmdaeq r0, {r0, r3, sb, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r3, sb, sl, fp, ip, sp, lr}");
0x08001620 ldr r2, [r1, 0x14] | r2 = *((r1 + 0x14));
0x08001624 ldr r0, [r1, 0x18] | r0 = *((r1 + 0x18));
0x08001628 add r2, r2, r0 | r2 += r0;
0x0800162c cmp r3, r2 |
0x08001630 blo 0x8001610 |
| }
0x08001634 ldr r3, [r1, 4] | r3 = *((r1 + 4));
0x08001638 ldr r0, [r5] | r0 = *(r5);
0x0800163c sub r3, r3, 1 | r3--;
0x08001640 cmp r3, 3 |
| if (r3 > 3) {
| /* switch table (4 cases) at 0x800164c */
0x08001644 ldrls pc, [pc, r3, lsl 2] | offset_0 = r3 << 2;
| pc = *((pc + offset_0));
| }
0x08001648 b 0x8001738 | goto label_2;
| label_1:
0x0800165c add r4, r1, 0x2000 | r4 = r1 + 0x2000;
0x08001660 ldr r3, [r1] | r3 = *(r1);
0x08001664 ldr r2, [r4, 0xb74] | r2 = *((r4 + 0xb74));
0x08001668 cmp r2, 0 |
| if (r2 == 0) {
0x0800166c bne 0x80016b0 |
0x08001670 ldr r2, [r4, 0xa48] | r2 = *((r4 + 0xa48));
0x08001674 mov r0, 0xcc0 | r0 = 0xcc0;
0x08001678 str r5, [sp, 4] | var_4h = r5;
0x0800167c stmdaeq r0, {r3, r6, r7, r8, sl, ip} | __asm ("stmdaeq r0, {r3, r6, r7, r8, sl, ip}");
0x08001680 stmdaeq r0, {r3, r6, r7, r8, sl, ip} | __asm ("stmdaeq r0, {r3, r6, r7, r8, sl, ip}");
0x08001684 str r0, [sp] | *(sp) = r0;
0x08001688 str r1, [sp, 8] | var_8h = r1;
0x0800168c stmdaeq r0, {r6, r7, sb, sl, fp, lr} | __asm ("stmdaeq r0, {r6, r7, sb, sl, fp, lr}");
0x08001690 stmdaeq r0, {r6, r7, sb, sl, fp, lr} | __asm ("stmdaeq r0, {r6, r7, sb, sl, fp, lr}");
0x08001694 mov r1, 1 | r1 = 1;
0x08001698 stmdaeq r0, {r0, r2, r3, sb, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r2, r3, sb, sl, fp, ip, sp, lr}");
0x0800169c ldr r3, [r4, 0xb74] | r3 = *((r4 + 0xb74));
0x080016a0 add r3, r3, 1 | r3++;
0x080016a4 str r3, [r4, 0xb74] | *((r4 + 0xb74)) = r3;
0x080016a8 add sp, sp, 0x10 |
0x080016ac pop {r4, r5, r6, pc} |
| }
0x080016b0 mov r0, r3 | r0 = r3;
0x080016b4 stmdaeq r0, {r4, r6, r8, sb, sl, ip, sp} | __asm ("stmdaeq r0, {r4, r6, r8, sb, sl, ip, sp}");
0x080016b8 stmdaeq r0, {r4, r6, r8, sb, sl, ip, sp} | __asm ("stmdaeq r0, {r4, r6, r8, sb, sl, ip, sp}");
0x080016bc add sp, sp, 0x10 |
0x080016c0 pop {r4, r5, r6, lr} |
0x080016c4 stmdaeq r0, {r0, r2, r5, r7, r8, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r2, r5, r7, r8, sl, fp, ip, sp, lr}");
0x080016c8 mov r3, 0x30 | r3 = 0x30;
0x080016cc str r3, [r6, 0xb48] | *((r6 + 0xb48)) = r3;
0x080016d0 stmdaeq r0, {r5, r7, r8, sb, sl, ip, sp} | __asm ("stmdaeq r0, {r5, r7, r8, sb, sl, ip, sp}");
0x080016d4 stmdaeq r0, {r5, r7, r8, sb, sl, ip, sp} | __asm ("stmdaeq r0, {r5, r7, r8, sb, sl, ip, sp}");
0x080016d8 stmdaeq r0, {r0, r2, r5, r7, r8, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r2, r5, r7, r8, sl, fp, ip, sp, lr}");
0x080016dc ldr r3, [r6, 0xb78] | r3 = *((r6 + 0xb78));
0x080016e0 cmp r3, 0 |
| if (r3 != 0) {
0x080016e4 bne 0x8001610 | goto label_0;
| }
0x080016e8 ldr r0, [r4] | r0 = *(r4);
0x080016ec mov r1, 0xcc0 | r1 = 0xcc0;
0x080016f0 stmdaeq r0, {r0, r4, sb, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r4, sb, sl, fp, ip, sp, lr}");
0x080016f4 cmp r0, 0 |
0x080016f8 str r0, [r6, 0xb78] | *((r6 + 0xb78)) = r0;
| if (r0 == 0) {
0x080016fc beq 0x8001610 | goto label_0;
| }
0x08001700 ldr r2, [r4] | r2 = *(r4);
0x08001704 ldr r1, [r4, 4] | r1 = *((r4 + 4));
0x08001708 stmdaeq r0, {r0, r2, r3, r4, r7, r8, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r2, r3, r4, r7, r8, sl, fp, ip, sp, lr}");
0x0800170c ldr r3, [r6, 0xb50] | r3 = *((r6 + 0xb50));
0x08001710 ldrb r3, [r3, 0xf] | r3 = *((r3 + 0xf));
0x08001714 cmp r3, 0 |
| if (r3 != 0) {
0x08001718 bne 0x8001610 | goto label_0;
| }
0x0800171c ldr r0, [r5] | r0 = *(r5);
0x08001720 bl 0x80013a0 | sdma_runtime_resume ();
0x08001724 b 0x8001610 | goto label_0;
| label_2:
0x08001738 stmdaeq r0, {r2, r7, r8, sb, sl, ip, sp} | __asm ("stmdaeq r0, {r2, r7, r8, sb, sl, ip, sp}");
0x0800173c stmdaeq r0, {r2, r7, r8, sb, sl, ip, sp} | __asm ("stmdaeq r0, {r2, r7, r8, sb, sl, ip, sp}");
0x08001740 stmdaeq r0, {r0, r2, r7, r8, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r2, r7, r8, sl, fp, ip, sp, lr}");
0x08001744 b 0x8001610 | goto label_0;
| }
; assembly | /* r2dec pseudo code output */
| /* /logs/firmware/patool_extraction/rootfs.img_unblob_extracted/rootfs.img_extract/0-80367616.squashfs_v4_le_extract/usr/lib/modules/5.10.52-axis9/kernel/drivers/dma/imx-sdma.ko @ 0x8002550 */
| #include <stdint.h>
|
| #define BIT_MASK(t,v) ((t)(-((v)!= 0)))&(((t)-1)>>((sizeof(t)*CHAR_BIT)-(v)))
|
; (fcn) sym.sdma_prep_slave_sg () | void sdma_prep_slave_sg (int32_t arg_38h, int32_t arg1, int32_t arg2) {
| int32_t var_0h;
| int32_t var_ch;
| int32_t var_14h;
| r0 = arg1;
| r1 = arg2;
0x08002550 push {r4, r5, r6, r7, r8, sb, sl, fp, lr} |
0x08002554 mov r5, r3 | r5 = r3;
0x08002558 mov r6, r0 | r6 = r0;
0x0800255c ldr sl, [r0, 0x88] | sl = *(arg_38hx88);
0x08002560 sub sp, sp, 0x14 |
0x08002564 ldr r3, [r0, 0x8c] | r3 = *(arg_38hx8c);
0x08002568 mov r4, r1 | r4 = r1;
0x0800256c add sb, sl, 0x2000 | sb = sl + 0x2000;
0x08002570 mov r7, r2 | r7 = r2;
0x08002574 str r3, [sp, 0xc] | var_ch = r3;
0x08002578 ldr r3, [sb, 0xb50] | r3 = *((sb + 0xb50));
0x0800257c ldrb r3, [r3, 0xf] | r3 = *((r3 + 0xf));
0x08002580 cmp r3, 0 |
0x08002584 bne 0x800278c |
| while (1) {
0x08002588 mov r2, r5 | r2 = r5;
0x0800258c add r1, r6, 0x94 | r1 = r6 + 0x94;
0x08002590 mov r0, r6 | r0 = r6;
0x08002594 bl 0x8001e80 | sdma_config_write ();
0x08002598 mov r1, r5 | r1 = r5;
0x0800259c mov r2, r7 | r2 = r7;
0x080025a0 mov r0, r6 | r0 = r6;
0x080025a4 bl 0x8001750 | r0 = sdma_transfer_init ();
0x080025a8 subs r5, r0, 0 | r5 = r0 - 0;
| if (r5 != r0) {
0x080025ac beq 0x800275c |
0x080025b0 cmp r7, 0 |
| if (r7 == 0) {
0x080025b4 movne fp, 0 |
| }
| if (r7 == 0) {
0x080025b8 movne r8, 0xc | r8 = 0xc;
| }
| if (r7 != 0) {
0x080025bc beq 0x8002660 |
0x080025c0 ldr r0, [r5, 0x60] | r0 = *((r5 + 0x60));
0x080025c4 mul r1, r8, fp | r1 = r8 * fp;
0x080025c8 ldr r3, [r4, 0xc] | r3 = *((r4 + 0xc));
0x080025cc add ip, r0, r1 |
0x080025d0 str r3, [ip, 4] | *((ip + 4)) = r3;
0x080025d4 ldr r3, [r4, 8] | r3 = *((r4 + 8));
0x080025d8 cmp r3, 0x10000 |
| if (r3 >= 0x10000) {
0x080025dc bge 0x80027d4 | goto label_3;
| }
0x080025e0 strh r3, [r0, r1] | *((r0 + r1)) = r3;
0x080025e4 ldr r1, [r5, 0x58] | r1 = *((r5 + 0x58));
0x080025e8 add r1, r1, r3 | r1 += r3;
0x080025ec str r1, [r5, 0x58] | *((r5 + 0x58)) = r1;
0x080025f0 ldr r1, [r6, 0xd8] | r1 = *((r6 + 0xd8));
0x080025f4 sub r0, r1, 1 | r0 = r1 - 1;
0x080025f8 cmp r1, 4 |
| if (r1 > 4) {
0x080025fc bhi 0x800274c | goto label_2;
| }
0x08002600 cmp r0, 3 |
| if (r0 > 3) {
| /* switch table (4 cases) at 0x800260c */
0x08002604 ldrls pc, [pc, r0, lsl 2] | offset_0 = r0 << 2;
| pc = *((pc + offset_0));
| }
0x08002608 b 0x800274c |
| } else {
0x08002660 ldr r3, [r6, 0x88] | r3 = *((r6 + 0x88));
0x08002664 add r2, r3, 0x2000 | r2 = r3 + 0x2000;
0x08002668 ldr r2, [r2, 0xb50] | r2 = *((r2 + 0xb50));
0x0800266c ldrb r2, [r2, 0xf] | r2 = *((r2 + 0xf));
0x08002670 cmp r2, 0 |
| if (r2 != 0) {
0x08002674 bne 0x80027b0 | goto label_4;
| }
| label_1:
0x08002678 mov r0, r5 | r0 = r5;
0x0800267c mov r1, r6 | r1 = r6;
0x08002680 str r5, [sp, 0xc] | var_ch = r5;
0x08002684 stmdaeq r0, {r0, r4, r5, sb, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r4, r5, sb, sl, fp, ip, sp, lr}");
0x08002688 ldr r0, [sp, 0xc] | r0 = var_ch;
0x0800268c mov r1, 0 | r1 = 0;
0x08002690 ldr r3, [sp, 0x38] | r3 = *(arg_38h);
0x08002694 stmdaeq r0, {r0, r2, r4, r5, sb, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r2, r4, r5, sb, sl, fp, ip, sp, lr}");
0x08002698 stmdaeq r0, {r0, r2, r4, r5, sb, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r2, r4, r5, sb, sl, fp, ip, sp, lr}");
0x0800269c str r3, [r0, 4] | *((r0 + 4)) = r3;
0x080026a0 stmdaeq r0, {r0, r3, r4, r5, sb, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r3, r4, r5, sb, sl, fp, ip, sp, lr}");
0x080026a4 stmdaeq r0, {r0, r3, r4, r5, sb, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r3, r4, r5, sb, sl, fp, ip, sp, lr}");
0x080026a8 str r1, [r0, 0x30] | *((r0 + 0x30)) = r1;
0x080026ac strd r2, r3, [r0, 0x10] | __asm ("strd r2, r3, [r0, 0x10]");
0x080026b0 str r1, [r0, 0x34] | *((r0 + 0x34)) = r1;
0x080026b4 mrs ip, apsr | ip = apsr;
0x080026b8 cpsid i | __asm ("cpsid i");
0x080026bc mov r3, sp | r3 = sp;
0x080026c0 bic r3, r3, 0x1fc0 | r3 = BIT_MASK (r3, 0x1fc0);
0x080026c4 bic r3, r3, 0x3f | r3 = BIT_MASK (r3, 0x3f);
0x080026c8 ldr r2, [r3, 4] | r2 = *((r3 + 4));
0x080026cc add r2, r2, 1 | r2++;
0x080026d0 str r2, [r3, 4] | *((r3 + 4)) = r2;
0x080026d4 ldr r2, [r6, 0x5c] | r2 = *((r6 + 0x5c));
0x080026d8 add r1, r0, 0x38 | r1 = r0 + 0x38;
0x080026dc add r6, r6, 0x58 | r6 += 0x58;
0x080026e0 str r1, [r6, 4] | *((r6 + 4)) = r1;
0x080026e4 str r6, [r0, 0x38] | *((r0 + 0x38)) = r6;
0x080026e8 str r2, [r0, 0x3c] | *((r0 + 0x3c)) = r2;
0x080026ec str r1, [r2] | *(r2) = r1;
0x080026f0 msr cpsr_c, ip | cpsr_c = ip;
0x080026f4 ldr r2, [r3, 4] | r2 = *((r3 + 4));
0x080026f8 sub r2, r2, 1 | r2--;
0x080026fc str r2, [r3, 4] | *((r3 + 4)) = r2;
0x08002700 cmp r2, 0 |
| if (r2 != 0) {
0x08002704 bne 0x8002778 | goto label_5;
| }
0x08002708 ldr r3, [r3] | r3 = *(r3);
0x0800270c tst r3, 2 |
| if ((r3 & 2) == 0) {
0x08002710 beq 0x8002778 | goto label_5;
| }
0x08002714 str r0, [sp, 0xc] | var_ch = r0;
0x08002718 stmdaeq r0, {r0, r2, r4, r7, r8, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r2, r4, r7, r8, sl, fp, ip, sp, lr}");
0x0800271c ldr r0, [sp, 0xc] | r0 = var_ch;
0x08002720 b 0x8002778 | goto label_5;
| }
| label_2:
0x0800274c mov r0, r5 | r0 = r5;
0x08002750 bl 0x800087c | sdma_free_bd ();
0x08002754 mov r0, r5 | r0 = r5;
0x08002758 stmdaeq r0, {r0, r2, r4, r5, r7, r8, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r2, r4, r5, r7, r8, sl, fp, ip, sp, lr}");
| }
0x0800275c mov r3, 3 | r3 = 3;
0x08002760 str r3, [r6, 0x10c] | *((r6 + 0x10c)) = r3;
0x08002764 ldr r3, [sb, 0xb50] | r3 = *((sb + 0xb50));
0x08002768 ldrb r3, [r3, 0xf] | r3 = *((r3 + 0xf));
0x0800276c cmp r3, 0 |
| if (r3 != 0) {
0x08002770 bne 0x800279c | goto label_6;
| }
| label_0:
0x08002774 mov r0, 0 | r0 = 0;
| label_5:
0x08002778 add sp, sp, 0x14 |
0x0800277c pop {r4, r5, r6, r7, r8, sb, sl, fp, pc} |
0x0800278c ldr r0, [sl] | r0 = *(sl);
0x08002790 mov r1, 4 | r1 = 4;
0x08002794 stmdaeq r0, {r0, r6, r7, r8, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r6, r7, r8, sl, fp, ip, sp, lr}");
0x08002798 b 0x8002588 |
| }
| label_6:
0x0800279c ldr r3, [r6, 0x88] | r3 = *((r6 + 0x88));
0x080027a0 mov r1, 4 | r1 = 4;
0x080027a4 ldr r0, [r3] | r0 = *(r3);
0x080027a8 stmdaeq r0, {r0, r3, r6, r7, r8, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r3, r6, r7, r8, sl, fp, ip, sp, lr}");
0x080027ac b 0x8002774 | goto label_0;
| label_4:
0x080027b0 ldr r4, [r3] | r4 = *(r3);
0x080027b4 stmdaeq r0, {r0, r2, r6, r7, r8, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r2, r6, r7, r8, sl, fp, ip, sp, lr}");
0x080027b8 add r4, r4, 0x120 | r4 += 0x120;
0x080027bc strd r0, r1, [r4, -8] | __asm ("strd r0, r1, [r4, -8]");
0x080027c0 mov r1, 0xd | r1 = 0xd;
0x080027c4 ldr r3, [r6, 0x88] | r3 = *((r6 + 0x88));
0x080027c8 ldr r0, [r3] | r0 = *(r3);
0x080027cc stmdaeq r0, {r0, r3, r6, r7, r8, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r3, r6, r7, r8, sl, fp, ip, sp, lr}");
0x080027d0 b 0x8002678 | goto label_1;
| label_3:
0x080027d4 movw r1, 0xffff | r1 = 0xffff;
0x080027d8 str r1, [sp] | *(sp) = r1;
0x080027dc ldr r2, [sp, 0xc] | r2 = var_ch;
0x080027e0 stmdaeq r0, {r4, r5, r6, r7, r8, sb, sl, ip, sp} | __asm ("stmdaeq r0, {r4, r5, r6, r7, r8, sb, sl, ip, sp}");
0x080027e4 stmdaeq r0, {r4, r5, r6, r7, r8, sb, sl, ip, sp} | __asm ("stmdaeq r0, {r4, r5, r6, r7, r8, sb, sl, ip, sp}");
0x080027e8 ldr r0, [sl] | r0 = *(sl);
0x080027ec stmdaeq r0, {r0, r2, r7, r8, sl, fp, ip, sp, lr} | __asm ("stmdaeq r0, {r0, r2, r7, r8, sl, fp, ip, sp, lr}");
0x080027f0 b 0x800274c | goto label_2;
| }
[*] Function popen used 1 times imx-sdma.ko