Subject: Re: Have 4.4BSD a.out "hello, world": where now?
To: Jonathan Stone <jonathan@DSG.Stanford.EDU>
From: Ted Lemon <mellon@ipd.wellsfargo.com>
List: port-pmax
Date: 09/01/1994 09:43:18
Here are my changes for loading 4.4bsd a.out.   They're ugly (at least
the machdep.c part is), but they work.   I think breaking out the
functionality in exec_aout.c is a good idea in any case.

			       _MelloN_

diff -rc2 src-new/sys/arch/pmax/pmax/machdep.c src-updated/sys/arch/pmax/pmax/machdep.c
*** src-new/sys/arch/pmax/pmax/machdep.c	Mon Aug 29 17:19:24 1994
--- src-updated/sys/arch/pmax/pmax/machdep.c	Fri Jan  6 00:37:38 1995
***************
*** 2136,2140 ****
  	struct exec_package *epp;
  {
! 	return ENOEXEC;
  }
  
--- 2136,2173 ----
  	struct exec_package *epp;
  {
! #define OMAGIC  0407            /* old impure format */
! #define NMAGIC  0410            /* read-only text */
! #define ZMAGIC  0413            /* demand load format */
! 
!   struct aouthdr {
! #if BYTE_ORDER == BIG_ENDIAN
!     u_short a_mid;          /* machine ID */
!     u_short a_magic;        /* magic number */
! #else
!     u_short a_magic;        /* magic number */
!     u_short a_mid;          /* machine ID */
! #endif
!  
!     u_long  a_text;         /* text segment size */
!     u_long  a_data;         /* initialized data size */
!     u_long  a_bss;          /* uninitialized data size */
!     u_long  a_syms;         /* symbol table size */
!     u_long  a_entry;        /* entry point */
!     u_long  a_trsize;       /* text relocation size */
!     u_long  a_drsize;       /* data relocation size */
!   } *hdr = (struct aouthdr *)epp -> ep_hdr;
! 
!   /* Only handle paged files (laziness) */
!   if (hdr -> a_magic != ZMAGIC)
!     return ENOEXEC;
! 
!   epp -> ep_taddr = 0x1000;
!   epp -> ep_entry = hdr -> a_entry;
!   epp -> ep_tsize = hdr -> a_text;
!   epp -> ep_daddr = epp -> ep_taddr + hdr -> a_text;
!   epp -> ep_dsize = hdr -> a_data + hdr -> a_bss;
! 
!   return exec_aout_map_zmagic (p, epp, hdr -> a_text,
! 			       hdr -> a_data, hdr -> a_bss); 
  }
  
diff -rc2 src-new/sys/kern/exec_aout.c src-updated/sys/kern/exec_aout.c
*** src-new/sys/kern/exec_aout.c	Mon Aug 29 15:55:58 1994
--- src-updated/sys/kern/exec_aout.c	Fri Jan  6 00:37:52 1995
***************
*** 115,118 ****
--- 115,129 ----
  	epp->ep_entry = execp->a_entry;
  
+ 	return exec_aout_map_zmagic (p, epp, execp -> a_text,
+ 				     execp -> a_data, execp -> a_bss);
+ }
+ 
+ exec_aout_map_zmagic (p, epp, text, data, bss)
+      struct proc *p;
+      struct exec_package *epp;
+      u_long text;
+      u_long data;
+      u_long bss;
+ {
  	/*
  	 * check if vnode is in open for writing, because we want to
***************
*** 120,125 ****
  	 * reasons
  	 */
! 	if ((execp->a_text != 0 || execp->a_data != 0) &&
! 	    epp->ep_vp->v_writecount != 0) {
  #ifdef DIAGNOSTIC
  		if (epp->ep_vp->v_flag & VTEXT)
--- 131,135 ----
  	 * reasons
  	 */
! 	if ((text != 0 || data != 0) && epp->ep_vp->v_writecount != 0) {
  #ifdef DIAGNOSTIC
  		if (epp->ep_vp->v_flag & VTEXT)
***************
*** 131,145 ****
  
  	/* set up command for text segment */
! 	NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_pagedvn, execp->a_text,
  	    epp->ep_taddr, epp->ep_vp, 0, VM_PROT_READ|VM_PROT_EXECUTE);
  
  	/* set up command for data segment */
! 	NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_pagedvn, execp->a_data,
! 	    epp->ep_daddr, epp->ep_vp, execp->a_text,
  	    VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE);
  
  	/* set up command for bss segment */
! 	NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, execp->a_bss,
! 	    epp->ep_daddr + execp->a_data, NULLVP, 0,
  	    VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE);
  
--- 141,155 ----
  
  	/* set up command for text segment */
! 	NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_pagedvn, text,
  	    epp->ep_taddr, epp->ep_vp, 0, VM_PROT_READ|VM_PROT_EXECUTE);
  
  	/* set up command for data segment */
! 	NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_pagedvn, data,
! 	    epp->ep_daddr, epp->ep_vp, text,
  	    VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE);
  
  	/* set up command for bss segment */
! 	NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, bss,
! 	    epp->ep_daddr + data, NULLVP, 0,
  	    VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE);
  

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