sysprobe.c
来自「一个很有名的硬件模拟器。可以模拟CPU」· C语言 代码 · 共 279 行
C
279 行
/* sysprobe.c - host endian probe implementation *//* SimpleScalar(TM) Tool Suite * Copyright (C) 1994-2003 by Todd M. Austin, Ph.D. and SimpleScalar, LLC. * All Rights Reserved. * * THIS IS A LEGAL DOCUMENT, BY USING SIMPLESCALAR, * YOU ARE AGREEING TO THESE TERMS AND CONDITIONS. * * No portion of this work may be used by any commercial entity, or for any * commercial purpose, without the prior, written permission of SimpleScalar, * LLC (info@simplescalar.com). Nonprofit and noncommercial use is permitted * as described below. * * 1. SimpleScalar is provided AS IS, with no warranty of any kind, express * or implied. The user of the program accepts full responsibility for the * application of the program and the use of any results. * * 2. Nonprofit and noncommercial use is encouraged. SimpleScalar may be * downloaded, compiled, executed, copied, and modified solely for nonprofit, * educational, noncommercial research, and noncommercial scholarship * purposes provided that this notice in its entirety accompanies all copies. * Copies of the modified software can be delivered to persons who use it * solely for nonprofit, educational, noncommercial research, and * noncommercial scholarship purposes provided that this notice in its * entirety accompanies all copies. * * 3. ALL COMMERCIAL USE, AND ALL USE BY FOR PROFIT ENTITIES, IS EXPRESSLY * PROHIBITED WITHOUT A LICENSE FROM SIMPLESCALAR, LLC (info@simplescalar.com). * * 4. No nonprofit user may place any restrictions on the use of this software, * including as modified by the user, by any other authorized user. * * 5. Noncommercial and nonprofit users may distribute copies of SimpleScalar * in compiled or executable form as set forth in Section 2, provided that * either: (A) it is accompanied by the corresponding machine-readable source * code, or (B) it is accompanied by a written offer, with no time limit, to * give anyone a machine-readable copy of the corresponding source code in * return for reimbursement of the cost of distribution. This written offer * must permit verbatim duplication by anyone, or (C) it is distributed by * someone who received only the executable form, and is accompanied by a * copy of the written offer of source code. * * 6. SimpleScalar was developed by Todd M. Austin, Ph.D. The tool suite is * currently maintained by SimpleScalar LLC (info@simplescalar.com). US Mail: * 2395 Timbercrest Court, Ann Arbor, MI 48105. * * Copyright (C) 1994-2003 by Todd M. Austin, Ph.D. and SimpleScalar, LLC. */#include <stdio.h>#include <stdlib.h>#ifndef _MSC_VER#include <unistd.h>#else /* _MSC_VER */#define access _access#define X_OK 4#endif#include "host.h"#include "misc.h"char *gzip_paths[] ={ "/bin/gzip", "/usr/bin/gzip", "/usr/local/bin/gzip", "/usr/intel/bin/gzip", "/usr/gnu/bin/gzip", "/usr/local/gnu/bin", NULL};#define HOST_ONLY#include "endian.c"#define CAT(a,b) a/**/b#define MSB 0x80000000intfast_SRL(void){ word_t ui; if (sizeof(ui) != 4) { /* fundamental size assumption broken - emulate SRL */ return FALSE; } ui = (word_t)MSB; if (((ui >> 1) & MSB) != 0) { /* unsigned int does SRA - emulate SRL */ return FALSE; } else { /* unsigned int does SRL - use fast native SRL */ return TRUE; }}intfast_SRA(void){ sword_t si; if (sizeof(si) != 4) { /* fundamental size assumption broken - emulate SRA */ return FALSE; } si = (sword_t)MSB; if ((si >> 1) & MSB) { /* signed int does SRA - use fast native SRA */ return TRUE; } else { /* singned int does SRL - emulate SRA */ return FALSE; }}intmain(int argc, char **argv){ int little_bytes = 0, little_words = 0; if (argc == 2 && !strcmp(argv[1], "-s")) { switch (endian_host_byte_order()) { case endian_big: fprintf(stdout, "big\n"); break; case endian_little: fprintf(stdout, "little\n"); break; case endian_unknown: fprintf(stderr, "\nerror: cannot determine byte order!\n"); exit(1); default: abort(); } } else if (argc == 2 && !strcmp(argv[1], "-libs")) {#ifdef BFD_LOADER fprintf(stdout, "-lbfd -liberty ");#endif /* BFD_LOADER */#ifdef linux /* nada... */#elif defined(__USLC__) || (defined(__svr4__) && defined(__i386__) && defined(__unix__)) fprintf(stdout, "-L/usr/ucblib -lucb ");#else /* nada */#endif fprintf(stdout, " \n"); } else if (argc == 1 || (argc == 2 && !strcmp(argv[1], "-flags"))) { switch (endian_host_byte_order()) { case endian_big: fprintf(stdout, "-DBYTES_BIG_ENDIAN "); break; case endian_little: fprintf(stdout, "-DBYTES_LITTLE_ENDIAN "); little_bytes = 1; break; case endian_unknown: fprintf(stderr, "\nerror: cannot determine byte order!\n"); exit(1); default: abort(); } switch (endian_host_word_order()) { case endian_big: fprintf(stdout, "-DWORDS_BIG_ENDIAN "); break; case endian_little: fprintf(stdout, "-DWORDS_LITTLE_ENDIAN "); little_words = 1; break; case endian_unknown: fprintf(stderr, "\nerror: cannot determine word order!\n"); exit(1); default: abort(); }#ifdef _AIX fprintf(stdout, "-D_ALL_SOURCE ");#endif /* _AIX */#if (defined(hpux) || defined(__hpux)) && !defined(__GNUC__) fprintf(stdout, "-D_INCLUDE_HPUX_SOURCE -D_INCLUDE_XOPEN_SOURCE -D_INCLUDE_AES_SOURCE ");#endif /* hpux */#ifndef __GNUC__ /* probe compiler approach needed to concatenate symbols in CPP, new style concatenation is always used with GNU GCC */ { int i = 5, j; j = CAT(-,-i); if (j == 4) { /* old style symbol concatenation worked */ fprintf(stdout, "-DOLD_SYMCAT "); } else if (j == 5) { /* old style symbol concatenation does not work, assume that new style symbol concatenation works */ ; } else { /* huh!?!?! */ fprintf(stderr, "\nerror: cannot grok symbol concat method!\n"); exit(1); } }#endif /* __GNUC__ */#ifndef SLOW_SHIFTS /* probe host shift capabilities */ if (fast_SRL()) fprintf(stdout, "-DFAST_SRL "); if (fast_SRA()) fprintf(stdout, "-DFAST_SRA ");#endif /* !SLOW_SHIFTS */ /* locate GZIP */#ifndef GZIP_PATH { int i; for (i=0; gzip_paths[i] != NULL; i++) { if (access(gzip_paths[i], X_OK) == 0) { fprintf(stdout, "-DGZIP_PATH=\"%s\" ", gzip_paths[i]); break; } } }#endif /* !GZIP_PATH */ } else if (argc == 2 && !strcmp(argv[1], "-t")) { fprintf(stdout, "sizeof(int) = %d\n", sizeof(int)); fprintf(stdout, "sizeof(long) = %d\n", sizeof(long)); } /* check for different byte/word endian-ness */ if (little_bytes != little_words) { fprintf(stderr, "\nerror: opposite byte/word endian currently not supported!\n"); exit(1); } exit(0); return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?