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