home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / drdobbs / 1991 / 01 / 386bsd.asc next >
Text File  |  1990-12-07  |  5KB  |  170 lines

  1. _PORTING UNIX TO THE 80386: A PRACTICAL APPROACH_
  2. by William Frederick Jolitz and Lynne Greer Jolitz
  3.  
  4.  
  5. [FIGURE 6]
  6.  
  7. /* Intel 386 process control block  */
  8.  
  9. struct pcb {
  10.     struct    i386tss pcbtss;
  11. #define    pcb_ksp    pcbtss.tss_esp0
  12. #define    pcb_ptd    pcbtss.tss_cr3
  13. #define    pcb_pc    pcbtss.tss_eip
  14. #define    pcb_psl    pcbtss.tss_eflags
  15. #define    pcb_usp    pcbtss.tss_esp
  16. #define    pcb_fp    pcbtss.tss_ebp
  17.  
  18. /* Software pcb (extension)  */
  19.     int    pcb_fpsav;
  20. #define    FP_NEEDSAVE    0x1    /* need save on next context switch */
  21. #define    FP_NEEDRESTORE    0x2    /* need restore on next DNA fault */
  22.     struct    save87    pcb_savefpu;
  23.     struct    pte    *pcb_p0br;
  24.     struct    pte    *pcb_p1br;
  25.     int    pcb_p0lr;
  26.     int    pcb_p1lr;
  27.     int    pcb_szpt;     /* number of pages of user page table */
  28.     int    pcb_cmap2;
  29.     int    *pcb_sswap;
  30.     long    pcb_sigc[8];    /* sigcode actually 19 bytes */
  31.     int    pcb_iml;    /* interrupt mask level */
  32. };
  33.  
  34. /* Intel 386 Task Switch State  */
  35. struct i386tss {
  36.     long    tss_link;    /* actually 16 bits: top 16 bits must be zero */
  37.     long    tss_esp0;    /* kernel stack pointer priviledge level 0 */
  38. #define    tss_ksp    tss_esp0
  39.     long    tss_ss0;     /* actually 16 bits: top 16 bits must be zero */
  40.     long    tss_esp1;    /* kernel stack pointer priviledge level 1 */
  41.     long    tss_ss1;     /* actually 16 bits: top 16 bits must be zero */
  42.     long    tss_esp2;    /* kernel stack pointer priviledge level 2 */
  43.     long    tss_ss2;     /* actually 16 bits: top 16 bits must be zero */
  44.     long    tss_cr3;     /* page table directory physical address */
  45. #define    tss_ptd    tss_cr3
  46.     long    tss_eip;     /* program counter */
  47. #define    tss_pc    tss_eip
  48.     long    tss_eflags;     /* program status longword */
  49. #define    tss_psl    tss_eflags
  50.     long    tss_eax; 
  51.     long    tss_ecx; 
  52.     long    tss_edx; 
  53.     long    tss_ebx; 
  54.     long    tss_esp;     /* user stack pointer */
  55. #define    tss_usp    tss_esp
  56.     long    tss_ebp;     /* user frame pointer */
  57. #define    tss_fp    tss_ebp
  58.     long    tss_esi; 
  59.     long    tss_edi; 
  60.     long    tss_es;         /* actually 16 bits: top 16 bits must be zero */
  61.     long    tss_cs;         /* actually 16 bits: top 16 bits must be zero */
  62.     long    tss_ss;         /* actually 16 bits: top 16 bits must be zero */
  63.     long    tss_ds;         /* actually 16 bits: top 16 bits must be zero */
  64.     long    tss_fs;         /* actually 16 bits: top 16 bits must be zero */
  65.     long    tss_gs;         /* actually 16 bits: top 16 bits must be zero */
  66.     long    tss_ldt;     /* actually 16 bits: top 16 bits must be zero */
  67.     long    tss_ioopt;   /* options & io offset bitmap: currently zero */
  68.                  /* XXX unimplemented .. i/o permission bitmap */
  69. };
  70.  
  71.  
  72. [FIGURE 8]
  73.  
  74. #include <syscall.h>
  75.  
  76.     globl _write, _errno
  77.  
  78. #amtwritten =  write(fildes, address, count); 
  79.  
  80. _write:                # caller places arguments on stack 
  81.     lea    SYS_write,%eax    # select desired system call 
  82.     lcall    $0x7,0        # call the system 
  83.     jb    1f        # if system returns error, handle
  84.     ret                     # otherwise return 
  85.  
  86. 1:    movl    %eax,_errno    # save error in global variable 
  87.     movl    $-1,%eax    # indicate error has occured 
  88.     ret            # and return 
  89.  
  90.  
  91. [FIGURE 10a]
  92.  
  93. /* Per device structure. */
  94. struct isa_device {
  95.     struct    isa_driver *id_driver;    /* per driver configuration info */
  96.     short    id_iobase;    /* Base i/o address register */
  97.     short    id_irq;        /* Interrupt request */
  98.     short    id_drq;        /* DMA request */
  99.     caddr_t    id_maddr;    /* Physical shared memory address on bus */
  100.     int    id_msize;    /* Size of shared memory */
  101.     int    (*id_intr)();    /* Interrupt interface routine */
  102.     int    id_unit;    /* Physical unit number within driver */
  103.     int    id_scsiid;    /* SCSI id if SCSI device */
  104.     int    id_alive;    /* Device is present and accounted for */
  105. };
  106.  
  107. /* Per driver structure. */
  108. struct isa_driver {
  109.     int    (*probe)();    /* Test whether device is present */
  110.     int    (*attach)();    /* Setup driver for a device */
  111.     char    *name;        /* Device name */
  112. };
  113.  
  114.  
  115.  
  116. [FIGURE 10b]
  117.  
  118. /* ISA Bus devices */
  119.  
  120. #include "machine/isa/device.h"        /* device structure */
  121.  
  122. /* Software drivers */
  123. #define V(s)    V/**/s
  124. extern struct driver wddriver; extern V(wd0)();
  125. extern struct driver cndriver; extern V(cn0)();
  126. extern struct driver comdriver; extern V(com0)(); extern V(com1)();
  127. extern struct driver fddriver; extern V(fd0)();
  128. extern struct driver nedriver; extern V(ne0)();
  129.  
  130. /* Possible hardware devices */
  131. #define    C    (caddr_t)
  132. struct isa_device isa_devtab_bio[] = {
  133. /* driver     iobase    irq    drq maddr    msiz    intr    unit */
  134.  
  135. { &wddriver,    IO_WD0,    IRQ14,    -1,  C 0,    0,      V(wd0),    0},
  136. { &wddriver,    IO_WD1,    IRQ13,    -1,  C 0,    0,      V(wd1),    1},
  137. { &fddriver,    IO_FD0,    IRQ6,     2,  C 0,    0,      V(fd0),    0},
  138. { &fddriver,    IO_FD1,    IRQ6,     2,  C 0,    0,      V(fd1),    1},
  139. 0
  140. };
  141.  
  142. struct isa_device isa_devtab_tty[] = {
  143. /* driver     iobase    irq    drq  maddr    msiz      intr        unit */
  144.  
  145. { &vgadriver,    IO_VGA,       0,    -1,  C 0xa0000,    0x10000,  0,        0},
  146. { &cgadriver,    IO_CGA,       0,    -1,  C 0xa0000,    0x4000,      0,        0},
  147. { &mdadriver,    IO_MDA,       0,    -1,  C 0xb8000,    0x4000,      0,        0},
  148. { &kbddriver,    IO_KBD,    IRQ1,    -1,  C 0,    0,      V(kbd0),    0},
  149. { &cndriver,    IO_KBD,    IRQ1,    -1,  C 0,    0,      V(cn0),    0},
  150.  
  151. { &comdriver,    IO_COM0,IRQ4,    -1,  C 0,    0,      V(com0),    0},
  152. { &comdriver,    IO_COM1,IRQ3,    -1,  C 0,    0,      V(com1),    1},
  153. 0
  154. };
  155.  
  156. struct isa_device isa_devtab_net[] = {
  157. /* driver     iobase    irq    drq  maddr    msiz      intr        unit */
  158.  
  159. { &nedriver,    0x320,  IRQ9,    -1,  C 0,    0,      V(ne0),    0},
  160. 0
  161. };
  162.  
  163. struct isa_device isa_devtab_null[] = {
  164. /* driver     iobase    irq    drq  maddr    msiz      intr        unit */
  165.  
  166. 0
  167. };
  168.  
  169.  
  170.