xref: /AOO41X/main/sal/typesconfig/typesconfig.c (revision 647f063d49501903f1667b75f5634541fc603283)
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