C   122

arm-fpu

Guest on 30th May 2022 02:05:33 AM

  1. /*
  2. $ gcc arm-fpu.c
  3. $ ./a.out
  4. machdep.fpu_present=1
  5. machdep.fpu_id=0x410120b5
  6. machdep.neon_present=0
  7. FPU model=VFP11
  8.  
  9. Raspberry Pi 1
  10. */
  11.  
  12. #include <sys/types.h>
  13. #include <sys/sysctl.h>
  14. #include <arm/vfpreg.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17.  
  18. int
  19. main(int argc, char **argv)
  20. {
  21.         int fpu_present;
  22.         uint32_t fpu_id;
  23.         int neon_present;
  24.         const char *model = NULL;
  25.         size_t len;
  26.  
  27.         len = sizeof(fpu_present);
  28.         if (sysctlbyname("machdep.fpu_present", &fpu_present, &len, NULL, 0) < 0)
  29.                 abort();
  30.  
  31.         printf("machdep.fpu_present=%d\n", fpu_present);
  32.         if (fpu_present == 0)
  33.                 return 0;
  34.  
  35.         len = sizeof(fpu_id);
  36.         if (sysctlbyname("machdep.fpu_id", &fpu_id, &len, NULL, 0) < 0)
  37.                 abort();
  38.  
  39.         printf("machdep.fpu_id=%#x\n", fpu_id);
  40.  
  41.         len = sizeof(neon_present);
  42.         if (sysctlbyname("machdep.neon_present", &neon_present, &len, NULL, 0) < 0)
  43.                 abort();
  44.  
  45.         printf("machdep.neon_present=%d\n", neon_present);
  46.  
  47.         switch (fpu_id & ~ VFP_FPSID_REV_MSK) {
  48.         case FPU_VFP10_ARM10E:
  49.                 model = "VFP10 R1";
  50.                 break;
  51.         case FPU_VFP11_ARM11:
  52.                 model = "VFP11";
  53.                 break;
  54.         case FPU_VFP_MV88SV58XX:
  55.                 model = "VFP3";
  56.                 break;
  57.         case FPU_VFP_CORTEXA5:
  58.         case FPU_VFP_CORTEXA7:
  59.         case FPU_VFP_CORTEXA8:
  60.         case FPU_VFP_CORTEXA9:
  61. #ifdef FPU_VFP_CORTEXA12
  62.         case FPU_VFP_CORTEXA12:
  63. #endif
  64.         case FPU_VFP_CORTEXA15:
  65.         case FPU_VFP_CORTEXA15_QEMU:
  66. #ifdef FPU_VFP_CORTEXA17
  67.         case FPU_VFP_CORTEXA17:
  68. #endif
  69.         case FPU_VFP_CORTEXA53:
  70.         case FPU_VFP_CORTEXA57:
  71.                 if (!neon_present) {
  72.                         model = "VFP 4.0+";
  73.                 } else {
  74.                         model = "NEON MPE (VFP 3.0+)";
  75.                 }
  76.                 break;
  77.         default:
  78.                 model = "unrecognized VFP version";
  79.         }
  80.  
  81.         printf("FPU model=%s\n", model);
  82.  
  83.         return 0;
  84. }

Raw Paste


Login or Register to edit or fork this paste. It's free.