[comp.os.minix] gn_wini.c

hall@cod.NOSC.MIL (Robert R. Hall) (06/10/89)

The generic disk driver gn_wini.c would run on XT computers
but failures were reported when tried on AT computers.
One of the difference I found was that the hard disk on XT
is wired into IRQ5 (int 0x0D) whereas AT uses IRQ15 (int 0x76).
The procedure phys_copy was interperted as a byte count instead
of a vector count and only interrupt vectors 16h through 44h
were beening restored.  Also the array vec_table was not large
enough to hold all the interrupt vector, so the data for int 0x76
was not even beening saved so that it could be restored.
   I also found that the AT bios uses information stored in
interrupt vector 0x41 as a pointer to disk parameter data for
drive 0 and the interrupt vector 0x46 for drive 1. Thus these vectors
also need to be restore to make gn_wini work (Bios_wini got disk
parameter another way).
   Now what was this nonsense story about bios_wini not working because
the Bios changed the stack pointer and the stack space reserved in the
Bios was not large enough. Don't beleive it, I couldn't find any code
where this was occured.
   Question.  What is the purpose of the subroutine sort in all the
??_wini.c disk drivers?  In my case the program I used to create my
partitions (Disk Manager) only allowed me to create the partition in
sorted order, so sort left my order alone. otherwise is see sort
rearranging the assosciation of /dev/hd? to the partition number.
If this is the case I think it should be deleted from all the disk
drivers.
   The following patches are relative to version 1.4a, after all
bios_wini.c didn't exist in version 1.3d.


