2 Copyright © 2011-2017, The AROS Development Team. All rights reserved.
6 #include <exec/rawfmt.h>
7 #include <proto/exec.h>
9 #include <aros/symbolsets.h>
11 #include "processor_intern.h"
12 #include "processor_arch_intern.h"
14 static VOID
__sprintf(UBYTE
*buffer
, const UBYTE
*format
, ...)
18 va_start(args
, format
);
19 VNewRawDoFmt(format
, RAWFMTFUNC_STRING
, buffer
, args
);
23 static VOID
ReadProcessorInformation(struct M68KProcessorInformation
* info
)
26 * The inline assembler doesn't like the reference to the 68060 specific
27 * PCR register. So here we put the manually assembled code into ReadPCR[]
28 * and later we'll call it from Supervisor() to retrieve that PCR register
29 * contents. The assembled code is:
31 * movec PCR,d0 ; 4E7A0808
35 ULONG ReadPCR
[2] = { 0x4E7A0808, 0x4E730000 };
36 register ULONG pcr
asm("d0");
38 __sprintf(info
->ModelStringBuffer
, "%s", "68000");
39 info
->ModelString
= info
->ModelStringBuffer
;
41 info
->CPUModel
= CPUMODEL_68000
;
42 info
->FPUModel
= FPUMODEL_UNKNOWN
;
43 info
->L1InstructionCacheSize
= 0;
44 info
->L1DataCacheSize
= 0;
48 if (SysBase
->AttnFlags
& (AFF_68060
| AFF_68080
)) {
49 pcr
= Supervisor(ReadPCR
);
52 if (SysBase
->AttnFlags
& AFF_68080
)
54 info
->CPUModel
= CPUMODEL_68080
;
55 // info->FPUModel = FPUMODEL_UNKNOWN;
56 __sprintf(info
->ModelStringBuffer
, "%s", "Apollo Core 68080");
58 if (pcr
& 0x04400000) {
59 info
->L1InstructionCacheSize
= 16384;
60 info
->L1DataCacheSize
= 32768;
63 else if (SysBase
->AttnFlags
& AFF_68060
)
65 info
->CPUModel
= CPUMODEL_68060
;
66 if (SysBase
->AttnFlags
& AFF_FPU40
) {
67 info
->FPUModel
= FPUMODEL_INTERNAL
;
68 __sprintf(info
->ModelStringBuffer
, "%s", "68060");
70 if (SysBase
->AttnFlags
& AFB_PRIVATEB
)
72 __sprintf(info
->ModelStringBuffer
, "%s", "68LC060");
76 __sprintf(info
->ModelStringBuffer
, "%s", "68EC060");
79 info
->L1InstructionCacheSize
= 8192;
80 info
->L1DataCacheSize
= 8192;
82 else if (SysBase
->AttnFlags
& AFF_68040
)
84 info
->CPUModel
= CPUMODEL_68040
;
85 if (SysBase
->AttnFlags
& AFF_FPU40
) {
86 info
->FPUModel
= FPUMODEL_INTERNAL
;
87 __sprintf(info
->ModelStringBuffer
, "%s", "68040");
89 if (SysBase
->AttnFlags
& AFB_PRIVATEB
)
91 __sprintf(info
->ModelStringBuffer
, "%s", "68LC040");
95 __sprintf(info
->ModelStringBuffer
, "%s", "68EC040");
98 info
->L1InstructionCacheSize
= 4096;
99 info
->L1DataCacheSize
= 4096;
101 else if (SysBase
->AttnFlags
& AFF_68030
)
103 info
->CPUModel
= CPUMODEL_68030
;
104 if (SysBase
->AttnFlags
& AFB_PRIVATEB
)
106 __sprintf(info
->ModelStringBuffer
, "%s", "68030");
110 __sprintf(info
->ModelStringBuffer
, "%s", "68EC030");
112 info
->L1InstructionCacheSize
= 256;
113 info
->L1DataCacheSize
= 256;
115 else if (SysBase
->AttnFlags
& AFF_68020
)
117 info
->CPUModel
= CPUMODEL_68020
;
118 if (SysBase
->AttnFlags
& AFF_ADDR32
)
120 __sprintf(info
->ModelStringBuffer
, "%s", "68020");
124 __sprintf(info
->ModelStringBuffer
, "%s", "68EC020");
126 info
->L1InstructionCacheSize
= 256;
128 else if (SysBase
->AttnFlags
& AFF_68010
)
130 info
->CPUModel
= CPUMODEL_68010
;
131 __sprintf(info
->ModelStringBuffer
, "%s", "68010");
134 if (info
->FPUModel
!= FPUMODEL_INTERNAL
) {
135 UBYTE
*s
= info
->ModelStringBuffer
;
138 if (SysBase
->AttnFlags
& AFF_68882
)
140 info
->FPUModel
= FPUMODEL_68882
;
141 __sprintf(s
, "%s", "/68882");
143 else if (SysBase
->AttnFlags
& AFF_68881
)
145 info
->FPUModel
= FPUMODEL_68881
;
146 __sprintf(s
, "%s", "/68881");
149 info
->FPUModel
= FPUMODEL_NONE
;
151 info
->CPUFrequency
= 0; /* TODO: Implement */
154 LONG
Processor_Init(struct ProcessorBase
* ProcessorBase
)
156 struct SystemProcessors
* sysprocs
=
157 AllocVec(sizeof(struct SystemProcessors
), MEMF_ANY
| MEMF_CLEAR
);
159 if (sysprocs
== NULL
)
162 ProcessorBase
->Private1
= sysprocs
;
164 ReadProcessorInformation(&sysprocs
->processor
);
169 ADD2INITLIB(Processor_Init
, 1);