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);
------------------------------------------------------------------------------