Subject: Re: 1.6.1: KASSERT in custom kernel triggered
To: Amiga-NETBSD <port-amiga@netbsd.org>
From: Gunther Nikl <gni@gecko.de>
List: port-amiga
Date: 06/27/2003 10:53:48
--+HP7ph2BbKc20aGI
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
On Tue, Jun 24, 2003 at 01:42:28PM +0200, Gunther Nikl wrote:
> On Mon, Jun 23, 2003 at 03:02:56PM +0200, Gunther Nikl wrote:
> > I upgraded my system to 1.6.1 and built a custom kernel as I did with
> > previous NetBSD versions before. However, this time my custom kernel doesn't
> > work, it triggers a KASSERT in amiga/pmap.c:pmap_kenter_pa line 1399 (v1.100):
> >
> > KASSERT(!pmap_pte_v(pte));
> >
> > AFAICT, this check is also present in the generic kernel but that kernel
> > works. What might be wrong with my custom kernel?
>
> My custom kernel works when using the bootblocks or loadbsd. I didn't test
> that before I wrote my initial mail. I used a custom loader which upto 1.6
> worked flawlessly. Surprisingly, the custom loader can boot GENERIC 1.6.1.
I could nail the problem down. Apparently the arguments to pmap_bootstrap
(start_c_pstart and start_c_fphystart) were zero... I don't know why that
happend because eg. the boot_* flags were set properly. Moving the setup
of these two variables before the possible kernel copy and MMU enable
preparations solved it. A patch for this is included. I added another
small modification. start_c() has now another parameter - loadbase. Since
locore.s did already computed it, there is no need todo that in start_c()
again.
Gunther
--+HP7ph2BbKc20aGI
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="dif.amiga"
diff -up old/locore.s new/locore.s
--- old/locore.s Sun Jan 12 00:03:43 2003
+++ new/locore.s Thu Jun 26 19:47:04 2003
@@ -788,6 +788,7 @@ ASENTRY_NOPROFILE(start)
| save the passed parameters. "prepass" them on the stack for
| later catch by start_c()
+ movl %a5,%sp@- | pass loadbase
movl %d6,%sp@- | pass boot partition offset
movl %a2,%sp@- | pass sync inhibit flags
movl %d3,%sp@- | pass AGA mode
@@ -921,7 +922,7 @@ Lstartnot040:
/* let the C function initialize everything */
RELOC(start_c, %a0)
jbsr %a0@
- addl #28,%sp
+ lea %sp@(4*9),%sp
#ifdef DRACO
RELOC(machineid,%a0)
diff -up old/amiga_init.c new/amiga_init.c
--- old/amiga_init.c Sun Jan 12 00:03:12 2003
+++ new/amiga_init.c Thu Jun 26 20:01:16 2003
@@ -127,7 +127,7 @@ int ncfdev;
u_long scsi_nosync;
int shift_nosync;
-void start_c(int, u_int, u_int, u_int, char *, u_int, u_long, u_long);
+void start_c(int, u_int, u_int, u_int, char *, u_int, u_long, u_long, u_int);
void rollcolor(int);
static int kernel_image_magic_size(void);
static void kernel_image_magic_copy(u_char *);
@@ -195,13 +195,14 @@ alloc_z2mem(amount)
int kernel_copyback = 1;
void
-start_c(id, fphystart, fphysize, cphysize, esym_addr, flags, inh_sync, boot_part)
+start_c(id, fphystart, fphysize, cphysize, esym_addr, flags, inh_sync, boot_part, loadbase)
int id;
u_int fphystart, fphysize, cphysize;
char *esym_addr;
u_int flags;
u_long inh_sync;
u_long boot_part;
+ u_int loadbase;
{
extern char end[];
extern u_int protorp[2];
@@ -213,7 +214,6 @@ start_c(id, fphystart, fphysize, cphysiz
register pt_entry_t pg_proto, *pg;
u_int end_loaded, ncd, i;
struct boot_memlist *ml;
- u_int loadbase = 0; /* XXXXXXXXXXXXXXXXXXXXXXXXXXXX */
#ifdef DEBUG_KERNEL_START
/* XXX this only is valid if Altais is in slot 0 */
@@ -221,9 +221,6 @@ start_c(id, fphystart, fphysize, cphysiz
volatile u_int8_t *altaiscol = (u_int8_t *)0x200003c9;
#endif
- if ((u_int)&loadbase > cphysize)
- loadbase = fphystart;
-
#ifdef DEBUG_KERNEL_START
if ((id>>24)==0x7D) {
*altaiscolpt = 0;
@@ -714,6 +711,10 @@ start_c(id, fphystart, fphysize, cphysiz
*/
RELOC(protorp[1], u_int) = RELOC(Sysseg_pa, u_int); /* + segtable address */
+ /* Set these for pmap_bootstrap() in start_c_finish() */
+ RELOC(start_c_fphystart, u_int) = fphystart;
+ RELOC(start_c_pstart, u_int) = pstart;
+
/*
* copy over the kernel (and all now initialized variables)
* to fastram. DONT use bcopy(), this beast is much larger
@@ -777,9 +778,6 @@ start_c(id, fphystart, fphysize, cphysiz
(RELOC(protorp[0], u_int)) = 0x80000202;
asm volatile ("pmove %0@,%%srp":: "a" (&RELOC(protorp, u_int)));
}
-
- RELOC(start_c_fphystart, u_int) = fphystart;
- RELOC(start_c_pstart, u_int) = pstart;
}
void
--+HP7ph2BbKc20aGI--