Skip to content

Commit

Permalink
add ARM buildin setjmp/longjmp support (#3)
Browse files Browse the repository at this point in the history
* add ARMv7 support

* add ARM buildin setjmp/longjmp support
  • Loading branch information
xzh3836598 authored and winlinvip committed Sep 3, 2016
1 parent 9f7ed8f commit 9a17dec
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 6 deletions.
34 changes: 34 additions & 0 deletions md.S
Original file line number Diff line number Diff line change
Expand Up @@ -462,6 +462,40 @@
#elif defined(__arm__)

/* TODO: FIXME: implement setjmp and longjmp for ARM */
.globl _st_md_cxt_save
.type _st_md_cxt_save, %function
.align 2
_st_md_cxt_save:
mov ip, r0 // r0 is the param jmpbuf ptr address.
// Save registers like
// *ip++ = v1
// *ip++ = ...
// *ip++ = v6
// *ip++ = sl
// *ip++ = fp
stmia ip!, {v1-v6, sl, fp} // TODO: compatible with other ARM version.
movs r2, sp
stmia ip!, {r2, lr}
mov r0, #0 // r0 save the return value(0) of setjmp.
bx lr // return
.size _st_md_cxt_save, .-_st_md_cxt_save

.globl _st_md_cxt_restore
.type _st_md_cxt_restore, %function
.align 2
_st_md_cxt_restore:
mov ip, r0 // r0 -> jmp_buf
movs r0, r1 // r1 -> return value
// The bellow is a group, that is:
// if (r0 == 0) r0 =1;
ITT eq
moveq r0, #1 // long_jmp should never return 0

ldmia ip!, {v1-v6, sl, fp} // restore registers.
ldr sp, [ip], #4 // restore sp, like: sp=*ip; ip+=4;
ldr lr, [ip], #4
bx lr
.size _st_md_cxt_restore, .-_st_md_cxt_restore

#endif

12 changes: 6 additions & 6 deletions md.h
Original file line number Diff line number Diff line change
Expand Up @@ -421,12 +421,12 @@
#elif defined(__arm__)
#define MD_STACK_GROWS_DOWN

#if defined(__GLIBC__) && __GLIBC__ >= 2
/* Merge from https://github.com/michaeltalyansky/state-threads/commit/56554a5c425aee8e7a73782eae23d74d83c4120a */
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[8]
#else
#error "ARM/Linux pre-glibc2 not supported yet"
#endif /* defined(__GLIBC__) && __GLIBC__ >= 2 */
#define MD_USE_BUILTIN_SETJMP

#ifndef JB_RSP
#define JB_RSP 8 // JB_RSP must be same as the index we save in jmpbuf
#endif
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_RSP]

#elif defined(__s390__)
#define MD_STACK_GROWS_DOWN
Expand Down

1 comment on commit 9a17dec

@winlinvip
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for #1

Please sign in to comment.