From owner-FreeBSD-users-jp@jp.freebsd.org  Wed Feb 24 00:43:32 1999
Received: (from daemon@localhost)
	by jaz.jp.freebsd.org (8.9.2+3.1W/8.7.3) id AAA21108;
	Wed, 24 Feb 1999 00:43:32 +0900 (JST)
	(envelope-from owner-FreeBSD-users-jp@jp.FreeBSD.org)
Received: from mx.gld.mmtr.or.jp (yar.gld.mmtr.or.jp [210.228.160.26])
	by jaz.jp.freebsd.org (8.9.2+3.1W/8.7.3) with ESMTP id AAA21043
	for <FreeBSD-users-jp@jp.freebsd.org>; Wed, 24 Feb 1999 00:42:46 +0900 (JST)
	(envelope-from akisatoh@aile.hypercube.gld.mmtr.or.jp)
Received: from aile.hypercube.gld.mmtr.or.jp (kmkr3DS19.kng.mesh.ad.jp [210.147.36.65])
	by mx.gld.mmtr.or.jp (8.8.7/3.6Wbeta7) with ESMTP id AAA04279;
	Wed, 24 Feb 1999 00:41:58 +0900
Received: from localhost (localhost [127.0.0.1])
	by aile.hypercube.gld.mmtr.or.jp (8.8.5+2.7Wbeta5/3.6Wbeta3-nomx-ppp) with ESMTP id AAA00340;
	Wed, 24 Feb 1999 00:39:44 +0900 (JST)
Message-Id: <199902231539.AAA00340@aile.hypercube.gld.mmtr.or.jp>
From: =?ISO-2022-JP?B?GyRCOjRGIxsoQiAbJEI+NE1OGyhC?= <akisatoh@gld.mmtr.or.jp>
To: FreeBSD-users-jp@jp.freebsd.org
cc: akisatoh@gld.mmtr.or.jp
References: <199902200249.UAA01427@mosche.students.wisc.edu>
Mime-Version: 1.0 (generated by tm-edit 7.106)
Content-Type: text/plain; charset=ISO-2022-JP
Date: Wed, 24 Feb 1999 00:39:42 +0900
Reply-To: FreeBSD-users-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+981115
X-Sequence: FreeBSD-users-jp 39176
Subject: [FreeBSD-users-jp 39176] Re: Diskless & ELF kernel (FreeBSD(98)-current)
Errors-To: owner-FreeBSD-users-jp@jp.freebsd.org
Sender: owner-FreeBSD-users-jp@jp.freebsd.org
X-Originator: akisatoh@aile.hypercube.gld.mmtr.or.jp

$B!!$5$H$&!w$b$b$?$m$&$G$9!#(B

  netboot & elf kernel $B$NB3$-$G$9!#(B

  /boot/loader $BJU$j$N;EAH$_$,J,$+$C$F$$$J$$$N$G!"(Bfreebsd.current $B$G$N(B 