echo x - const.h.cdif
sed '/^X/s///' > const.h.cdif << '/'
X*** /usr/v1.3d/kernel/const.h	Fri May 12 10:19:31 1989
X--- const.h	Fri Jun  9 07:53:45 1989
X***************
X*** 15,21 ****
X  #define CS_REG             9	/* proc[i].p_reg[CSREG] is saved cs */
X  #define SS_REG            10	/* proc[i].p_reg[SSREG] is saved ss */
X  
X! #define VECTOR_BYTES     284	/* bytes of interrupt vectors to save */
X  #define MEM_BYTES    655360L	/* memory size for /dev/mem */
X  
X  /* Interrupt vectors */
X--- 15,21 ----
X  #define CS_REG             9	/* proc[i].p_reg[CSREG] is saved cs */
X  #define SS_REG            10	/* proc[i].p_reg[SSREG] is saved ss */
X  
X! #define VECTOR_BYTES     255	/* bytes of interrupt vectors to save */
X  #define MEM_BYTES    655360L	/* memory size for /dev/mem */
X  
X  /* Interrupt vectors */
X***************
X*** 24,34 ****
X  #define KEYBOARD_VECTOR    9	/* keyboard interrupt vector */
X  #define ETHER_VECTOR      11	/* ethernet interrupt vector */
X  #define SECONDARY_VECTOR  11	/* RS232 interrupt vector for port 2 */
X! #define	RS232_VECTOR      12	/* RS232 interrupt vector for port 1 */
X  #define XT_WINI_VECTOR	  13	/* xt winchester interrupt vector */
X  #define FLOPPY_VECTOR     14	/* floppy disk interrupt vector */
X  #define PRINTER_VECTOR    15	/* line printer interrupt vector */
X  #define SYS_VECTOR        32	/* system calls are made with int SYSVEC */
X  #define AT_WINI_VECTOR	 118	/* at winchester interrupt vector */
X  #define PS_KEYB_VECTOR	0x71	/* keyboard interrupt vector for PS/2 */
X  
X--- 24,35 ----
X  #define KEYBOARD_VECTOR    9	/* keyboard interrupt vector */
X  #define ETHER_VECTOR      11	/* ethernet interrupt vector */
X  #define SECONDARY_VECTOR  11	/* RS232 interrupt vector for port 2 */
X! #define	RS232_VECTOR      12	/* rs232 interrupt vector */
X  #define XT_WINI_VECTOR	  13	/* xt winchester interrupt vector */
X  #define FLOPPY_VECTOR     14	/* floppy disk interrupt vector */
X  #define PRINTER_VECTOR    15	/* line printer interrupt vector */
X  #define SYS_VECTOR        32	/* system calls are made with int SYSVEC */
X+ #define BIOS_VECTOR     0x13    /* winchester BIOS interrupt vector */
X  #define AT_WINI_VECTOR	 118	/* at winchester interrupt vector */
X  #define PS_KEYB_VECTOR	0x71	/* keyboard interrupt vector for PS/2 */
X  
/
echo x - glo.h.cdif
sed '/^X/s///' > glo.h.cdif << '/'
X*** /usr/v1.4a/kernel/glo.h	Thu May 11 13:49:51 1989
X--- glo.h	Thu Jun  8 16:04:21 1989
X***************
X*** 21,24 ****
X  EXTERN int scan_code;		/* scan code of key pressed to start minix */
X  
X  /* Miscellaneous */
X! EXTERN Ax, Bx, Cx, Dx, Es;	/* used to hold registers for BIOS calls */
X--- 21,24 ----
X  EXTERN int scan_code;		/* scan code of key pressed to start minix */
X  
X  /* Miscellaneous */
X! EXTERN int Ax, Bx, Cx, Dx, Es;	/* used to hold registers for BIOS calls */
/
echo x - gn_wini.c.cdif
sed '/^X/s///' > gn_wini.c.cdif << '/'
X*** /usr/v1.4a/kernel/gn_wini.c	Thu May 11 13:50:09 1989
X--- gn_wini.c	Fri Jun  9 08:00:08 1989
X***************
X*** 315,322 ****
X  
X    base_click = BASE >> CLICK_SHIFT;
X    phys_b = umap(proc_addr(HARDWARE), D, (vir_bytes) vec_table, VECTOR_BYTES);
X!   phys_copy(phys_b+64L, 64L, (long) VECTOR_BYTES-64L);	/* restore vectors */
X!   phys_copy(phys_b+4L*XT_WINI_VECTOR, 4L*XT_WINI_VECTOR, 4L);
X!   set_vec(SYS_VECTOR, s_call, base_click);
X!   if (ps) set_vec(PS_KEYB_VECTOR, tty_int, base_click);
X! }
X--- 315,325 ----
X  
X    base_click = BASE >> CLICK_SHIFT;
X    phys_b = umap(proc_addr(HARDWARE), D, (vir_bytes) vec_table, VECTOR_BYTES);
X!   phys_copy(phys_b+4L*BIOS_VECTOR, 4L*BIOS_VECTOR, 4L);
X!   phys_copy(phys_b+4L*0x41, 4L*0x41, 4L);
X!   phys_copy(phys_b+4L*0x46, 4L*0x46, 4L);
X!   if (pc_at)
X! 	phys_copy(phys_b+4L*AT_WINI_VECTOR, 4L*AT_WINI_VECTOR, 4L);
X!   else
X! 	phys_copy(phys_b+4L*XT_WINI_VECTOR, 4L*XT_WINI_VECTOR, 4L);
X! }
/
echo x - main.c.cdif
sed '/^X/s///' > main.c.cdif << '/'
X*** /usr/v1.4a/kernel/main.c	Thu May 11 13:50:00 1989
X--- main.c	Fri Jun  9 07:47:24 1989
X***************
X*** 42,48 ****
X  int (*int_vec[HIGH_INT])() = {int00, int01, int02, int03, int04, int05, int06,
X      int07, int08, int09, int10, int11, int12, int13, int14, int15};     
X  
X! PUBLIC int vec_table[VECTOR_BYTES/2];
X  
X  /*===========================================================================*
X   *                                   main                                    * 
X--- 42,48 ----
X  int (*int_vec[HIGH_INT])() = {int00, int01, int02, int03, int04, int05, int06,
X      int07, int08, int09, int10, int11, int12, int13, int14, int15};     
X  
X! PUBLIC long vec_table[VECTOR_BYTES + 1];
X  
X  /*===========================================================================*
X   *                                   main                                    * 
X***************
X*** 151,157 ****
X  
X    /* Save the old interrupt vectors. */
X    phys_b = umap(proc_addr(HARDWARE), D, (vir_bytes) vec_table, VECTOR_BYTES);
X!   phys_copy(0L, phys_b, (long) VECTOR_BYTES);	/* save all the vectors */
X  
X    /* Overwrite unused vectors.  The holes in this list are needed by the BIOS*/
X    for (t = 0; t < HIGH_INT; t++) set_vec(t, int_vec[t], base_click);
X--- 151,157 ----
X  
X    /* Save the old interrupt vectors. */
X    phys_b = umap(proc_addr(HARDWARE), D, (vir_bytes) vec_table, VECTOR_BYTES);
X!   phys_copy(0L, phys_b, 4L * VECTOR_BYTES);	/* save all the vectors */
X  
X    /* Overwrite unused vectors.  The holes in this list are needed by the BIOS*/
X    for (t = 0; t < HIGH_INT; t++) set_vec(t, int_vec[t], base_click);
/