diff options
Diffstat (limited to 'lib/libpthread/arch/arm/uthread_machdep.c')
-rw-r--r-- | lib/libpthread/arch/arm/uthread_machdep.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/lib/libpthread/arch/arm/uthread_machdep.c b/lib/libpthread/arch/arm/uthread_machdep.c new file mode 100644 index 00000000000..12996411b75 --- /dev/null +++ b/lib/libpthread/arch/arm/uthread_machdep.c @@ -0,0 +1,88 @@ +/* $OpenBSD: uthread_machdep.c,v 1.1 2004/02/09 13:14:34 drahn Exp $ */ +/* David Leonard, <d@csee.uq.edu.au>. Public domain */ + +#include <pthread.h> +#include "pthread_private.h" + +#if 0 +#define ALIGNBYTES 0xf + +/* Register save frame as it appears on the stack */ +struct frame { + int r1; + int reserved; + int gp[32-14]; + int lr, cr, ctr, xer; + double fp[32]; + double fs; + /* The rest are only valid in the initial frame */ + int next_r1; + int next_lr; +}; + +/* + * Given a stack and an entry function, initialise a state + * structure that can be later switched to. + */ +void +_thread_machdep_init(statep, base, len, entry) + struct _machdep_state* statep; + void *base; + int len; + void (*entry)(void); +{ + struct frame *f; + + /* Locate the initial frame, aligned at the top of the stack */ + f = (struct frame *)(((int)base + len - sizeof *f) & ~ALIGNBYTES); + + f->r1 = (int)&f->next_r1; + f->reserved = 0; + f->lr = (int)entry; + f->next_r1 = 0; /* for gdb */ + f->next_lr = 0; /* for gdb */ + + /* Initialise the new thread with all the state from this thread. */ + +#define copyreg(x) __asm__ volatile ("stw " #x ", %0" : "=m"(f->gp[x-14])) + copyreg(14); copyreg(15); copyreg(16); copyreg(17); copyreg(18); + copyreg(19); copyreg(20); copyreg(21); copyreg(22); copyreg(23); + copyreg(24); copyreg(25); copyreg(26); copyreg(27); copyreg(28); + copyreg(29); copyreg(30); copyreg(31); + +#define copysreg(nm) __asm__ volatile ("mf" #nm " %0" : "=r"(f->nm)) + copysreg(cr); copysreg(ctr); copysreg(xer); + +#define copyfreg(x) __asm__ volatile ("stfd " #x ", %0" : "=m"(f->fp[x])) + copyfreg(0); copyfreg(1); copyfreg(2); copyfreg(3); + copyfreg(4); copyfreg(5); copyfreg(6); copyfreg(7); + copyfreg(8); copyfreg(9); copyfreg(10); copyfreg(11); + copyfreg(12); copyfreg(13); copyfreg(14); copyfreg(15); + copyfreg(16); copyfreg(17); copyfreg(18); copyfreg(19); + copyfreg(20); copyfreg(21); copyfreg(22); copyfreg(23); + copyfreg(24); copyfreg(25); copyfreg(26); copyfreg(27); + copyfreg(28); copyfreg(29); copyfreg(30); copyfreg(31); + + __asm__ volatile ("mffs 0; stfd 0, %0" : "=m"(f->fs)); + + statep->frame = (int)f; +} +#endif + + +/* + * No-op float saves. + * (Floating point registers were saved in _thread_machdep_switch()) + */ + +void +_thread_machdep_save_float_state(statep) + struct _machdep_state* statep; +{ +} + +void +_thread_machdep_restore_float_state(statep) + struct _machdep_state* statep; +{ +} |