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