revert between 56095 -> 55830 in arch
[AROS.git] / arch / m68k-amiga / c / SetPatch.c
blob780c08da17d65161ca6ba09aac9607e7c17e147e
2 /*
3 * Copyright (C) 2012-2018, The AROS Development Team. All rights reserved.
5 * Licensed under the AROS PUBLIC LICENSE (APL) Version 1.1
6 */
8 #include <exec/types.h>
9 #include <exec/execbase.h>
10 #include <graphics/gfxbase.h>
11 #include <proto/exec.h>
12 #include <proto/dos.h>
13 #include <proto/setpatch.h>
14 #include <proto/kernel.h>
15 #include <proto/graphics.h>
17 #define SH_GLOBAL_DOSBASE 1
18 #define SH_GLOBAL_SYSBASE 1
20 #include <aros/shcommands.h>
22 const TEXT version[] = "$VER: SetPatch AROS-m68k 41.3 (" ADATE ")\n";
24 void Enable68060SuperScalar(void);
25 asm (
26 ".text\n"
27 ".global Enable68060SuperScalar\n"
28 ".func Enable68060SuperScalar\n"
29 "Enable68060SuperScalar:\n"
30 /* enable supercalar */
31 "dc.l 0x4e7a0808\n" // movec %pcr,%d0
32 "bset #0,%d0\n"
33 "dc.l 0x4e7b0808\n" // movec %d0,%pcr
34 /* enable code&data caches, store buffer and branch cache */
35 "dc.l 0x4e7a0002\n" // movec %cacr,%d0
36 "or.l #0xa0808000,%d0\n"
37 "dc.l 0x4e7b0002\n" // movec %d0,%cacr
38 "rte\n"
39 ".endfunc\n"
42 ULONG Check68030MMU(void);
43 asm (
44 ".text\n"
45 ".chip 68030\n"
46 ".global Check68030MMU\n"
47 ".func Check68030MMU\n"
48 "Check68030MMU:\n"
49 "subq.l #4,%sp\n"
50 "pmove %tc,(%sp)\n"
51 "move.l (%sp),%d0\n"
52 "addq.l #4,%sp\n"
53 "rte\n"
54 ".endfunc\n"
57 APTR getvbr(void);
58 asm (
59 ".text\n"
60 ".chip 68010\n"
61 ".global getvbr\n"
62 ".func getvbr\n"
63 "getvbr:\n"
64 "movec %vbr,%d0\n"
65 "rte\n"
66 ".endfunc\n"
69 static void setvbr(APTR vbr)
71 asm volatile (
72 ".chip 68010\n"
73 "move.l %0,%%d0\n"
74 "movem.l %%a5/%%a6,-(%%sp)\n"
75 "move.l 4.w,%%a6\n"
76 "lea 1f(%%pc),%%a5\n"
77 "jsr -0x1e(%%a6)\n"
78 "movem.l (%%sp)+,%%a5/%%a6\n"
79 "bra.s 0f\n"
80 "1:\n"
81 "movec %%d0,%%vbr\n"
82 "rte\n"
83 "0:\n"
84 : : "m" (vbr)
88 struct mmuportnode
90 struct Node node;
91 ULONG addr;
92 ULONG len;
93 ULONG flags;
96 #define PAGE_SIZE 4096
98 static void fastvbr(BOOL quiet)
100 APTR oldvbr, newvbr;
102 if (!(SysBase->AttnFlags & AFF_68010))
103 return;
104 Disable();
105 oldvbr = (APTR)Supervisor((ULONG_FUNC)getvbr);
106 Enable();
107 if (!oldvbr) {
108 newvbr = AllocMem(4 * 256, MEMF_FAST | MEMF_CLEAR);
109 if (!newvbr)
110 return;
111 CopyMemQuick(oldvbr, newvbr, 4 * 256);
112 Disable();
113 setvbr(newvbr);
114 Enable();
115 oldvbr = newvbr;
117 if (!quiet)
118 Printf("VBR moved to Fast RAM at %p\n", oldvbr);
121 static void p5stuff(BOOL quiet)
123 APTR KernelBase;
124 UBYTE *mmuport;
125 struct mmuportnode *node;
126 struct List *list;
128 mmuport = (UBYTE*)FindPort("BOOT-MMU-Port");
129 if (!mmuport)
130 return;
131 if (!quiet)
132 Printf("Phase 5 BOOT-MMU-Port found at %p\n", mmuport);
133 KernelBase = OpenResource("kernel.resource");
134 if (!KernelBase)
135 return;
136 list = (struct List*)(mmuport + 0x26);
137 ForeachNode(list, node) {
138 ULONG addr = node->addr, end;
139 ULONG len = node->len;
140 if (!quiet)
141 Printf("- %p %08lx %08lx\n", addr, len, node->flags);
142 end = addr + len;
143 addr &= ~(PAGE_SIZE - 1);
144 end += (PAGE_SIZE - 1);
145 end &= ~(PAGE_SIZE - 1);
146 Disable();
147 KrnSetProtection((void*)addr, end - addr, MAP_Readable | MAP_Writable | MAP_Executable | MAP_CacheInhibit);
148 Enable();
153 static void mmusetup(BOOL quiet)
155 // enable 68040+ data caches and 68060 superscalar mode
156 // copyback is also enabled if MMU setup was done by rom code
157 CacheClearU();
158 Disable();
159 if (SysBase->AttnFlags & AFF_68060) {
160 Supervisor((ULONG_FUNC)Enable68060SuperScalar);
161 } else if (SysBase->AttnFlags & AFF_68040) {
162 CacheControl(CACRF_EnableD, CACRF_EnableD);
163 } else if (SysBase->AttnFlags & AFF_68030) {
164 ULONG tc = Supervisor((ULONG_FUNC)Check68030MMU);
165 if (tc & (1 << 31)) { /* Only if MMU enabled */
166 CacheControl(CACRF_EnableD | CACRF_WriteAllocate, CACRF_EnableD | CACRF_WriteAllocate);
169 Enable();
172 AROS_SH5H(SetPatch, 41.4, "AROS SetPatch (m68k)",
173 AROS_SHAH(BOOL, Q=, QUIET, /S, FALSE, "Be quiet"),
174 AROS_SHAH(BOOL, NOCA=, NOCACHE, /S, FALSE, "Don't install cache patches"),
175 AROS_SHAH(BOOL, NOV=, NOVBRMOVE, /S, FALSE, "Don't move the VBR to MEMF_FAST"),
176 AROS_SHAH(BOOL, NOAGA=, NOAGA, /S, FALSE, "Don't enable AGA modes"),
177 AROS_SHAH(BOOL, DMMU=, DEBUGMMU, /S, FALSE, "MMU protect first page"))
179 AROS_SHCOMMAND_INIT
181 struct Library *SetPatchBase;
182 struct GfxBase *GfxBase;
184 /* NOTE: This is currently a 'am I running on AROS' test, but
185 * we should use SetPatch/AddPatch() one day
187 if ((SetPatchBase = OpenLibrary("setpatch.library", 41))) {
188 BOOL justinstalled680x0 = FALSE;
189 BOOL installed680x0 = FALSE;
190 BOOL x68040 = FALSE, x68060 = FALSE;
192 GfxBase = (struct GfxBase*)OpenLibrary("graphics.library", 0);
193 if (SysBase->AttnFlags & (AFF_68040 | AFF_68060)) {
194 BOOL ox68040 = FALSE, ox68060 = FALSE;
196 Forbid();
197 if (FindName(&SysBase->LibList, "68040.library"))
198 ox68040 = TRUE;
199 if (FindName(&SysBase->LibList, "68060.library"))
200 ox68060 = TRUE;
201 Permit();
202 CloseLibrary(OpenLibrary("680x0.library", 0));
203 Forbid();
204 if (FindName(&SysBase->LibList, "68040.library"))
205 x68040 = TRUE;
206 if (FindName(&SysBase->LibList, "68060.library"))
207 x68060 = TRUE;
208 Permit();
210 if ((!ox68040 && !ox68060) && (x68040 || x68060))
211 justinstalled680x0 = TRUE;
212 if (x68040 || x68060)
213 installed680x0 = TRUE;
216 if (!SHArg(NOVBRMOVE))
217 fastvbr(SHArg(QUIET));
219 if (!SHArg(NOCACHE)) {
220 if (justinstalled680x0)
221 p5stuff(SHArg(QUIET));
222 mmusetup(SHArg(QUIET));
223 } else {
224 CacheControl(0, CACRF_EnableD | CACRF_CopyBack | CACRF_DBE);
227 if (!SHArg(NOAGA))
228 SetChipRev(SETCHIPREV_BEST);
230 if (SHArg(DEBUGMMU)) {
231 /* Mark first page invalid, special handler only accepts ExecBase reads */
232 void *KernelBase = OpenResource("kernel.resource");
233 if (KernelBase) {
234 KrnSetProtection(0, PAGE_SIZE, 0);
238 if (SHArg(QUIET) == FALSE) {
239 ULONG flags;
240 if (installed680x0) {
241 Printf("%ld Support Code Loaded\n", x68060 ? 68060 : 68040);
242 } else if (SysBase->AttnFlags & (AFF_68040 | AFF_68060)) {
243 Printf("WARNING: %ld CPU without LIBS:680x0.library.\n", (SysBase->AttnFlags & AFF_68060) ? 68060 : 68040);
245 flags = CacheControl(0, 0);
246 if (flags & CACRF_EnableD)
247 Printf("Data Cache Enabled\n");
248 if (flags & CACRF_CopyBack)
249 Printf("CopyBack Enabled\n");
250 if ((GfxBase->ChipRevBits0 & SETCHIPREV_AA) == SETCHIPREV_AA)
251 Printf("Enabled Advanced Graphics Modes\n");
253 CloseLibrary((APTR)GfxBase);
254 CloseLibrary(SetPatchBase);
256 return (SetPatchBase != NULL) ? RETURN_OK : RETURN_FAIL;
258 AROS_SHCOMMAND_EXIT