netboot $B$NOC$O$"$^$jJ,$+$i$J$+$C$?$N$G$9$,!"$H$j$"$($:8=>u$N(B 
nb8390.com $B$K(B ELF kernel $B%m!<%I5!G=$rIU2C$9$k%Q%C%A$r$D$/$j$^$7$?$N$G(B
$BE:IU$7$^$9!#!J$H$F$b1x$$$G$9$,!"F0$$$F$$$k$h$&$G$9!K(B

$B!!85$N(B netboot $B$N%3!<%I$,(B FreeBSD-2.2.8R $B$N(B /usr/src/sys/pc98/boot/netboot
$B$G$9$N$G!"(BPC/AT$B$K$OEv$?$i$J$$$+$b$7$l$^$;$s!#(B
----------------------------------------------------------------------
*** ../netboot.228R/netboot.h	Sat Jan 31 20:35:37 1998
--- netboot.h	Mon Feb 22 19:35:27 1999
***************
*** 9,14 ****
--- 9,15 ----
  #include <sys/types.h>
  #include <sys/reboot.h>
  #include <a.out.h>
+ #include <elf.h>
  #include <netdb.h>
  #include <sys/param.h>
  #include <sys/socket.h>
*** ../netboot.228R/main.c	Sat Jan 31 20:35:35 1998
--- main.c	Tue Feb 23 12:17:54 1999
***************
*** 300,354 ****
  		nfs_err(err);
  		longjmp(jmp_bootmenu,1);
  	}
- 	if (N_BADMAG(head)) {
- 		printf("Bad executable format!\n");
- 		longjmp(jmp_bootmenu, 1);
- 	}
- 	loadpoint = (char *)0x100000;
- 	offset = N_TXTOFF(head);
- 	printf("text=0x%X, ",head.a_text);
  #ifdef	PC98
  	set_twiddle_max(8);
  #endif
! 	nfsload(head.a_text);
! 	while (((int)loadpoint) & PAGE_MASK)
! 		*(loadpoint++) = 0;
! 
! 	printf("data=0x%X, ",head.a_data);
! 	nfsload(head.a_data);
! 
! 	printf("bss=0x%X, ",head.a_bss);
! 	while(head.a_bss--) *(loadpoint++) = 0;
! 
! 	while (((int)loadpoint) & PAGE_MASK)
! 		*(loadpoint++) = 0;
  
! 	bootinfo.bi_symtab = (int) loadpoint;
! 
! 	p = (char*)&head.a_syms;
! 	for (i=0;i<sizeof(head.a_syms);i++)
! 		*loadpoint++ = *p++;
! 
! 	printf("symbols=[+0x%x+0x%x", sizeof(head.a_syms), head.a_syms);
  	
! 	nfsload(head.a_syms);
! 	i = sizeof(int);
! 	p = loadpoint;
! 	nfsload(i);
! 	i = *(int*)p;
! 	printf("+0x%x]\n", i);
! 	i -= sizeof(int);
! 	nfsload(i);
! 	bootinfo.bi_esymtab = (int) loadpoint;
! 
! 	printf("entry=0x%X.\n",head.a_entry);
  
  		/* Jump to kernel */
  	bootinfo.bi_version = BOOTINFO_VERSION;
  	bootinfo.bi_kernelname = kernel;
  	bootinfo.bi_nfs_diskless = &nfsdiskless;
  	bootinfo.bi_size = sizeof bootinfo;
- 	kernelentry = (void *)(head.a_entry & 0x00FFFFFF);
  	(*kernelentry)(howto|RB_BOOTINFO,NODEV,0,0,0,&bootinfo,0,0,0);
  	printf("*** %s execute failure ***\n",kernel);
  }
--- 300,394 ----
  		nfs_err(err);
  		longjmp(jmp_bootmenu,1);
  	}
  #ifdef	PC98
  	set_twiddle_max(8);
  #endif
! 	if (!N_BADMAG(head)) {
! 		/* a.out format */
! 		loadpoint = (char *)0x100000;
! 		offset = N_TXTOFF(head);
! 		printf("text=0x%X, ",head.a_text);
! 		nfsload(head.a_text);
! 		while (((int)loadpoint) & PAGE_MASK)
! 			*(loadpoint++) = 0;
! 
! 		printf("data=0x%X, ",head.a_data);
! 		nfsload(head.a_data);
! 
! 		printf("bss=0x%X, ",head.a_bss);
! 		while(head.a_bss--) *(loadpoint++) = 0;
! 
! 		while (((int)loadpoint) & PAGE_MASK)
! 			*(loadpoint++) = 0;
! 
! 		bootinfo.bi_symtab = (int) loadpoint;
! 
! 		p = (char*)&head.a_syms;
! 		for (i=0;i<sizeof(head.a_syms);i++)
! 			*loadpoint++ = *p++;
  
! 		printf("symbols=[+0x%x+0x%x", sizeof(head.a_syms), head.a_syms);
  	
! 		nfsload(head.a_syms);
! 		i = sizeof(int);
! 		p = loadpoint;
! 		nfsload(i);
! 		i = *(int*)p;
! 		printf("+0x%x]\n", i);
! 		i -= sizeof(int);
! 		nfsload(i);
! 		bootinfo.bi_esymtab = (int) loadpoint;
! 
! 		printf("entry=0x%X.\n",head.a_entry);
! 		kernelentry = (void *)(head.a_entry & 0x00FFFFFF);
! 
! 	} else if (IS_ELF(*(Elf32_Ehdr *)&head)) {
! 		/* ELF format */
! 		Elf32_Ehdr elf_ehdr;
! 		Elf32_Phdr elf_phdr;
! 		int phnum, offs;
! 		if ((err = nfs_read(ARP_ROOTSERVER, root_nfs_port, &kernel_handle, 0,
! 			sizeof(Elf32_Ehdr), &elf_ehdr)) < 0) {
! 			printf("Unable to read %s: ",kernel);
! 			nfs_err(err);
! 			longjmp(jmp_bootmenu,1);
! 		}
! 		for(phnum = 0; phnum < elf_ehdr.e_phnum; phnum++) {
! 			printf("Program Header %d : ", phnum);
! 			offs = elf_ehdr.e_phoff + sizeof(Elf32_Phdr) * phnum;
! 			if ((err = nfs_read(ARP_ROOTSERVER, root_nfs_port, &kernel_handle, offs,
! 				sizeof(Elf32_Phdr), &elf_phdr)) < 0) {
! 				printf("Unable to read %s: ",kernel);
! 				nfs_err(err);
! 				longjmp(jmp_bootmenu,1);
! 			}
! 			printf("Type=%d\n", elf_phdr.p_type);
!         	        if (elf_phdr.p_type != PT_LOAD)
!                 	        continue;
! 			printf("flags =%s%s%s, ", 
! 				(elf_phdr.p_flags & PF_R) ? " Readable" : "",
! 				(elf_phdr.p_flags & PF_W) ? " Writable" : "",
! 				(elf_phdr.p_flags & PF_X) ? " Executable" : "");
! 	                printf("filesz=0x%X", elf_phdr.p_filesz);
! 			loadpoint = (char *)(elf_phdr.p_vaddr & 0x00FFFFFF);
! 			offset = elf_phdr.p_offset;
! 			nfsload(elf_phdr.p_filesz);
! 	                printf(", memsz=0x%X\n", elf_phdr.p_memsz);
! 			for(i = elf_phdr.p_memsz - elf_phdr.p_filesz; i > 0; i--)
! 				*loadpoint++ = 0x00;
! 	        }
! 		printf("entry=0x%X.\n", elf_ehdr.e_entry);
! 		kernelentry = (void *)(elf_ehdr.e_entry & 0x00FFFFFF);
! 	} else {
! 		printf("Bad executable format!\n");
! 		longjmp(jmp_bootmenu, 1);
! 	}
  
  		/* Jump to kernel */
  	bootinfo.bi_version = BOOTINFO_VERSION;
  	bootinfo.bi_kernelname = kernel;
  	bootinfo.bi_nfs_diskless = &nfsdiskless;
  	bootinfo.bi_size = sizeof bootinfo;
  	(*kernelentry)(howto|RB_BOOTINFO,NODEV,0,0,0,&bootinfo,0,0,0);
  	printf("*** %s execute failure ***\n",kernel);
  }

----------------------------------------------------------------------

