You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iot/tools/srs/1.st.arm.patch.txt

210 lines
5.2 KiB

*** md.h 2009-10-02 02:46:43.000000000 +0800
--- ../st-1.9-patch/md.h 2018-11-04 18:21:53.000000000 +0800
***************
*** 420,432 ****
#elif defined(__arm__)
#define MD_STACK_GROWS_DOWN
#if defined(__GLIBC__) && __GLIBC__ >= 2
! #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[20]
#else
#error "ARM/Linux pre-glibc2 not supported yet"
#endif /* defined(__GLIBC__) && __GLIBC__ >= 2 */
#elif defined(__s390__)
#define MD_STACK_GROWS_DOWN
--- 420,439 ----
#elif defined(__arm__)
#define MD_STACK_GROWS_DOWN
+ #define MD_USE_BUILTIN_SETJMP
#if defined(__GLIBC__) && __GLIBC__ >= 2
! #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[8]
#else
#error "ARM/Linux pre-glibc2 not supported yet"
#endif /* defined(__GLIBC__) && __GLIBC__ >= 2 */
+ #elif defined(__aarch64__)
+ #define MD_STACK_GROWS_DOWN
+ #define MD_USE_BUILTIN_SETJMP
+
+ #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[13]
+
#elif defined(__s390__)
#define MD_STACK_GROWS_DOWN
*** md.S 2006-05-05 14:03:02.000000000 +0800
--- ../st-1.9-patch/md.S 2018-12-09 09:16:54.000000000 +0800
***************
*** 427,431 ****
--- 427,592 ----
/****************************************************************/
+ #elif defined(__arm__)
+
+ /* Register list for a ldm/stm instruction to load/store
+ the general registers from a __jmp_buf. */
+ # define JMP_BUF_REGLIST {v1-v6, sl, fp, sp, lr}
+
+ .file "md.S"
+ .text
+
+ /* _st_md_cxt_save(__jmp_buf env) */
+ .globl _st_md_cxt_save
+ .type _st_md_cxt_save, %function
+ .align 2
+ _st_md_cxt_save:
+ mov ip, r0
+
+ /* Save registers */
+ stmia ip!, JMP_BUF_REGLIST
+
+ #ifdef __VFP_FP__
+ /* Store the VFP registers. */
+ /* Following instruction is vstmia ip!, {d8-d15}. */
+ stc p11, cr8, [ip], #64
+ #endif
+
+ #ifdef __IWMMXT__
+ /* Save the call-preserved iWMMXt registers. */
+ /* Following instructions are wstrd wr10, [ip], #8 (etc.) */
+ stcl p1, cr10, [r12], #8
+ stcl p1, cr11, [r12], #8
+ stcl p1, cr12, [r12], #8
+ stcl p1, cr13, [r12], #8
+ stcl p1, cr14, [r12], #8
+ stcl p1, cr15, [r12], #8
+ #endif
+
+ mov r0, #0
+ bx lr
+
+ .size _st_md_cxt_save, .-_st_md_cxt_save
+
+ /****************************************************************/
+
+ /* _st_md_cxt_restore(__jmp_buf env, int val) */
+ .globl _st_md_cxt_restore
+ .type _st_md_cxt_restore, %function
+ .align 2
+ _st_md_cxt_restore:
+ mov ip, r0
+
+ /* Restore registers */
+ ldmia ip!, JMP_BUF_REGLIST
+
+ #ifdef __VFP_FP__
+ /* Restore the VFP registers. */
+ /* Following instruction is vldmia ip!, {d8-d15}. */
+ ldc p11, cr8, [r12], #64
+ #endif
+
+ #ifdef __IWMMXT__
+ /* Restore the call-preserved iWMMXt registers. */
+ /* Following instructions are wldrd wr10, [ip], #8 (etc.) */
+ ldcl p1, cr10, [r12], #8
+ ldcl p1, cr11, [r12], #8
+ ldcl p1, cr12, [r12], #8
+ ldcl p1, cr13, [r12], #8
+ ldcl p1, cr14, [r12], #8
+ ldcl p1, cr15, [r12], #8
+ #endif
+
+ movs r0, r1 /* get the return value in place */
+ moveq r0, #1 /* can't let setjmp() return zero! */
+ bx lr
+
+ .size _st_md_cxt_restore, .-_st_md_cxt_restore
+
+ /****************************************************************/
+
+ #elif defined(__aarch64__)
+
+ #define JB_X19 0
+ #define JB_X20 1
+ #define JB_X21 2
+ #define JB_X22 3
+ #define JB_X23 4
+ #define JB_X24 5
+ #define JB_X25 6
+ #define JB_X26 7
+ #define JB_X27 8
+ #define JB_X28 9
+ #define JB_X29 10
+ #define JB_LR 11
+ #define JB_SP 13
+
+ #define JB_D8 14
+ #define JB_D9 15
+ #define JB_D10 16
+ #define JB_D11 17
+ #define JB_D12 18
+ #define JB_D13 19
+ #define JB_D14 20
+ #define JB_D15 21
+
+ .file "md.S"
+ .text
+
+ /* _st_md_cxt_save(__jmp_buf env) */
+ .globl _st_md_cxt_save
+ .type _st_md_cxt_save, %function
+ .align 4
+ _st_md_cxt_save:
+ stp x19, x20, [x0, #JB_X19<<3]
+ stp x21, x22, [x0, #JB_X21<<3]
+ stp x23, x24, [x0, #JB_X23<<3]
+ stp x25, x26, [x0, #JB_X25<<3]
+ stp x27, x28, [x0, #JB_X27<<3]
+ stp x29, x30, [x0, #JB_X29<<3]
+
+ stp d8, d9, [x0, #JB_D8<<3]
+ stp d10, d11, [x0, #JB_D10<<3]
+ stp d12, d13, [x0, #JB_D12<<3]
+ stp d14, d15, [x0, #JB_D14<<3]
+ mov x2, sp
+ str x2, [x0, #JB_SP<<3]
+
+ mov x0, #0
+ ret
+ .size _st_md_cxt_save, .-_st_md_cxt_save
+
+ /****************************************************************/
+
+ /* _st_md_cxt_restore(__jmp_buf env, int val) */
+ .globl _st_md_cxt_restore
+ .type _st_md_cxt_restore, %function
+ .align 4
+ _st_md_cxt_restore:
+ ldp x19, x20, [x0, #JB_X19<<3]
+ ldp x21, x22, [x0, #JB_X21<<3]
+ ldp x23, x24, [x0, #JB_X23<<3]
+ ldp x25, x26, [x0, #JB_X25<<3]
+ ldp x27, x28, [x0, #JB_X27<<3]
+
+ ldp x29, x30, [x0, #JB_X29<<3]
+
+ ldp d8, d9, [x0, #JB_D8<<3]
+ ldp d10, d11, [x0, #JB_D10<<3]
+ ldp d12, d13, [x0, #JB_D12<<3]
+ ldp d14, d15, [x0, #JB_D14<<3]
+
+ ldr x5, [x0, #JB_SP<<3]
+ mov sp, x5
+
+ cmp x1, #0
+ mov x0, #1
+ csel x0, x1, x0, ne
+ /* Use br instead of ret because ret is guaranteed to mispredict */
+ br x30
+ .size _st_md_cxt_restore, .-_st_md_cxt_restore
+
+ /****************************************************************/
+
#endif