1/*
2 * Copyright 2008-2010, Fran��ois Revol, revol@free.fr. All rights reserved.
3 * Distributed under the terms of the MIT License.
4*/
5
6
7#include "cpu.h"
8#include "toscalls.h"
9
10#include <OS.h>
11#include <boot/platform.h>
12#include <boot/stdio.h>
13#include <boot/kernel_args.h>
14#include <boot/stage2.h>
15#include <arch/cpu.h>
16#include <arch_kernel.h>
17#include <arch_platform.h>
18#include <arch_system_info.h>
19
20#include <string.h>
21
22
23//#define TRACE_CPU
24#ifdef TRACE_CPU
25#	define TRACE(x) dprintf x
26#else
27#	define TRACE(x) ;
28#endif
29
30#warning M68K: add set_vbr()
31
32
33static status_t
34check_cpu_features()
35{
36#warning M68K: TODO: probe ourselves, we shouldnt trust the TOS!
37
38	const tos_cookie *c;
39	uint16 cpu_type, fpu_type, fpu_emul;
40	uint16 machine_type;
41	int fpu = 0;
42
43	c = tos_find_cookie('_CPU');
44	if (!c) {
45		panic("can't get a cookie (_CPU)!");
46		return EINVAL;
47	}
48	cpu_type = (uint16) c->ivalue;
49
50	dump_tos_cookies();
51
52#warning M68K: check for 020 + mmu
53	if (cpu_type < 30/*20*/)
54		return EINVAL;
55
56#warning M68K: check cpu type passed to kern args
57	gKernelArgs.arch_args.cpu_type = 68000 + cpu_type;
58	gKernelArgs.arch_args.mmu_type = 68000 + cpu_type;
59	gKernelArgs.arch_args.has_lpstop = (cpu_type >= 60)?true:false;
60
61	c = tos_find_cookie('_FPU');
62	if (!c) {
63		panic("can't get a cookie (_FPU)!");
64		return EINVAL;
65	}
66	fpu_type = (uint16)(c->ivalue >> 16);
67	fpu_emul = (uint16)(c->ivalue);
68
69	// http://toshyp.atari.org/003007.htm#Cookie_2C_20_FPU
70	if (fpu_type & 0x10)
71		fpu = 68060;
72	else if (fpu_type & 0x8)
73		fpu = 68040;
74	else if ((fpu_type & 0x6) == 0x6)
75		fpu = 68882;
76	else if ((fpu_type & 0x6) == 0x4)
77		fpu = 68881;
78	else if ((fpu_type & 0x6) == 0x2)
79		fpu = 68881; // not certain
80	else if (fpu_type & 0x4) {
81		panic("bad fpu");
82		return EINVAL;
83	}
84	gKernelArgs.arch_args.fpu_type = fpu;
85
86	gKernelArgs.arch_args.platform = M68K_PLATFORM_ATARI;
87
88	c = tos_find_cookie('_MCH');
89	if (!c) {
90		panic("can't get a cookie (_MCH)!");
91		return EINVAL;
92	}
93	machine_type = (uint16)(c->ivalue >> 16);
94	gKernelArgs.arch_args.machine = machine_type;
95
96	return B_OK;
97}
98
99#warning M68K: move and implement system_time()
100static bigtime_t gSystemTimeCounter = 0; //HACK
101extern "C" bigtime_t
102system_time(void)
103{
104	// _hz_200
105	//return (*TOSVAR_hz_200) * 1000000LL / 200;
106	return gSystemTimeCounter++;
107}
108
109
110//	#pragma mark -
111
112
113extern "C" void
114spin(bigtime_t microseconds)
115{
116	bigtime_t time = system_time();
117	while ((system_time() - time) < microseconds)
118		asm volatile ("nop;");
119}
120
121
122extern "C" void
123cpu_init()
124{
125	if (check_cpu_features() != B_OK)
126		panic("You need a 68020 or higher in order to boot!\n");
127
128	gKernelArgs.num_cpus = 1;
129		// this will eventually be corrected later on
130		// ...or not!
131}
132
133
134extern "C" void
135platform_load_ucode(BootVolume& volume)
136{
137}
138
139