Mercurial > pub > dyncall > dyncall
comparison dyncallback/dyncall_args_sparc32.c @ 158:51b0a4544d9e
- sparc32 callbacks now complete, fixed 64bit value access alignment problems that caused SIGBUS errors
author | cslag |
---|---|
date | Thu, 29 Dec 2016 06:07:43 -0600 |
parents | 49549739228c |
children | f5577f6bf97a |
comparison
equal
deleted
inserted
replaced
157:49549739228c | 158:51b0a4544d9e |
---|---|
24 */ | 24 */ |
25 | 25 |
26 | 26 |
27 #include "dyncall_args_sparc32.h" | 27 #include "dyncall_args_sparc32.h" |
28 | 28 |
29 /* Compiler aligns this to 8-byte boundaries, b/c of dword members, a fact needed below */ | |
30 typedef union { | |
31 DCdouble d; | |
32 DCulonglong L; | |
33 DCulong l[2]; | |
34 } DCAligned64BitVal_t; | |
35 | |
29 static void* sparc_word(DCArgs* args) | 36 static void* sparc_word(DCArgs* args) |
30 { | 37 { |
31 return args->arg_ptr++; | 38 return args->arg_ptr++; |
32 } | 39 } |
33 | 40 |
36 void *p = args->arg_ptr; | 43 void *p = args->arg_ptr; |
37 args->arg_ptr += 2; | 44 args->arg_ptr += 2; |
38 return p; | 45 return p; |
39 } | 46 } |
40 | 47 |
48 /* copy words so that dwords are 8-byte aligned, for 64bit value indirection; unaligned | |
49 access results in SIGBUS; not quite sure why compiler doesn't abstract this (maybe b/c | |
50 of not having any idea about our assembler code?) */ | |
51 DCulonglong dcbArgULongLong(DCArgs* p) { DCAligned64BitVal_t v; DCulong *l = (DCulong*)sparc_dword(p); v.l[0]=l[0]; v.l[1]=l[1]; return v.L; } | |
52 DCdouble dcbArgDouble (DCArgs* p) { DCAligned64BitVal_t v; DCulong *l = (DCulong*)sparc_dword(p); v.l[0]=l[0]; v.l[1]=l[1]; return v.d; } | |
53 | |
54 /* rest of getters based on above functions */ | |
41 DCuint dcbArgUInt (DCArgs* p) { return *(DCuint*)sparc_word(p); } | 55 DCuint dcbArgUInt (DCArgs* p) { return *(DCuint*)sparc_word(p); } |
42 DCulonglong dcbArgULongLong(DCArgs* p) { return *(DCulonglong*)sparc_dword(p); } | |
43 | |
44 DClonglong dcbArgLongLong (DCArgs* p) { return (DClonglong)dcbArgULongLong(p); } | 56 DClonglong dcbArgLongLong (DCArgs* p) { return (DClonglong)dcbArgULongLong(p); } |
45 DCint dcbArgInt (DCArgs* p) { return (DCint) dcbArgUInt(p); } | 57 DCint dcbArgInt (DCArgs* p) { return (DCint) dcbArgUInt(p); } |
46 DClong dcbArgLong (DCArgs* p) { return (DClong) dcbArgUInt(p); } | 58 DClong dcbArgLong (DCArgs* p) { return (DClong) dcbArgUInt(p); } |
47 DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgUInt(p); } | 59 DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgUInt(p); } |
48 DCchar dcbArgChar (DCArgs* p) { return (DCchar) dcbArgUInt(p); } | 60 DCchar dcbArgChar (DCArgs* p) { return (DCchar) dcbArgUInt(p); } |
50 DCshort dcbArgShort (DCArgs* p) { return (DCshort) dcbArgUInt(p); } | 62 DCshort dcbArgShort (DCArgs* p) { return (DCshort) dcbArgUInt(p); } |
51 DCushort dcbArgUShort (DCArgs* p) { return (DCushort) dcbArgUInt(p); } | 63 DCushort dcbArgUShort (DCArgs* p) { return (DCushort) dcbArgUInt(p); } |
52 DCbool dcbArgBool (DCArgs* p) { return (DCbool) dcbArgUInt(p); } | 64 DCbool dcbArgBool (DCArgs* p) { return (DCbool) dcbArgUInt(p); } |
53 DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer) dcbArgUInt(p); } | 65 DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer) dcbArgUInt(p); } |
54 | 66 |
55 DCdouble dcbArgDouble (DCArgs* p) { return *(DCdouble*)sparc_dword(p); } | |
56 DCfloat dcbArgFloat (DCArgs* p) { return *(DCfloat*) sparc_word(p); } | 67 DCfloat dcbArgFloat (DCArgs* p) { return *(DCfloat*) sparc_word(p); } |
57 | 68 |