From 19cb19924c08843852fd0c02dec9574ff2edfc92 Mon Sep 17 00:00:00 2001 From: twilen Date: Fri, 16 Mar 2012 19:30:36 +0000 Subject: [PATCH] Support non-MEMF_KICK fast ram boards (Blizzard A1200 accelerators) in arosbootstrap mode. Requires also updated arosbootstrap version. git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@44409 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- arch/m68k-amiga/boot/mmakefile.src | 4 +-- arch/m68k-amiga/boot/start.c | 50 +++++++++++++++++++++++++++++++------- arch/m68k-amiga/diag/diag.c | 8 ++++++ 3 files changed, 51 insertions(+), 11 deletions(-) diff --git a/arch/m68k-amiga/boot/mmakefile.src b/arch/m68k-amiga/boot/mmakefile.src index d4ca3bb605..53be713050 100644 --- a/arch/m68k-amiga/boot/mmakefile.src +++ b/arch/m68k-amiga/boot/mmakefile.src @@ -231,7 +231,7 @@ KDEVS := KHNDLRS := KHIDDS := KRSRCS := kernel -KHOOKS := +KHOOKS := diag KOBJS_local := $(addprefix $(KOBJSDIR)/,$(addsuffix _library.ko ,$(KLIBS))) \ $(addprefix $(KOBJSDIR)/,$(addsuffix _device.ko ,$(KDEVS))) \ @@ -262,7 +262,7 @@ KHNDLRS := cdrom con afs amberram KHIDDS := hiddclass graphics keyboard mouse amigakbd amigamouse amigavideo uaegfx KRSRCS := battclock processor lddemon dosboot cia potgo disk \ misc shell shellcommands workbook wbtag cardres FileSystem -KHOOKS := alert diag romboot +KHOOKS := alert romboot KOBJS_any := \ $(addprefix $(KOBJSDIR)/,$(addsuffix _library.ko ,$(KLIBS) )) \ diff --git a/arch/m68k-amiga/boot/start.c b/arch/m68k-amiga/boot/start.c index 599d14ea8f..71a27a7362 100644 --- a/arch/m68k-amiga/boot/start.c +++ b/arch/m68k-amiga/boot/start.c @@ -279,11 +279,34 @@ static void protectKick(struct MemHeader *mh, struct MemList *ml, ULONG *mask) return; } +void InitKickMemDiag(void) +{ + struct MemList *ml = PrivExecBase(SysBase)->PlatformData.ep_KickMemPtr; + DEBUGPUTS(("KickMem allocation phase 2/2\n")); + while (ml) { + int i; + for (i = 0; i < ml->ml_NumEntries; i++) { + APTR start = ml->ml_ME[i].me_Addr; + ULONG len = ml->ml_ME[i].me_Length; + + DEBUGPUTHEX(("Addr", (IPTR)start)); + DEBUGPUTHEX(("Len", len)); + + /* Simply attempt to allocate everything again */ + if (InternalAllocAbs(start, len, SysBase)) + DEBUGPUTS(("-> Allocated\n")); + + } + ml = (struct MemList*)ml->ml_Node.ln_Succ; + } +} + static BOOL InitKickMem(ULONG *mask, struct ExecBase *SysBase) { int ndx = 0; struct MemList *ml = SysBase->KickMemPtr; ULONG protectKickBits = *mask; + BOOL ok = TRUE; DEBUGPUTHEX(("KickMemPtr", (IPTR)ml)); @@ -297,8 +320,15 @@ static BOOL InitKickMem(ULONG *mask, struct ExecBase *SysBase) if (ndx < 32 && !(protectKickBits & (1 << ndx))) continue; - DEBUGPUTHEX((" Addr", (IPTR)start)); - DEBUGPUTHEX((" Len", len)); + DEBUGPUTHEX(("Addr", (IPTR)start)); + DEBUGPUTHEX(("Len", len)); + + if (TypeOfMem(start) == 0) { + /* Do not stop if memory is not in memory list yet */ + DEBUGPUTS(("-> unavailable\n")); + ok = FALSE; + continue; + } /* Use the non-mungwalling AllocAbs */ if (!InternalAllocAbs(start, len, SysBase)) @@ -311,7 +341,7 @@ static BOOL InitKickMem(ULONG *mask, struct ExecBase *SysBase) *mask = protectKickBits; - return TRUE; + return ok; } #if 0 // debug stuff, do not remove static ULONG SumKickDataX(struct ExecBase *sb) @@ -769,16 +799,18 @@ void exec_boot(ULONG *membanks, ULONG *cpupcr) /* Before we allocate anything else, we need to * lock down the entries in KickMemPtr * - * If we get a single failure, don't run any - * of the KickTags. + * If we get a single failure, try again in diag module */ if (SysBase->KickCheckSum) { if (SysBase->KickCheckSum == (APTR)SumKickData()) { + DEBUGPUTS(("KickMem allocation phase 1/2\n")); if (!InitKickMem(&KickMemMask, SysBase)) { - DEBUGPUTS(("[KickMem] KickMem failed an allocation. Ignoring KickTags\n")); - SysBase->KickTagPtr = NULL; - } - } else { + /* We'll try again after diag rom module */ + DEBUGPUTS(("KickMem failed an allocation.\n")); + } else { + DEBUGPUTS(("All KickMem nodes allocated succesfully.\n")); + } + } else { DEBUGPUTS(("[KickMem] Checksum mismatch\n")); SysBase->KickTagPtr = NULL; } diff --git a/arch/m68k-amiga/diag/diag.c b/arch/m68k-amiga/diag/diag.c index cd81b27c2b..0640d568cc 100644 --- a/arch/m68k-amiga/diag/diag.c +++ b/arch/m68k-amiga/diag/diag.c @@ -166,6 +166,9 @@ static void callroms(struct ExpansionBase *ExpansionBase) D(bug("callroms done\n")); } + +void InitKickMemDiag(void); + static AROS_UFH3 (APTR, Init, AROS_UFHA(struct Library *, lh, D0), AROS_UFHA(BPTR, segList, A0), @@ -184,6 +187,11 @@ static AROS_UFH3 (APTR, Init, D(debugRAM()); + /* ArosBootStrap mode? Check for kick modules again if some of our kick modules + * are located in diag initialized ram (Blizzard A1200 accelerator boards) + */ + InitKickMemDiag(); + AROS_USERFUNC_EXIT return NULL; -- 2.11.4.GIT