1/*
2 * Copyright 2004-2005, Axel D��rfler, axeld@pinc-software.de. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * calculate_cpu_conversion_factor() was written by Travis Geiselbrecht and
6 * licensed under the NewOS license.
7 */
8
9
10#include "cpu.h"
11#include "rom_calls.h"
12
13#include <OS.h>
14#include <boot/platform.h>
15#include <boot/stdio.h>
16#include <boot/kernel_args.h>
17#include <boot/stage2.h>
18#include <arch/cpu.h>
19#include <arch_kernel.h>
20#include <arch_platform.h>
21#include <arch_system_info.h>
22
23#include <string.h>
24
25
26//#define TRACE_CPU
27#ifdef TRACE_CPU
28#	define TRACE(x) dprintf x
29#else
30#	define TRACE(x) ;
31#endif
32
33#warning M68K: add set_vbr()
34
35
36static status_t
37check_cpu_features()
38{
39	uint16 flags = SysBase->AttnFlags;
40	int cpu = 0;
41	int fpu = 0;
42
43	// check fpu flags first, since they are also set for 040
44
45	if ((flags & AFF_68881) != 0)
46			fpu = 68881;
47	if ((flags & AFF_68882) != 0)
48			fpu = 68882;
49
50	//if ((flags & AFF_68010) != 0)
51	//	return B_ERROR;
52	//if ((flags & AFF_68020) != 0)
53	//	return B_ERROR;
54	if ((flags & AFF_68030) != 0)
55			cpu = 68030;
56	if ((flags & AFF_68040) != 0)
57			cpu = fpu = 68040;
58	//if ((flags & AFF_FPU40) != 0)
59	//		;
60
61	//panic("cpu %d fpu %d flags 0x%04x", cpu, fpu, flags);
62	cpu = fpu = 68040; //XXX
63	if (!cpu || !fpu)
64		return B_ERROR;
65
66	gKernelArgs.arch_args.cpu_type = cpu;
67	gKernelArgs.arch_args.mmu_type = cpu;
68	gKernelArgs.arch_args.fpu_type = fpu;
69
70	//	if ((flags & AFF_68060) != 0) true
71	gKernelArgs.arch_args.has_lpstop = false;
72
73	gKernelArgs.arch_args.platform = M68K_PLATFORM_AMIGA;
74	gKernelArgs.arch_args.machine = 0; //XXX
75
76	return B_OK;
77}
78
79#warning M68K: move and implement system_time()
80static bigtime_t gSystemTimeCounter = 0; //HACK
81extern "C" bigtime_t
82system_time(void)
83{
84	return gSystemTimeCounter++;
85}
86
87
88//	#pragma mark -
89
90
91extern "C" void
92spin(bigtime_t microseconds)
93{
94	bigtime_t time = system_time();
95	while ((system_time() - time) < microseconds)
96		asm volatile ("nop;");
97}
98
99
100extern "C" void
101cpu_init()
102{
103	if (check_cpu_features() != B_OK)
104		panic("You need a 68030 or higher in order to boot!\n");
105
106	gKernelArgs.num_cpus = 1;
107		// this will eventually be corrected later on
108		// ...or not!
109}
110
111