home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 6 / AACD06.ISO / AACD / Emulation / BasiliskII / src / Unix / Solaris / which_sparc < prev   
Text File  |  1999-10-21  |  2KB  |  122 lines

  1. #!/bin/sh
  2.  
  3. # which_sparc
  4. #
  5. # This script generates a program that tests for a SPARC processor class
  6. # Program returns:
  7. #  0 unknown SPARC processor
  8. #  8 SPARC V8 `compliant' processor    (umul instruction is legal)
  9. #  9 SPARC V9 `compliant' processor    (popc instruction is legal)
  10. #
  11. # The script prints:
  12. #  "unknown SPARC architecture"
  13. #  SPARC_V8
  14. #  SPARC_V9
  15. #
  16. # I hope this works for other machines and OS. Tested machines are:
  17. # Sun Ultra 10 (Solaris 7), SPARC Station 5 (Solaris 2.5.1)
  18. #
  19. # Gwenole Beauchesne
  20. # gb@dial.oleane.com
  21.  
  22. CC=gcc
  23. PROG=./conftest
  24. SOURCE=./conftest.c
  25.  
  26. if [ ! -x $PROG ]; then
  27. cat > $SOURCE << EOF
  28. #include <stdio.h>
  29. #include <signal.h>
  30.  
  31. typedef unsigned int uint32;
  32. typedef uint32 (*sparc_code_func)(void);
  33.  
  34. #define SPARC_UNKNOWN    0
  35. #define SPARC_V8        8
  36. #define SPARC_V9        9
  37.  
  38. #define MAX_CODE_SIZE    16
  39. struct sparc_code_struct {
  40.     int                            version;
  41.     uint32                        code[MAX_CODE_SIZE];
  42.     struct sparc_code_struct *    next;
  43. };
  44. typedef struct sparc_code_struct sparc_code_struct;
  45.  
  46. static sparc_code_struct *current_test_code;
  47.  
  48. static sparc_code_struct unknown_sparc_code =
  49. {
  50.     SPARC_UNKNOWN,
  51.     {
  52.         0x81C3E008,        /*    retl                    */
  53.         0x01000000        /*    nop                        */
  54.     }
  55. };
  56.  
  57. static sparc_code_struct sparc_v9_code =
  58. {
  59.     SPARC_V9,
  60.     {
  61.         0x81C3E008,        /*    retl                    */
  62.         0x81702007        /*    popc    7, %g0            */
  63.     }
  64. };
  65.  
  66. static sparc_code_struct sparc_v8_code =
  67. {
  68.     SPARC_V8,
  69.     {
  70.         0x90102002,        /*    mov        2, %o0            */
  71.         0x81C3E008,        /*    retl                    */
  72.         0x90520008        /*    umul    %o0, %o0, %o0    */
  73.     }
  74. };
  75.  
  76. static void test_sparc_code(int unused_int)
  77. {
  78.     sparc_code_struct *tested_code = current_test_code;
  79.     
  80.     if (current_test_code == NULL)
  81.         exit(SPARC_UNKNOWN);
  82.     
  83.     signal(SIGILL, test_sparc_code);
  84.     current_test_code = current_test_code->next;
  85.     (void) ((sparc_code_func)(tested_code->code))();
  86.     exit(tested_code->version);
  87. }
  88.  
  89. int main(void)
  90. {
  91.     sparc_v9_code.next = &sparc_v8_code;
  92.     sparc_v8_code.next = &unknown_sparc_code;
  93.     unknown_sparc_code.next = NULL;
  94.     
  95.     signal(SIGILL, test_sparc_code);
  96.     current_test_code = &sparc_v9_code;
  97.     raise(SIGILL);
  98.     
  99.     return 0;
  100. }
  101. EOF
  102.  
  103. $CC -o $PROG $SOURCE
  104. if [ $? -ne 0 ]; then
  105.     echo "Error: could not compile the test program"
  106.     exit 1
  107. fi
  108.  
  109. fi
  110.  
  111. $PROG
  112. case $? in
  113.     0) echo "unknown SPARC architecture";;
  114.     8) echo "SPARC_V8";;
  115.     9) echo "SPARC_V9";;
  116. esac
  117.  
  118. rm -f $PROG
  119. rm -f $SOURCE
  120.  
  121. exit 0
  122.