Added "-p" to make parent directories as needed.
[AROS.git] / arch / arm-all / processor / getcpuinfo.c
blob5a17a598e2cca54520515c784e751d254885a21a
1 /*
2 Copyright © 2013, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: GetCPUInfo() - Provides information about installed CPUs
6 Lang: english
7 */
9 #define DEBUG 0
10 #include <aros/debug.h>
12 #include <aros/libcall.h>
13 #include <resources/processor.h>
14 #include <proto/utility.h>
16 #include "processor_intern.h"
17 #include "processor_arch_intern.h"
19 static void ProcessFeaturesTag(struct ARMProcessorInformation * info, struct TagItem * tag);
21 #include <proto/processor.h>
23 /* See rom/processor/getcpuinfo.c for documentation */
25 AROS_LH1(void, GetCPUInfo,
26 AROS_LHA(struct TagItem *, tagList, A0),
27 struct ProcessorBase *, ProcessorBase, 1, Processor)
29 AROS_LIBFUNC_INIT
31 struct TagItem * passedTag = NULL;
32 struct ARMProcessorInformation *processor = NULL;
33 struct ARMProcessorInformation **sysprocs = ProcessorBase->Private1;
34 ULONG selectedprocessor = 0;
36 D(bug("[processor.ARM] :%s()\n", __PRETTY_FUNCTION__));
38 /* If no processor is specified, query the BP */
39 selectedprocessor = (ULONG)GetTagData(GCIT_SelectedProcessor, 0, tagList);
41 /* If selectedprocessor not in line with number of processors, report on
42 first available processor */
43 if (selectedprocessor >= ProcessorBase->cpucount)
44 selectedprocessor = 0;
46 processor = sysprocs[selectedprocessor];
48 /* Go over each passed tag and fill appropriate data */
49 while ((passedTag = NextTagItem(&tagList)) != NULL)
51 if ((passedTag->ti_Tag > GCIT_FeaturesBase) &&
52 (passedTag->ti_Tag <= GCIT_FeaturesLast))
54 ProcessFeaturesTag(processor, passedTag);
56 else
58 switch(passedTag->ti_Tag)
60 case(GCIT_NumberOfProcessors):
61 *((ULONG *)passedTag->ti_Data) = ProcessorBase->cpucount;
62 break;
63 case(GCIT_ModelString):
64 *((CONST_STRPTR *)passedTag->ti_Data) = processor->BrandString;
65 break;
66 case(GCIT_Family):
67 *((ULONG *)passedTag->ti_Data) = processor->Family;
68 break;
69 case(GCIT_VectorUnit):
70 *((ULONG *)passedTag->ti_Data) = processor->VectorUnit;
71 break;
72 case(GCIT_L1CacheSize):
73 *((ULONG *)passedTag->ti_Data) =
74 (processor->L1DataCacheSize + processor->L1InstructionCacheSize);
75 break;
76 case(GCIT_L1DataCacheSize):
77 *((ULONG *)passedTag->ti_Data) = processor->L1DataCacheSize;
78 break;
79 case(GCIT_L1InstructionCacheSize):
80 *((ULONG *)passedTag->ti_Data) = processor->L1InstructionCacheSize;
81 break;
82 case(GCIT_L2CacheSize):
83 *((ULONG *)passedTag->ti_Data) = processor->L2CacheSize;
84 break;
85 case(GCIT_CacheLineSize):
86 *((ULONG *)passedTag->ti_Data) = processor->CacheLineSize;
87 break;
88 case(GCIT_Architecture):
89 *((ULONG *)passedTag->ti_Data) = PROCESSORARCH_ARM;
90 break;
91 case(GCIT_Endianness):
92 if (processor->Features1 & FEATF_BIGEND)
93 *((ULONG *)passedTag->ti_Data) = ENDIANNESS_BE;
94 else
95 *((ULONG *)passedTag->ti_Data) = ENDIANNESS_LE;
96 break;
97 case(GCIT_ProcessorSpeed):
98 *((UQUAD *)passedTag->ti_Data) = GetCurrentProcessorFrequency(processor);
99 break;
100 case(GCIT_ProcessorLoad):
101 *((UBYTE *)passedTag->ti_Data) = 0; /* TODO: IMPLEMENT */
102 break;
103 case GCIT_Vendor:
104 *((ULONG *)passedTag->ti_Data) = processor->Vendor;
105 break;
110 AROS_LIBFUNC_EXIT
111 } /* GetCPUInfo() */
113 static void ProcessFeaturesTag(struct ARMProcessorInformation * info, struct TagItem * tag)
115 D(bug("[processor.ARM] :%s()\n", __PRETTY_FUNCTION__));
117 switch(tag->ti_Tag)
119 case(GCIT_SupportsVFP):
120 case(GCIT_SupportsFPU):
121 *((BOOL *)tag->ti_Data) = (BOOL)((info->Features1 & FEATF_FPU) >> FEATB_FPU); break;
122 case(GCIT_SupportsVFPv3):
123 *((BOOL *)tag->ti_Data) = (BOOL)((info->Features1 & FEATF_FPU_VFP3) >> FEATB_FPU_VFP3); break;
124 case(GCIT_SupportsVFPv3D16):
125 *((BOOL *)tag->ti_Data) = (BOOL)((info->Features1 & FEATF_FPU_VFP3_16) >> FEATB_FPU_VFP3_16); break;
126 case(GCIT_SupportsNeon):
127 *((BOOL *)tag->ti_Data) = (BOOL)((info->Features1 & FEATF_NEON) >> FEATB_NEON); break;
128 case(GCIT_SupportsVFPv4):
129 *((BOOL *)tag->ti_Data) = (BOOL)((info->Features1 & FEATF_FPU_VFP4) >> FEATB_FPU_VFP4); break;
130 case(GCIT_SupportsSecurityExt):
131 *((BOOL *)tag->ti_Data) = (BOOL)((info->Features1 & FEATF_SECURE) >> FEATB_SECURE); break;
132 case(GCIT_SupportsBranchPred):
133 *((BOOL *)tag->ti_Data) = (BOOL)((info->Features1 & FEATF_BRANCHP) >> FEATB_BRANCHP); break;
134 case(GCIT_SupportsThumbEE):
135 *((BOOL *)tag->ti_Data) = (BOOL)((info->Features1 & FEATF_THUMBEX) >> FEATB_THUMBEX); break;
136 default:
137 *((BOOL *)tag->ti_Data) = FALSE; break;