Subject: Re: why kvm_mkdb is screwed up
To: None <port-i386@NetBSD.ORG>
From: Gordon W. Ross <gwr@mc.com>
List: port-i386
Date: 01/09/1997 14:36:55
[ Important fix send to current-users by mistake. -gwr ]

> Date: Thu, 09 Jan 1997 14:16:11 -0500
> From: "John F. Woods" <jfw@jfwhome.funhouse.com>

> OK, I've looked at kvm_mkdb, and I think I understand why it's failing.
> 
> I was going to launch into a long rant about the inadequacies of a.out
> format causing this, but that's not actually true.  (Not, of course,
> that a.out isn't inadequate.)
> 
> Because the MID_I386 ZMAGIC format puts the first page of the text section
> in the first page of the executable file, the text section's first useful
> address is offset by 0x20 from its actual start.  What this means for the
> kernel image is that the symbol _kernel_start equals 0xf8100020 on the 386.
> (Other architectures' mileage may vary, but I'll bet some of them are subject
> to this same problem.)

It sounds to me like the i386 is getting the value of kernel_text wrong.
That value SHOULD come out to whatever you gave the linker, as shown in:
 arch/i386/conf/Makefile.i386
 LINKFLAGS= -z -Ttext F8100000 -e start

In other words, the exec header is really PART OF the text segment.
If the boot loader did not load it, then it would not be.

> I would suggest changing nlist_aout.c from
>  kerntextoff = get_kerntext(name);
> to
>  kerntextoff = get_kerntext(name) & ~(N_PAGSIZ(ebuf) - 1);

The change should be in arch/i386/i386/locore.s:

*** locore.s.~1~ Mon Dec 30 15:20:00 1996
--- locore.s Thu Jan  9 14:30:24 1997
***************
*** 191,199 ****
  #define RELOC(x) ((x) - KERNBASE)
  
   .text
!  .globl _C_LABEL(kernel_text)
   .globl start
- _C_LABEL(kernel_text):
  start: movw $0x1234,0x472   # warm boot
  
   /*
--- 191,200 ----
  #define RELOC(x) ((x) - KERNBASE)
  
   .text
!  .globl _kernel_text
!  .set _kernel_text,KERNTEXTOFF
! 
   .globl start
  start: movw $0x1234,0x472   # warm boot
  
   /*