460 Lab Assignment #5.2

                      460 LAB Assignment #5.2
                          DUE: to be posted
1. OBJECTIVES:
   fork and exec in MTX

2. REQUIREMENTS:

   Implement the following system calls for the MTX system:

===========================================================================
(8).  pid = ufork()  : fork a child task with an identical Umode image;
                       parent returns child's pid, child returns 0.

(9).  r = exec(file) : change image to the specified (executable) file

As usual, return -1 if the syscall fails.      
===========================================================================

                    3. HELPS and SUGGESTIONS:

1. HOWTO ufork():

(1). Do the same as myfork() to create a child task in such a way that when the
     child runs (in Kmode), it RESUMES TO goUmode().
     
(2). Determine the child's segment as  ushort child_segment. 

     Set child's   PROC.uss = child_segment, and
                   PROC.usp = running->usp   (See below for WHY?)

     But DO NOT load any Umode image (file) to child's segment because it 
     will have the SAME Umode iamge of its parent (the running task). 
                       
(3). Use get_word()/put_word() to implement a 
               copy_image(child_segment)
     function, which copies the Umode image of running to child_segment.

     *********************** NOTE ******************************************
     In general, each task should have a Umode image size recorded in its proc
     structure. ufork() should allocate a child Umode image area of exactly 
     the same size, and copy_image() should only copy the exact amount form
     the parent to the child. So far, we have assumed that each task's Umode 
     image is a full segment (64 KB), so you may copy the entire 64KB segment.
     Later, with memory management, this CAN be changed to suit the Umode 
     image size of the task that's doing ufork().
     ***********************************************************************

     copy_image() implies that the Umode images of parent and child are
     IDENTICAL. So, their saved usp must also be the same value (each is an 
     offset relative to its own segment).
      
(4). While copy_image() is easy, the important part is how to fix the 
     child's ustack contents so that it will

            . return to Umode in its OWN SEGMENT, and
            . as if it had executed
                    pid = ufork();
              but with a return pid = 0 
              (Recall that the parent returns with the chid's pid) 

     That's the fun part!!!! Think about how to do these in ufork().
=============================================================================

2. HOWTO exec("filename");    

(1). In general:
     Locate the file "filename", verify it's eXecutable, read file header
     to determine the TOTAL memory needed, allocate a memory area for the 
     NEW Umode image, then load the EXECUTABLE part of the file into memory.

     ----------------------------------------------------------------------
      For this assignment: all executable files are generated with a 32-byte 
      header (because YOUR loader expects them to have headers), but you may 
      ignore the size requirement since each task has a fixed Umode image size
      of 64 KB.
     ----------------------------------------------------------------------

(2). After loading the new Umode image, fix the ustack contents to make the
     task execute from virtual address 0 when it returns to Umode. Refer to 
     the diagram again:

     (LOW)  uSP                                | by INT 80  |   HIGH
     ---------------------------------------------------------------------
           |uDS|uES| di| si| bp| dx| cx| bx| ax|uPC|uCS|flag| XXXXXX
     ---------------------------------------------------------------------
            -12 -11 -10  -9  -8  -7  -6  -5  -4  -3  -2  -1 | 0 

        (a). re-establish ustack to the very high end of the segment.
        (b). "pretend" it had done  INT 80  from (virtual address) 0: 
             (c). fill in uCS, uDS, uES in ustack
             (d). execute from VA=0 ==> uPC=0, uFLAG=0x0200, 
                                        all other registers = 0;
             (e). fix proc.uSP to point at the current ustack TOP (-24)

     Finally, return from exec() ==> goUmode().


Sample Solution:  samples/LAB5/lab5.bin.gz