2 Copyright © 2013, The AROS Development Team. All rights reserved.
5 Desc: GetCPUInfo() - Provides information about installed CPUs
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 /*****************************************************************************
24 #include <proto/processor.h>
26 AROS_LH1(void, GetCPUInfo
,
29 AROS_LHA(struct TagItem
*, tagList
, A0
),
32 struct ProcessorBase
*, ProcessorBase
, 1, Processor
)
52 ******************************************************************************/
56 struct TagItem
* passedTag
= NULL
;
57 struct ARMProcessorInformation
*processor
= NULL
;
58 struct ARMProcessorInformation
**sysprocs
= ProcessorBase
->Private1
;
59 ULONG selectedprocessor
= 0;
61 D(bug("[processor.ARM] :%s()\n", __PRETTY_FUNCTION__
));
63 /* If processor was not selected, fall back to legacy mode and report on
64 first available processor */
65 selectedprocessor
= (ULONG
)GetTagData(GCIT_SelectedProcessor
, 0, tagList
);
67 /* If selectedprocessor not in line with number of processors, report on
68 first available processor */
69 if (selectedprocessor
>= ProcessorBase
->cpucount
)
70 selectedprocessor
= 0;
72 processor
= sysprocs
[selectedprocessor
];
74 /* Go over each passed tag and fill appropriate data */
75 while ((passedTag
= NextTagItem(&tagList
)) != NULL
)
77 if ((passedTag
->ti_Tag
> GCIT_FeaturesBase
) &&
78 (passedTag
->ti_Tag
<= GCIT_FeaturesLast
))
80 ProcessFeaturesTag(processor
, passedTag
);
84 switch(passedTag
->ti_Tag
)
86 case(GCIT_NumberOfProcessors
):
87 *((ULONG
*)passedTag
->ti_Data
) = ProcessorBase
->cpucount
;
89 case(GCIT_ModelString
):
90 *((CONST_STRPTR
*)passedTag
->ti_Data
) = processor
->BrandString
;
93 *((ULONG
*)passedTag
->ti_Data
) = processor
->Family
;
95 case(GCIT_VectorUnit
):
96 *((ULONG
*)passedTag
->ti_Data
) = processor
->VectorUnit
;
98 case(GCIT_L1CacheSize
):
99 *((ULONG
*)passedTag
->ti_Data
) =
100 (processor
->L1DataCacheSize
+ processor
->L1InstructionCacheSize
);
102 case(GCIT_L1DataCacheSize
):
103 *((ULONG
*)passedTag
->ti_Data
) = processor
->L1DataCacheSize
;
105 case(GCIT_L1InstructionCacheSize
):
106 *((ULONG
*)passedTag
->ti_Data
) = processor
->L1InstructionCacheSize
;
108 case(GCIT_L2CacheSize
):
109 *((ULONG
*)passedTag
->ti_Data
) = processor
->L2CacheSize
;
111 case(GCIT_CacheLineSize
):
112 *((ULONG
*)passedTag
->ti_Data
) = processor
->CacheLineSize
;
114 case(GCIT_Architecture
):
115 *((ULONG
*)passedTag
->ti_Data
) = PROCESSORARCH_ARM
;
117 case(GCIT_Endianness
):
118 if (processor
->Features1
& FEATF_BIGEND
)
119 *((ULONG
*)passedTag
->ti_Data
) = ENDIANNESS_BE
;
121 *((ULONG
*)passedTag
->ti_Data
) = ENDIANNESS_LE
;
123 case(GCIT_ProcessorSpeed
):
124 *((UQUAD
*)passedTag
->ti_Data
) = GetCurrentProcessorFrequency(processor
);
126 case(GCIT_ProcessorLoad
):
127 *((UBYTE
*)passedTag
->ti_Data
) = 0; /* TODO: IMPLEMENT */
130 *((ULONG
*)passedTag
->ti_Data
) = processor
->Vendor
;
139 static void ProcessFeaturesTag(struct ARMProcessorInformation
* info
, struct TagItem
* tag
)
141 D(bug("[processor.ARM] :%s()\n", __PRETTY_FUNCTION__
));
145 case(GCIT_SupportsVFP
):
146 case(GCIT_SupportsFPU
):
147 *((BOOL
*)tag
->ti_Data
) = (BOOL
)((info
->Features1
& FEATF_FPU
) >> FEATB_FPU
); break;
148 case(GCIT_SupportsVFPv3
):
149 *((BOOL
*)tag
->ti_Data
) = (BOOL
)((info
->Features1
& FEATF_FPU_VFP3
) >> FEATB_FPU_VFP3
); break;
150 case(GCIT_SupportsVFPv3D16
):
151 *((BOOL
*)tag
->ti_Data
) = (BOOL
)((info
->Features1
& FEATF_FPU_VFP3_16
) >> FEATB_FPU_VFP3_16
); break;
152 case(GCIT_SupportsNeon
):
153 *((BOOL
*)tag
->ti_Data
) = (BOOL
)((info
->Features1
& FEATF_NEON
) >> FEATB_NEON
); break;
154 case(GCIT_SupportsVFPv4
):
155 *((BOOL
*)tag
->ti_Data
) = (BOOL
)((info
->Features1
& FEATF_FPU_VFP4
) >> FEATB_FPU_VFP4
); break;
156 case(GCIT_SupportsSecurityExt
):
157 *((BOOL
*)tag
->ti_Data
) = (BOOL
)((info
->Features1
& FEATF_SECURE
) >> FEATB_SECURE
); break;
158 case(GCIT_SupportsBranchPred
):
159 *((BOOL
*)tag
->ti_Data
) = (BOOL
)((info
->Features1
& FEATF_BRANCHP
) >> FEATB_BRANCHP
); break;
160 case(GCIT_SupportsThumbEE
):
161 *((BOOL
*)tag
->ti_Data
) = (BOOL
)((info
->Features1
& FEATF_THUMBEX
) >> FEATB_THUMBEX
); break;
163 *((BOOL
*)tag
->ti_Data
) = FALSE
; break;