1. Eliminate unused esym global from locore, our boot code never supported
that and when it does it will be done differently.
2. The kernel now does a frame setup on entry so it ``looks'' like a
real function call. This will be needed by future boot code and
debuggers.
3. Clean up stack offsets to all be in decimal and use %ebp when copying
parameters in from the boot code.
4. Implement version 1 of the uniform boot code passing mechanism with
support for kernelname passing and nfs_diskless structure passing.
5. Document the 3 different ways the kernel is called depending on what code
is calling it.
This commit is contained in:
@@ -34,7 +34,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)genassym.c 5.11 (Berkeley) 5/10/91
|
||||
* $Id: genassym.c,v 1.13 1994/10/02 04:45:33 davidg Exp $
|
||||
* $Id: genassym.c,v 1.14 1994/10/02 07:19:43 rgrimes Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
@@ -55,6 +55,7 @@
|
||||
#include <machine/trap.h>
|
||||
#include <machine/psl.h>
|
||||
#include <machine/reg.h>
|
||||
#include <machine/bootinfo.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <vm/vm.h>
|
||||
#include <sys/user.h>
|
||||
@@ -76,6 +77,7 @@ main()
|
||||
struct pcb *pcb = (struct pcb *)0;
|
||||
struct trapframe *tf = (struct trapframe *)0;
|
||||
struct sigframe *sigf = (struct sigframe *)0;
|
||||
struct bootinfo_t *bootinfo = (struct bootinfo_t *)0;
|
||||
register unsigned i;
|
||||
|
||||
printf("#define\tUDOT_SZ %d\n", sizeof(struct user));
|
||||
@@ -199,6 +201,10 @@ main()
|
||||
printf("#define\tENOENT %d\n", ENOENT);
|
||||
printf("#define\tEFAULT %d\n", EFAULT);
|
||||
printf("#define\tENAMETOOLONG %d\n", ENAMETOOLONG);
|
||||
printf("#define\tMAXPATHLEN %d\n", MAXPATHLEN);
|
||||
printf("#define\tBOOTINFO_VERSION %d\n", &bootinfo->version);
|
||||
printf("#define\tBOOTINFO_KERNELNAME %d\n", &bootinfo->kernelname);
|
||||
printf("#define\tBOOTINFO_NFS_DISKLESS %d\n", &bootinfo->nfs_diskless);
|
||||
printf("#define\tNFSDISKLESS_SIZE %d\n", sizeof(struct nfs_diskless));
|
||||
exit(0);
|
||||
}
|
||||
|
||||
+49
-24
@@ -34,7 +34,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)locore.s 7.3 (Berkeley) 5/13/91
|
||||
* $Id: locore.s,v 1.31 1994/10/02 01:32:50 rgrimes Exp $
|
||||
* $Id: locore.s,v 1.32 1994/10/02 18:57:15 davidg Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -101,8 +101,6 @@
|
||||
* Globals
|
||||
*/
|
||||
.data
|
||||
.globl _esym
|
||||
_esym: .long 0 /* ptr to end of syms */
|
||||
|
||||
.globl _boothowto,_bootdev,_curpcb
|
||||
|
||||
@@ -164,6 +162,10 @@ NON_GPROF_ENTRY(btext)
|
||||
.org 0x500 /* space for BIOS variables */
|
||||
|
||||
1:
|
||||
/* Set up a real frame, some day we will be doing returns */
|
||||
pushl %ebp
|
||||
movl %esp, %ebp
|
||||
|
||||
/* Don't trust what the BIOS gives for eflags. */
|
||||
pushl $PSL_MBO
|
||||
popfl
|
||||
@@ -192,7 +194,8 @@ NON_GPROF_ENTRY(btext)
|
||||
* [return address != 0, and can be returned to]
|
||||
*
|
||||
* There may seem to be a lot of wasted arguments in here, but
|
||||
* that is so the newer boot code can still load very old kernels.
|
||||
* that is so the newer boot code can still load very old kernels
|
||||
* and old boot code can load new kernels.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -200,7 +203,7 @@ NON_GPROF_ENTRY(btext)
|
||||
* did an lret to get here. The frame on the stack has a return
|
||||
* address of 0.
|
||||
*/
|
||||
cmpl $0,0x00(%esp)
|
||||
cmpl $0,4(%ebp)
|
||||
je 2f /* olddiskboot: */
|
||||
|
||||
/*
|
||||
@@ -209,7 +212,7 @@ NON_GPROF_ENTRY(btext)
|
||||
* be detected by looking at the 5th argument, it if is 0 we
|
||||
* we are being booted by the new unifrom boot code.
|
||||
*/
|
||||
cmpl $0,0x14(%esp)
|
||||
cmpl $0,24(%ebp)
|
||||
je 1f /* newboot: */
|
||||
|
||||
/*
|
||||
@@ -220,34 +223,56 @@ NON_GPROF_ENTRY(btext)
|
||||
hlt
|
||||
|
||||
/*
|
||||
* We have been loaded by the new uniform boot code, this kernel
|
||||
* is not yet ready to handle that, so for now fix up the stack
|
||||
* like a real subroutine and then return to the boot loader with
|
||||
* a status of 1 to indicate this error.
|
||||
* We have been loaded by the new uniform boot code.
|
||||
* Lets check the bootinfo version, and if we do not understand
|
||||
* it we return to the loader with a status of 1 to indicate this error
|
||||
*/
|
||||
1: /* newboot: */
|
||||
pushl %ebp
|
||||
movl %esp,%ebp
|
||||
movl $1,%eax
|
||||
leave
|
||||
ret
|
||||
movl 28(%ebp),%ebx /* &bootinfo.version */
|
||||
movl BOOTINFO_VERSION(%ebx),%eax
|
||||
cmpl $1,%eax /* We only understand version 1 */
|
||||
je 1f
|
||||
movl $1,%eax /* Return status */
|
||||
leave
|
||||
ret
|
||||
|
||||
1:
|
||||
/*
|
||||
* If we have a kernelname copy it in
|
||||
*/
|
||||
movl BOOTINFO_KERNELNAME(%ebx),%esi
|
||||
cmpl $0,%esi
|
||||
je 1f /* No kernelname */
|
||||
lea _kernelname-KERNBASE,%edi
|
||||
movl $MAXPATHLEN,%ecx /* Brute force!!! */
|
||||
cld
|
||||
rep
|
||||
movsb
|
||||
|
||||
1:
|
||||
/*
|
||||
* If we have a nfs_diskless structure copy it in
|
||||
*/
|
||||
movl BOOTINFO_NFS_DISKLESS(%ebx),%esi
|
||||
cmpl $0,%esi
|
||||
je 2f
|
||||
lea _nfs_diskless-KERNBASE,%edi
|
||||
movl $NFSDISKLESS_SIZE,%ecx
|
||||
cld
|
||||
rep
|
||||
movsb
|
||||
|
||||
/*
|
||||
* The old style disk boot.
|
||||
* (*btext)(howto, bootdev, cyloffset, esym);
|
||||
* cyloffset is no longer copied
|
||||
* XXX Is esym still used for the end of the kernel some place???
|
||||
* for now make sure we keep a correct value in it until I
|
||||
* can deterimine that.
|
||||
* Note that the newer boot code just falls into here to pick
|
||||
* up howto and bootdev, cyloffset and esym are no longer used
|
||||
*/
|
||||
2: /* olddiskboot: */
|
||||
movl 4(%esp),%eax
|
||||
movl 8(%ebp),%eax
|
||||
movl %eax,_boothowto-KERNBASE
|
||||
movl 8(%esp),%eax
|
||||
movl 12(%ebp),%eax
|
||||
movl %eax,_bootdev-KERNBASE
|
||||
movl 16(%esp),%eax
|
||||
addl $KERNBASE,%eax
|
||||
movl %eax,_esym-KERNBASE
|
||||
|
||||
/* get the BIOS video mode pointer */
|
||||
movl $0x4a8, %ecx
|
||||
|
||||
+49
-24
@@ -34,7 +34,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)locore.s 7.3 (Berkeley) 5/13/91
|
||||
* $Id: locore.s,v 1.31 1994/10/02 01:32:50 rgrimes Exp $
|
||||
* $Id: locore.s,v 1.32 1994/10/02 18:57:15 davidg Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -101,8 +101,6 @@
|
||||
* Globals
|
||||
*/
|
||||
.data
|
||||
.globl _esym
|
||||
_esym: .long 0 /* ptr to end of syms */
|
||||
|
||||
.globl _boothowto,_bootdev,_curpcb
|
||||
|
||||
@@ -164,6 +162,10 @@ NON_GPROF_ENTRY(btext)
|
||||
.org 0x500 /* space for BIOS variables */
|
||||
|
||||
1:
|
||||
/* Set up a real frame, some day we will be doing returns */
|
||||
pushl %ebp
|
||||
movl %esp, %ebp
|
||||
|
||||
/* Don't trust what the BIOS gives for eflags. */
|
||||
pushl $PSL_MBO
|
||||
popfl
|
||||
@@ -192,7 +194,8 @@ NON_GPROF_ENTRY(btext)
|
||||
* [return address != 0, and can be returned to]
|
||||
*
|
||||
* There may seem to be a lot of wasted arguments in here, but
|
||||
* that is so the newer boot code can still load very old kernels.
|
||||
* that is so the newer boot code can still load very old kernels
|
||||
* and old boot code can load new kernels.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -200,7 +203,7 @@ NON_GPROF_ENTRY(btext)
|
||||
* did an lret to get here. The frame on the stack has a return
|
||||
* address of 0.
|
||||
*/
|
||||
cmpl $0,0x00(%esp)
|
||||
cmpl $0,4(%ebp)
|
||||
je 2f /* olddiskboot: */
|
||||
|
||||
/*
|
||||
@@ -209,7 +212,7 @@ NON_GPROF_ENTRY(btext)
|
||||
* be detected by looking at the 5th argument, it if is 0 we
|
||||
* we are being booted by the new unifrom boot code.
|
||||
*/
|
||||
cmpl $0,0x14(%esp)
|
||||
cmpl $0,24(%ebp)
|
||||
je 1f /* newboot: */
|
||||
|
||||
/*
|
||||
@@ -220,34 +223,56 @@ NON_GPROF_ENTRY(btext)
|
||||
hlt
|
||||
|
||||
/*
|
||||
* We have been loaded by the new uniform boot code, this kernel
|
||||
* is not yet ready to handle that, so for now fix up the stack
|
||||
* like a real subroutine and then return to the boot loader with
|
||||
* a status of 1 to indicate this error.
|
||||
* We have been loaded by the new uniform boot code.
|
||||
* Lets check the bootinfo version, and if we do not understand
|
||||
* it we return to the loader with a status of 1 to indicate this error
|
||||
*/
|
||||
1: /* newboot: */
|
||||
pushl %ebp
|
||||
movl %esp,%ebp
|
||||
movl $1,%eax
|
||||
leave
|
||||
ret
|
||||
movl 28(%ebp),%ebx /* &bootinfo.version */
|
||||
movl BOOTINFO_VERSION(%ebx),%eax
|
||||
cmpl $1,%eax /* We only understand version 1 */
|
||||
je 1f
|
||||
movl $1,%eax /* Return status */
|
||||
leave
|
||||
ret
|
||||
|
||||
1:
|
||||
/*
|
||||
* If we have a kernelname copy it in
|
||||
*/
|
||||
movl BOOTINFO_KERNELNAME(%ebx),%esi
|
||||
cmpl $0,%esi
|
||||
je 1f /* No kernelname */
|
||||
lea _kernelname-KERNBASE,%edi
|
||||
movl $MAXPATHLEN,%ecx /* Brute force!!! */
|
||||
cld
|
||||
rep
|
||||
movsb
|
||||
|
||||
1:
|
||||
/*
|
||||
* If we have a nfs_diskless structure copy it in
|
||||
*/
|
||||
movl BOOTINFO_NFS_DISKLESS(%ebx),%esi
|
||||
cmpl $0,%esi
|
||||
je 2f
|
||||
lea _nfs_diskless-KERNBASE,%edi
|
||||
movl $NFSDISKLESS_SIZE,%ecx
|
||||
cld
|
||||
rep
|
||||
movsb
|
||||
|
||||
/*
|
||||
* The old style disk boot.
|
||||
* (*btext)(howto, bootdev, cyloffset, esym);
|
||||
* cyloffset is no longer copied
|
||||
* XXX Is esym still used for the end of the kernel some place???
|
||||
* for now make sure we keep a correct value in it until I
|
||||
* can deterimine that.
|
||||
* Note that the newer boot code just falls into here to pick
|
||||
* up howto and bootdev, cyloffset and esym are no longer used
|
||||
*/
|
||||
2: /* olddiskboot: */
|
||||
movl 4(%esp),%eax
|
||||
movl 8(%ebp),%eax
|
||||
movl %eax,_boothowto-KERNBASE
|
||||
movl 8(%esp),%eax
|
||||
movl 12(%ebp),%eax
|
||||
movl %eax,_bootdev-KERNBASE
|
||||
movl 16(%esp),%eax
|
||||
addl $KERNBASE,%eax
|
||||
movl %eax,_esym-KERNBASE
|
||||
|
||||
/* get the BIOS video mode pointer */
|
||||
movl $0x4a8, %ecx
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)genassym.c 5.11 (Berkeley) 5/10/91
|
||||
* $Id: genassym.c,v 1.13 1994/10/02 04:45:33 davidg Exp $
|
||||
* $Id: genassym.c,v 1.14 1994/10/02 07:19:43 rgrimes Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
@@ -55,6 +55,7 @@
|
||||
#include <machine/trap.h>
|
||||
#include <machine/psl.h>
|
||||
#include <machine/reg.h>
|
||||
#include <machine/bootinfo.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <vm/vm.h>
|
||||
#include <sys/user.h>
|
||||
@@ -76,6 +77,7 @@ main()
|
||||
struct pcb *pcb = (struct pcb *)0;
|
||||
struct trapframe *tf = (struct trapframe *)0;
|
||||
struct sigframe *sigf = (struct sigframe *)0;
|
||||
struct bootinfo_t *bootinfo = (struct bootinfo_t *)0;
|
||||
register unsigned i;
|
||||
|
||||
printf("#define\tUDOT_SZ %d\n", sizeof(struct user));
|
||||
@@ -199,6 +201,10 @@ main()
|
||||
printf("#define\tENOENT %d\n", ENOENT);
|
||||
printf("#define\tEFAULT %d\n", EFAULT);
|
||||
printf("#define\tENAMETOOLONG %d\n", ENAMETOOLONG);
|
||||
printf("#define\tMAXPATHLEN %d\n", MAXPATHLEN);
|
||||
printf("#define\tBOOTINFO_VERSION %d\n", &bootinfo->version);
|
||||
printf("#define\tBOOTINFO_KERNELNAME %d\n", &bootinfo->kernelname);
|
||||
printf("#define\tBOOTINFO_NFS_DISKLESS %d\n", &bootinfo->nfs_diskless);
|
||||
printf("#define\tNFSDISKLESS_SIZE %d\n", sizeof(struct nfs_diskless));
|
||||
exit(0);
|
||||
}
|
||||
|
||||
+49
-24
@@ -34,7 +34,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)locore.s 7.3 (Berkeley) 5/13/91
|
||||
* $Id: locore.s,v 1.31 1994/10/02 01:32:50 rgrimes Exp $
|
||||
* $Id: locore.s,v 1.32 1994/10/02 18:57:15 davidg Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -101,8 +101,6 @@
|
||||
* Globals
|
||||
*/
|
||||
.data
|
||||
.globl _esym
|
||||
_esym: .long 0 /* ptr to end of syms */
|
||||
|
||||
.globl _boothowto,_bootdev,_curpcb
|
||||
|
||||
@@ -164,6 +162,10 @@ NON_GPROF_ENTRY(btext)
|
||||
.org 0x500 /* space for BIOS variables */
|
||||
|
||||
1:
|
||||
/* Set up a real frame, some day we will be doing returns */
|
||||
pushl %ebp
|
||||
movl %esp, %ebp
|
||||
|
||||
/* Don't trust what the BIOS gives for eflags. */
|
||||
pushl $PSL_MBO
|
||||
popfl
|
||||
@@ -192,7 +194,8 @@ NON_GPROF_ENTRY(btext)
|
||||
* [return address != 0, and can be returned to]
|
||||
*
|
||||
* There may seem to be a lot of wasted arguments in here, but
|
||||
* that is so the newer boot code can still load very old kernels.
|
||||
* that is so the newer boot code can still load very old kernels
|
||||
* and old boot code can load new kernels.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -200,7 +203,7 @@ NON_GPROF_ENTRY(btext)
|
||||
* did an lret to get here. The frame on the stack has a return
|
||||
* address of 0.
|
||||
*/
|
||||
cmpl $0,0x00(%esp)
|
||||
cmpl $0,4(%ebp)
|
||||
je 2f /* olddiskboot: */
|
||||
|
||||
/*
|
||||
@@ -209,7 +212,7 @@ NON_GPROF_ENTRY(btext)
|
||||
* be detected by looking at the 5th argument, it if is 0 we
|
||||
* we are being booted by the new unifrom boot code.
|
||||
*/
|
||||
cmpl $0,0x14(%esp)
|
||||
cmpl $0,24(%ebp)
|
||||
je 1f /* newboot: */
|
||||
|
||||
/*
|
||||
@@ -220,34 +223,56 @@ NON_GPROF_ENTRY(btext)
|
||||
hlt
|
||||
|
||||
/*
|
||||
* We have been loaded by the new uniform boot code, this kernel
|
||||
* is not yet ready to handle that, so for now fix up the stack
|
||||
* like a real subroutine and then return to the boot loader with
|
||||
* a status of 1 to indicate this error.
|
||||
* We have been loaded by the new uniform boot code.
|
||||
* Lets check the bootinfo version, and if we do not understand
|
||||
* it we return to the loader with a status of 1 to indicate this error
|
||||
*/
|
||||
1: /* newboot: */
|
||||
pushl %ebp
|
||||
movl %esp,%ebp
|
||||
movl $1,%eax
|
||||
leave
|
||||
ret
|
||||
movl 28(%ebp),%ebx /* &bootinfo.version */
|
||||
movl BOOTINFO_VERSION(%ebx),%eax
|
||||
cmpl $1,%eax /* We only understand version 1 */
|
||||
je 1f
|
||||
movl $1,%eax /* Return status */
|
||||
leave
|
||||
ret
|
||||
|
||||
1:
|
||||
/*
|
||||
* If we have a kernelname copy it in
|
||||
*/
|
||||
movl BOOTINFO_KERNELNAME(%ebx),%esi
|
||||
cmpl $0,%esi
|
||||
je 1f /* No kernelname */
|
||||
lea _kernelname-KERNBASE,%edi
|
||||
movl $MAXPATHLEN,%ecx /* Brute force!!! */
|
||||
cld
|
||||
rep
|
||||
movsb
|
||||
|
||||
1:
|
||||
/*
|
||||
* If we have a nfs_diskless structure copy it in
|
||||
*/
|
||||
movl BOOTINFO_NFS_DISKLESS(%ebx),%esi
|
||||
cmpl $0,%esi
|
||||
je 2f
|
||||
lea _nfs_diskless-KERNBASE,%edi
|
||||
movl $NFSDISKLESS_SIZE,%ecx
|
||||
cld
|
||||
rep
|
||||
movsb
|
||||
|
||||
/*
|
||||
* The old style disk boot.
|
||||
* (*btext)(howto, bootdev, cyloffset, esym);
|
||||
* cyloffset is no longer copied
|
||||
* XXX Is esym still used for the end of the kernel some place???
|
||||
* for now make sure we keep a correct value in it until I
|
||||
* can deterimine that.
|
||||
* Note that the newer boot code just falls into here to pick
|
||||
* up howto and bootdev, cyloffset and esym are no longer used
|
||||
*/
|
||||
2: /* olddiskboot: */
|
||||
movl 4(%esp),%eax
|
||||
movl 8(%ebp),%eax
|
||||
movl %eax,_boothowto-KERNBASE
|
||||
movl 8(%esp),%eax
|
||||
movl 12(%ebp),%eax
|
||||
movl %eax,_bootdev-KERNBASE
|
||||
movl 16(%esp),%eax
|
||||
addl $KERNBASE,%eax
|
||||
movl %eax,_esym-KERNBASE
|
||||
|
||||
/* get the BIOS video mode pointer */
|
||||
movl $0x4a8, %ecx
|
||||
|
||||
Reference in New Issue
Block a user