1*647f063dSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*647f063dSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*647f063dSAndrew Rist * or more contributor license agreements. See the NOTICE file
5*647f063dSAndrew Rist * distributed with this work for additional information
6*647f063dSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*647f063dSAndrew Rist * to you under the Apache License, Version 2.0 (the
8*647f063dSAndrew Rist * "License"); you may not use this file except in compliance
9*647f063dSAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11*647f063dSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13*647f063dSAndrew Rist * Unless required by applicable law or agreed to in writing,
14*647f063dSAndrew Rist * software distributed under the License is distributed on an
15*647f063dSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*647f063dSAndrew Rist * KIND, either express or implied. See the License for the
17*647f063dSAndrew Rist * specific language governing permissions and limitations
18*647f063dSAndrew Rist * under the License.
19cdf0e10cSrcweir *
20*647f063dSAndrew Rist *************************************************************/
21*647f063dSAndrew Rist
22*647f063dSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir #include <stdio.h>
25cdf0e10cSrcweir #include <stdlib.h>
26cdf0e10cSrcweir #include <errno.h>
27cdf0e10cSrcweir #include <string.h>
28cdf0e10cSrcweir
29cdf0e10cSrcweir #include <unistd.h>
30cdf0e10cSrcweir #include <sys/types.h>
31cdf0e10cSrcweir
32cdf0e10cSrcweir #include <stdarg.h>
33cdf0e10cSrcweir
34cdf0e10cSrcweir #include <signal.h>
35cdf0e10cSrcweir #include <setjmp.h>
36cdf0e10cSrcweir
37cdf0e10cSrcweir #define printTypeSize(Type,Name) printf( "sizeof(%s)\t\t= %d\n", Name, (int) sizeof (Type) )
38cdf0e10cSrcweir
39cdf0e10cSrcweir #define isSignedType(Type) (((Type)-1) < 0)
40cdf0e10cSrcweir #define printTypeSign(Type,Name) printf( "%s\t\t= %s %s\n", Name, ( isSignedType(Type) ? "signed" : "unsigned" ), Name )
41cdf0e10cSrcweir
42cdf0e10cSrcweir
43cdf0e10cSrcweir /*************************************************************************
44cdf0e10cSrcweir |*
45cdf0e10cSrcweir |* IsBigEndian()
46cdf0e10cSrcweir |*
47cdf0e10cSrcweir |* Beschreibung True, wenn CPU BigEndian ist
48cdf0e10cSrcweir |*
49cdf0e10cSrcweir |* Ersterstellung EG 26.06.96
50cdf0e10cSrcweir |* Letzte Aenderung
51cdf0e10cSrcweir |*
52cdf0e10cSrcweir *************************************************************************/
IsBigEndian()53cdf0e10cSrcweir int IsBigEndian()
54cdf0e10cSrcweir {
55cdf0e10cSrcweir long l = 1;
56cdf0e10cSrcweir return ! *(char*)&l;
57cdf0e10cSrcweir }
58cdf0e10cSrcweir
59cdf0e10cSrcweir /*************************************************************************
60cdf0e10cSrcweir |*
61cdf0e10cSrcweir |* Typdeclarations for memory access test functions
62cdf0e10cSrcweir |*
63cdf0e10cSrcweir *************************************************************************/
64cdf0e10cSrcweir typedef enum { t_char, t_short, t_int, t_long, t_double } Type;
65cdf0e10cSrcweir typedef int (*TestFunc)( Type, void* );
66cdf0e10cSrcweir
67cdf0e10cSrcweir
68cdf0e10cSrcweir /*************************************************************************
69cdf0e10cSrcweir |*
70cdf0e10cSrcweir |* PrintArgs()
71cdf0e10cSrcweir |*
72cdf0e10cSrcweir |* Beschreibung Testfunktion fuer variable Parameter
73cdf0e10cSrcweir |*
74cdf0e10cSrcweir |* Ersterstellung EG 26.06.96
75cdf0e10cSrcweir |* Letzte Aenderung
76cdf0e10cSrcweir |*
77cdf0e10cSrcweir *************************************************************************/
PrintArgs(int p,...)78cdf0e10cSrcweir void PrintArgs( int p, ... )
79cdf0e10cSrcweir {
80cdf0e10cSrcweir int value;
81cdf0e10cSrcweir va_list ap;
82cdf0e10cSrcweir
83cdf0e10cSrcweir va_start( ap, p );
84cdf0e10cSrcweir
85cdf0e10cSrcweir printf( "value = %d", p );
86cdf0e10cSrcweir
87cdf0e10cSrcweir while ( ( value = va_arg(ap, int) ) != 0 )
88cdf0e10cSrcweir printf( " %d", value );
89cdf0e10cSrcweir
90cdf0e10cSrcweir printf( "\n" );
91cdf0e10cSrcweir va_end(ap);
92cdf0e10cSrcweir }
93cdf0e10cSrcweir
94cdf0e10cSrcweir /*************************************************************************
95cdf0e10cSrcweir |*
96cdf0e10cSrcweir |* SignalHdl()
97cdf0e10cSrcweir |*
98cdf0e10cSrcweir |* Beschreibung faengt SIGBUS und SIGSEGV in check() ab
99cdf0e10cSrcweir |*
100cdf0e10cSrcweir |* Ersterstellung EG 26.06.96
101cdf0e10cSrcweir |* Letzte Aenderung
102cdf0e10cSrcweir |*
103cdf0e10cSrcweir *************************************************************************/
104cdf0e10cSrcweir
105cdf0e10cSrcweir static sigjmp_buf jmpbuf;
106cdf0e10cSrcweir static volatile sig_atomic_t hit;
107cdf0e10cSrcweir
SignalHdl(int sig)108cdf0e10cSrcweir void SignalHdl( int sig )
109cdf0e10cSrcweir {
110cdf0e10cSrcweir (void) sig; // ignored
111cdf0e10cSrcweir hit = 1;
112cdf0e10cSrcweir siglongjmp(jmpbuf, 0);
113cdf0e10cSrcweir }
114cdf0e10cSrcweir
115cdf0e10cSrcweir /*************************************************************************
116cdf0e10cSrcweir |*
117cdf0e10cSrcweir |* check()
118cdf0e10cSrcweir |*
119cdf0e10cSrcweir |* Beschreibung Testet MemoryZugriff (read/write)
120cdf0e10cSrcweir |*
121cdf0e10cSrcweir |* Ersterstellung EG 26.06.96
122cdf0e10cSrcweir |* Letzte Aenderung
123cdf0e10cSrcweir |*
124cdf0e10cSrcweir *************************************************************************/
check(TestFunc func,Type eT,void * p)125cdf0e10cSrcweir int check( TestFunc func, Type eT, void* p )
126cdf0e10cSrcweir {
127cdf0e10cSrcweir hit = 0;
128cdf0e10cSrcweir if (sigsetjmp(jmpbuf, 1) == 0) {
129cdf0e10cSrcweir struct sigaction sa;
130cdf0e10cSrcweir sa.sa_handler = SignalHdl;
131cdf0e10cSrcweir sigemptyset(&sa.sa_mask);
132cdf0e10cSrcweir sa.sa_flags = 0;
133cdf0e10cSrcweir if (sigaction(SIGBUS, &sa, NULL) != 0 ||
134cdf0e10cSrcweir sigaction(SIGSEGV, &sa, NULL) != 0)
135cdf0e10cSrcweir {
136cdf0e10cSrcweir abort();
137cdf0e10cSrcweir }
138cdf0e10cSrcweir func(eT, p);
139cdf0e10cSrcweir sa.sa_handler = SIG_DFL;
140cdf0e10cSrcweir if (sigaction(SIGBUS, &sa, NULL) != 0 ||
141cdf0e10cSrcweir sigaction(SIGSEGV, &sa, NULL) != 0)
142cdf0e10cSrcweir {
143cdf0e10cSrcweir abort();
144cdf0e10cSrcweir }
145cdf0e10cSrcweir }
146cdf0e10cSrcweir return hit ? -1 : 0;
147cdf0e10cSrcweir }
148cdf0e10cSrcweir
149cdf0e10cSrcweir /*************************************************************************
150cdf0e10cSrcweir |*
151cdf0e10cSrcweir |* GetAtAddress()
152cdf0e10cSrcweir |*
153cdf0e10cSrcweir |* Beschreibung memory read access
154cdf0e10cSrcweir |*
155cdf0e10cSrcweir |* Ersterstellung EG 26.06.96
156cdf0e10cSrcweir |* Letzte Aenderung
157cdf0e10cSrcweir |*
158cdf0e10cSrcweir *************************************************************************/
159cdf0e10cSrcweir #if defined(IA64) || defined(ARM32) || defined(HPPA) || defined(AXP)
160cdf0e10cSrcweir
forceerror()161cdf0e10cSrcweir int forceerror()
162cdf0e10cSrcweir {
163cdf0e10cSrcweir #if defined(ARM32)
164cdf0e10cSrcweir // workaround for qemu-user
165cdf0e10cSrcweir hit = 1;
166cdf0e10cSrcweir #else
167cdf0e10cSrcweir raise (SIGBUS);
168cdf0e10cSrcweir #endif
169cdf0e10cSrcweir return 1;
170cdf0e10cSrcweir }
171cdf0e10cSrcweir
GetAtAddress(Type eT,void * p)172cdf0e10cSrcweir int GetAtAddress( Type eT, void* p )
173cdf0e10cSrcweir {
174cdf0e10cSrcweir switch ( eT )
175cdf0e10cSrcweir {
176cdf0e10cSrcweir case t_char: return *((char*)p);
177cdf0e10cSrcweir case t_short: if ((long)p % sizeof(short)) return forceerror(); else return *((short*)p);
178cdf0e10cSrcweir case t_int: if ((long)p % sizeof(int)) return forceerror(); else return *((int*)p);
179cdf0e10cSrcweir case t_long: if ((long)p % sizeof(long)) return forceerror(); else return *((long*)p);
180cdf0e10cSrcweir case t_double: if ((long)p % sizeof(double)) return forceerror(); else return *((double*)p);
181cdf0e10cSrcweir }
182cdf0e10cSrcweir abort();
183cdf0e10cSrcweir }
184cdf0e10cSrcweir
185cdf0e10cSrcweir #else
186cdf0e10cSrcweir static int dummy(void* unused);
187cdf0e10cSrcweir
GetAtAddress(Type eT,void * p)188cdf0e10cSrcweir int GetAtAddress( Type eT, void* p )
189cdf0e10cSrcweir {
190cdf0e10cSrcweir switch ( eT )
191cdf0e10cSrcweir {
192cdf0e10cSrcweir case t_char: { char x = *(char*)p; return dummy(&x); }
193cdf0e10cSrcweir case t_short: { short x = *(short*)p; return dummy(&x); }
194cdf0e10cSrcweir case t_int: { int x = *(int*)p; return dummy(&x); }
195cdf0e10cSrcweir case t_long: { long x = *(long*)p; return dummy(&x); }
196cdf0e10cSrcweir case t_double: { double x = *(double*)p; return dummy(&x); }
197cdf0e10cSrcweir }
198cdf0e10cSrcweir abort();
199cdf0e10cSrcweir }
200cdf0e10cSrcweir
dummy(void * unused)201cdf0e10cSrcweir int dummy(void* unused)
202cdf0e10cSrcweir {
203cdf0e10cSrcweir (void)unused;
204cdf0e10cSrcweir return 0;
205cdf0e10cSrcweir }
206cdf0e10cSrcweir
207cdf0e10cSrcweir #endif
208cdf0e10cSrcweir /*************************************************************************
209cdf0e10cSrcweir |*
210cdf0e10cSrcweir |* SetAtAddress()
211cdf0e10cSrcweir |*
212cdf0e10cSrcweir |* Beschreibung memory write access
213cdf0e10cSrcweir |*
214cdf0e10cSrcweir |* Ersterstellung EG 26.06.96
215cdf0e10cSrcweir |* Letzte Aenderung
216cdf0e10cSrcweir |*
217cdf0e10cSrcweir *************************************************************************/
SetAtAddress(Type eT,void * p)218cdf0e10cSrcweir int SetAtAddress( Type eT, void* p )
219cdf0e10cSrcweir {
220cdf0e10cSrcweir switch ( eT )
221cdf0e10cSrcweir {
222cdf0e10cSrcweir case t_char: return *((char*)p) = 0;
223cdf0e10cSrcweir case t_short: return *((short*)p) = 0;
224cdf0e10cSrcweir case t_int: return *((int*)p) = 0;
225cdf0e10cSrcweir case t_long: return *((long*)p) = 0;
226cdf0e10cSrcweir case t_double: return *((double*)p)= 0;
227cdf0e10cSrcweir }
228cdf0e10cSrcweir abort();
229cdf0e10cSrcweir }
230cdf0e10cSrcweir
TypeName(Type eT)231cdf0e10cSrcweir char* TypeName( Type eT )
232cdf0e10cSrcweir {
233cdf0e10cSrcweir switch ( eT )
234cdf0e10cSrcweir {
235cdf0e10cSrcweir case t_char: return "char";
236cdf0e10cSrcweir case t_short: return "short";
237cdf0e10cSrcweir case t_int: return "int";
238cdf0e10cSrcweir case t_long: return "long";
239cdf0e10cSrcweir case t_double: return "double";
240cdf0e10cSrcweir }
241cdf0e10cSrcweir abort();
242cdf0e10cSrcweir }
243cdf0e10cSrcweir
244cdf0e10cSrcweir /*************************************************************************
245cdf0e10cSrcweir |*
246cdf0e10cSrcweir |* Check(Get|Set)Access()
247cdf0e10cSrcweir |*
248cdf0e10cSrcweir |* Beschreibung Testet MemoryZugriff (read/write)
249cdf0e10cSrcweir |* Zugriffsverletzungen werden abgefangen
250cdf0e10cSrcweir |*
251cdf0e10cSrcweir |* Ersterstellung EG 26.06.96
252cdf0e10cSrcweir |* Letzte Aenderung
253cdf0e10cSrcweir |*
254cdf0e10cSrcweir *************************************************************************/
CheckGetAccess(Type eT,void * p)255cdf0e10cSrcweir int CheckGetAccess( Type eT, void* p )
256cdf0e10cSrcweir {
257cdf0e10cSrcweir int b;
258cdf0e10cSrcweir b = -1 != check( (TestFunc)GetAtAddress, eT, p );
259cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
260cdf0e10cSrcweir fprintf( stderr,
261cdf0e10cSrcweir "%s read %s at %p\n",
262cdf0e10cSrcweir (b? "can" : "can not" ), TypeName(eT), p );
263cdf0e10cSrcweir #endif
264cdf0e10cSrcweir return b;
265cdf0e10cSrcweir }
CheckSetAccess(Type eT,void * p)266cdf0e10cSrcweir int CheckSetAccess( Type eT, void* p )
267cdf0e10cSrcweir {
268cdf0e10cSrcweir int b;
269cdf0e10cSrcweir
270cdf0e10cSrcweir b = -1 != check( (TestFunc)SetAtAddress, eT, p );
271cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
272cdf0e10cSrcweir fprintf( stderr,
273cdf0e10cSrcweir "%s write %s at %p\n",
274cdf0e10cSrcweir (b? "can" : "can not" ), TypeName(eT), p );
275cdf0e10cSrcweir #endif
276cdf0e10cSrcweir return b;
277cdf0e10cSrcweir }
278cdf0e10cSrcweir
279cdf0e10cSrcweir /*************************************************************************
280cdf0e10cSrcweir |*
281cdf0e10cSrcweir |* GetAlignment()
282cdf0e10cSrcweir |*
283cdf0e10cSrcweir |* Beschreibung Bestimmt das Alignment verschiedener Typen
284cdf0e10cSrcweir |*
285cdf0e10cSrcweir |* Ersterstellung EG 26.06.96
286cdf0e10cSrcweir |* Letzte Aenderung
287cdf0e10cSrcweir |*
288cdf0e10cSrcweir *************************************************************************/
GetAlignment(Type eT)289cdf0e10cSrcweir int GetAlignment( Type eT )
290cdf0e10cSrcweir {
291cdf0e10cSrcweir char a[ 16*8 ];
292cdf0e10cSrcweir long p = (long)(void*)a;
293cdf0e10cSrcweir int i;
294cdf0e10cSrcweir
295cdf0e10cSrcweir /* clear a[...] to set legal value for double access */
296cdf0e10cSrcweir for ( i = 0; i < 16*8; i++ )
297cdf0e10cSrcweir a[i] = 0;
298cdf0e10cSrcweir
299cdf0e10cSrcweir p = ( p + 0xF ) & ~0xF;
300cdf0e10cSrcweir for ( i = 1; i < 16; i++ )
301cdf0e10cSrcweir if ( CheckGetAccess( eT, (void*)(p+i) ) )
302cdf0e10cSrcweir return i;
303cdf0e10cSrcweir return 0;
304cdf0e10cSrcweir }
305cdf0e10cSrcweir
306cdf0e10cSrcweir /*************************************************************************
307cdf0e10cSrcweir |*
308cdf0e10cSrcweir |* struct Description
309cdf0e10cSrcweir |*
310cdf0e10cSrcweir |* Beschreibung Beschreibt die Parameter der Architektur
311cdf0e10cSrcweir |*
312cdf0e10cSrcweir |* Ersterstellung EG 26.06.96
313cdf0e10cSrcweir |* Letzte Aenderung
314cdf0e10cSrcweir |*
315cdf0e10cSrcweir *************************************************************************/
316cdf0e10cSrcweir struct Description
317cdf0e10cSrcweir {
318cdf0e10cSrcweir int bBigEndian;
319cdf0e10cSrcweir int nAlignment[3]; /* 2,4,8 */
320cdf0e10cSrcweir };
321cdf0e10cSrcweir
322cdf0e10cSrcweir /*************************************************************************
323cdf0e10cSrcweir |*
324cdf0e10cSrcweir |* Description_Ctor()
325cdf0e10cSrcweir |*
326cdf0e10cSrcweir |* Beschreibung Bestimmt die Parameter der Architektur
327cdf0e10cSrcweir |*
328cdf0e10cSrcweir |* Ersterstellung EG 26.06.96
329cdf0e10cSrcweir |* Letzte Aenderung
330cdf0e10cSrcweir |*
331cdf0e10cSrcweir *************************************************************************/
Description_Ctor(struct Description * pThis)332cdf0e10cSrcweir void Description_Ctor( struct Description* pThis )
333cdf0e10cSrcweir {
334cdf0e10cSrcweir pThis->bBigEndian = IsBigEndian();
335cdf0e10cSrcweir
336cdf0e10cSrcweir if ( sizeof(short) != 2 )
337cdf0e10cSrcweir abort();
338cdf0e10cSrcweir pThis->nAlignment[0] = GetAlignment( t_short );
339cdf0e10cSrcweir if ( sizeof(int) != 4 )
340cdf0e10cSrcweir abort();
341cdf0e10cSrcweir pThis->nAlignment[1] = GetAlignment( t_int );
342cdf0e10cSrcweir
343cdf0e10cSrcweir if ( sizeof(long) == 8 )
344cdf0e10cSrcweir pThis->nAlignment[2] = GetAlignment( t_long );
345cdf0e10cSrcweir else if ( sizeof(double) == 8 )
346cdf0e10cSrcweir pThis->nAlignment[2] = GetAlignment( t_double );
347cdf0e10cSrcweir else
348cdf0e10cSrcweir abort();
349cdf0e10cSrcweir }
350cdf0e10cSrcweir
351cdf0e10cSrcweir /*************************************************************************
352cdf0e10cSrcweir |*
353cdf0e10cSrcweir |* Description_Print()
354cdf0e10cSrcweir |*
355cdf0e10cSrcweir |* Beschreibung Schreibt die Parameter der Architektur als Header
356cdf0e10cSrcweir |*
357cdf0e10cSrcweir |* Ersterstellung EG 26.06.96
358cdf0e10cSrcweir |* Letzte Aenderung
359cdf0e10cSrcweir |*
360cdf0e10cSrcweir *************************************************************************/
Description_Print(struct Description * pThis,char * name)361cdf0e10cSrcweir void Description_Print( struct Description* pThis, char* name )
362cdf0e10cSrcweir {
363cdf0e10cSrcweir int i;
364cdf0e10cSrcweir FILE* f = fopen( name, "w" );
365cdf0e10cSrcweir if( ! f ) {
366cdf0e10cSrcweir fprintf( stderr, "Unable to open file %s: %s\n", name, strerror( errno ) );
367cdf0e10cSrcweir exit( 99 );
368cdf0e10cSrcweir }
369cdf0e10cSrcweir fprintf( f, "/* This file is autogenerated from the 'typesconfig' program\n * in the sal module\n */\n\n" );
370cdf0e10cSrcweir
371cdf0e10cSrcweir /* Disabled for now in preference to big/little endian defines in <osl/endian.h> fa (2004-03-15) */
372cdf0e10cSrcweir /* fprintf( f, "#define SAL_TYPES_%s\n", pThis->bBigEndian ? "BIGENDIAN" : "LITTLEENDIAN" ); */
373cdf0e10cSrcweir
374cdf0e10cSrcweir for ( i = 0; i < 3; i++ )
375cdf0e10cSrcweir fprintf( f, "#define SAL_TYPES_ALIGNMENT%d\t%d\n", 1 << (i+1), pThis->nAlignment[i] );
376cdf0e10cSrcweir fprintf( f, "#define SAL_TYPES_SIZEOFSHORT\t%d\n", (int) sizeof( short ) );
377cdf0e10cSrcweir fprintf( f, "#define SAL_TYPES_SIZEOFINT\t%d\n", (int) sizeof( int ) );
378cdf0e10cSrcweir fprintf( f, "#define SAL_TYPES_SIZEOFLONG\t%d\n", (int) sizeof( long ) );
379cdf0e10cSrcweir fprintf( f, "#define SAL_TYPES_SIZEOFLONGLONG\t%d\n", (int) sizeof( long long ) );
380cdf0e10cSrcweir fprintf( f, "#define SAL_TYPES_SIZEOFPOINTER\t%d\n", (int) sizeof( void* ) );
381cdf0e10cSrcweir
382cdf0e10cSrcweir /* Disabled for now, becuase OOo code assumes sizeof(double) == 8 and this is not
383cdf0e10cSrcweir * likely to change any time soon. fa (2004-03-15)
384cdf0e10cSrcweir */
385cdf0e10cSrcweir /* fprintf( f, "#define SAL_TYPES_SIZEOFDOUBLE\t%d\n", sizeof( double ) );*/
386cdf0e10cSrcweir
387cdf0e10cSrcweir fclose( f );
388cdf0e10cSrcweir }
389cdf0e10cSrcweir
390cdf0e10cSrcweir /*************************************************************************
391cdf0e10cSrcweir |*
392cdf0e10cSrcweir |* InfoMemoryAccess()
393cdf0e10cSrcweir |*
394cdf0e10cSrcweir |* Beschreibung Informeller Bytezugriffstest
395cdf0e10cSrcweir |*
396cdf0e10cSrcweir |* Ersterstellung EG 26.06.96
397cdf0e10cSrcweir |* Letzte Aenderung
398cdf0e10cSrcweir |*
399cdf0e10cSrcweir *************************************************************************/
InfoMemoryAccess(char * p)400cdf0e10cSrcweir void InfoMemoryAccess( char* p )
401cdf0e10cSrcweir {
402cdf0e10cSrcweir if ( CheckGetAccess( t_char, p ) )
403cdf0e10cSrcweir printf( "can read address %p\n", p );
404cdf0e10cSrcweir else
405cdf0e10cSrcweir printf( "cannot read address %p\n", p );
406cdf0e10cSrcweir
407cdf0e10cSrcweir if ( CheckSetAccess( t_char, p ) )
408cdf0e10cSrcweir printf( "can write address %p\n", p );
409cdf0e10cSrcweir else
410cdf0e10cSrcweir printf( "cannot write address %p\n", p );
411cdf0e10cSrcweir }
412cdf0e10cSrcweir
413cdf0e10cSrcweir /*************************************************************************
414cdf0e10cSrcweir |*
415cdf0e10cSrcweir |* InfoMemoryTypeAccess()
416cdf0e10cSrcweir |*
417cdf0e10cSrcweir |* Beschreibung Informeller Zugriffstest verschiedener Typen
418cdf0e10cSrcweir |*
419cdf0e10cSrcweir |* Ersterstellung EG 15.08.96
420cdf0e10cSrcweir |* Letzte Aenderung
421cdf0e10cSrcweir |*
422cdf0e10cSrcweir *************************************************************************/
InfoMemoryTypeAccess(Type eT)423cdf0e10cSrcweir void InfoMemoryTypeAccess( Type eT )
424cdf0e10cSrcweir {
425cdf0e10cSrcweir char a[64];
426cdf0e10cSrcweir int i;
427cdf0e10cSrcweir
428cdf0e10cSrcweir /* clear a[...] to set legal value for double access */
429cdf0e10cSrcweir for ( i = 0; i < 64; i++ )
430cdf0e10cSrcweir a[i] = 0;
431cdf0e10cSrcweir
432cdf0e10cSrcweir for ( i = 56; i >= 7; i >>= 1 )
433cdf0e10cSrcweir {
434cdf0e10cSrcweir if ( CheckGetAccess(eT, (long*)&a[i]) )
435cdf0e10cSrcweir printf( "Access %s on %i-Aligned Address : OK\n", TypeName(eT), i / 7 );
436cdf0e10cSrcweir else
437cdf0e10cSrcweir printf( "Access %s on %i-Aligned Address : ERROR\n", TypeName(eT), i / 7 );
438cdf0e10cSrcweir }
439cdf0e10cSrcweir }
440cdf0e10cSrcweir /************************************************************************
441cdf0e10cSrcweir *
442cdf0e10cSrcweir * Use C code to determine the characteristics of the building platform.
443cdf0e10cSrcweir *
444cdf0e10cSrcweir ************************************************************************/
main(int argc,char * argv[])445cdf0e10cSrcweir int main( int argc, char* argv[] )
446cdf0e10cSrcweir {
447cdf0e10cSrcweir printTypeSign( char, "char" );
448cdf0e10cSrcweir printTypeSign( short, "short" );
449cdf0e10cSrcweir printTypeSign( int, "int" );
450cdf0e10cSrcweir printTypeSign( long, "long" );
451cdf0e10cSrcweir printTypeSign( long long, "long long" );
452cdf0e10cSrcweir
453cdf0e10cSrcweir printTypeSize( short, "short" );
454cdf0e10cSrcweir printTypeSize( int, "int" );
455cdf0e10cSrcweir printTypeSize( long, "long" );
456cdf0e10cSrcweir printTypeSize( long long, "long long" );
457cdf0e10cSrcweir printTypeSize( float, "float" );
458cdf0e10cSrcweir printTypeSize( double, "double" );
459cdf0e10cSrcweir printTypeSize( void *, "void *" );
460cdf0e10cSrcweir
461cdf0e10cSrcweir if ( IsBigEndian() )
462cdf0e10cSrcweir printf( "BIGENDIAN (Sparc, RS6000, IP22, IP32, PowerPC(BE))\n" );
463cdf0e10cSrcweir else
464cdf0e10cSrcweir printf( "LITTLEENDIAN (Intel, x86-64, PowerPC(LE))\n" );
465cdf0e10cSrcweir
466cdf0e10cSrcweir /* PrintArgs( 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ); */
467cdf0e10cSrcweir
468cdf0e10cSrcweir if ( argc > 1 )
469cdf0e10cSrcweir {
470cdf0e10cSrcweir struct Description description;
471cdf0e10cSrcweir Description_Ctor( &description );
472cdf0e10cSrcweir Description_Print( &description, argv[1] );
473cdf0e10cSrcweir }
474cdf0e10cSrcweir {
475cdf0e10cSrcweir char* p = NULL;
476cdf0e10cSrcweir InfoMemoryAccess( p );
477cdf0e10cSrcweir p = (char*)&p;
478cdf0e10cSrcweir InfoMemoryAccess( p );
479cdf0e10cSrcweir InfoMemoryTypeAccess( t_short );
480cdf0e10cSrcweir InfoMemoryTypeAccess( t_int );
481cdf0e10cSrcweir InfoMemoryTypeAccess( t_long );
482cdf0e10cSrcweir InfoMemoryTypeAccess( t_double );
483cdf0e10cSrcweir }
484cdf0e10cSrcweir
485cdf0e10cSrcweir exit( 0 );
486cdf0e10cSrcweir }
487