Hi,
I'm very sorry for this, but there are problems with the previous
patch for irqtab.c.
Please ignore the 2 previous patches. Next is the final, thoroughly
tested patch for that file.
Greetings,
Juan
diff -Nurb elks.orig/arch/i86/kernel/irqtab.c elks/arch/i86/kernel/irqtab.c
--- elks.orig/arch/i86/kernel/irqtab.c 2002-10-31 19:04:25.000000000 -0600
+++ elks/arch/i86/kernel/irqtab.c 2012-02-02 18:22:39.000000000 -0600
@@ -36,6 +36,11 @@
#define bios_call_cnt cseg_bios_call_cnt
#endif
+#ifdef CONFIG_ROMCODE
+ #define SEG_IRQ_DATA es
+#else
+ #define SEG_IRQ_DATA cs
+#endif
#ifndef S_SPLINT_S
#asm
@@ -105,27 +110,27 @@
mov dx,ds ;the original value
cli ;just here
- xor ax,ax
- mov es,ax ;intr table
-
#ifdef CONFIG_ROMCODE
mov ax,#CONFIG_ROM_IRQ_DATA
-#else
- mov ax,cs
+ mov es,ax
#endif
- mov ds,ax
- mov stashed_ds,dx
+ seg SEG_IRQ_DATA
+ mov stashed_ds,ds
+ mov bios_call_cnt_l,#5
+
+ xor ax,ax
+ mov es,ax ;intr table
seg es ;insert new timer intr
mov bx,[32]
- mov off_stashed_irq0, bx ; the old one
+ mov off_stashed_irq0_l, bx ; the old one
lea ax,_irq0
seg es
mov [32],ax
seg es
mov bx,[34]
- mov seg_stashed_irq0, bx
+ mov seg_stashed_irq0_l, bx
mov ax,cs
seg es
mov [34],ax
@@ -430,7 +435,7 @@
! Save all registers
!
- cli ! Might not be disabled on an exception
+! cli ! Might not be disabled on an exception
push ds
push es
push bx
@@ -445,23 +450,19 @@
!
#ifdef CONFIG_ROMCODE
mov bx,#CONFIG_ROM_IRQ_DATA
-#else
- mov bx,cs
+ mov es,bx
#endif
- mov ds,bx
-
- mov stashed_irq,ax ! Save IRQ number
- mov ax,ss ! Get current SS
- mov bx,ax ! Save for later
- mov stashed_ss, ax ! Save SS:SP
- mov ax,sp
- mov stashed_sp, ax
!
! Switch segments
!
- mov ax,stashed_ds ! Recover the data segment
- mov ds,ax
- mov es,ax
+ seg SEG_IRQ_DATA
+ mov bx,stashed_ds ! Recover the data segment
+ mov ds,bx
+ mov es,bx
+
+ mov dx,ss ! Get current SS
+ mov bp,sp ! Get current SP
+ movb cl,bios_call_cnt_l
!
! Set up task switch controller
!
@@ -469,14 +470,13 @@
!
! See where we were (BX holds the SS on entry)
!
- cmp ax,bx ! SS = kernel SS ?
+ cmp dx,bx ! SS = kernel SS ?
je ktask ! Kernel - no work
!
! User or BIOS etc
!
- mov ax,bx
mov bx,_current
- cmp ax,4[bx] ! entry ss = current->t_regs.ss?
+ cmp dx,4[bx] ! entry ss = current->t_regs.ss?
je utask ! Switch to kernel
!
! Bios etc - switch to interrupt stack
@@ -488,37 +488,23 @@
! User task. Extract kernel SP. (BX already holds current)
!
utask:
- mov ax,[bx] ! kernel stack ptr
- mov sp,ax ! switch to kernel stack
+ mov sp,[bx] ! switch to kernel stack ptr
inc ch ! Switch allowable
- j switched
-ktask:
!
! In ktask state we have a suitable stack. It might be
! better to use the intstack..
!
switched:
- mov ax,ds
- mov ss,ax ! /* Set SS: right */
+ mov bx,ds
+ mov ss,bx ! /* Set SS: right */
+ktask:
! /*
! Put the old SS;SP on the top of the stack. We can't
! leave them in stashed_ss/sp as we could re-enter the
! routine on a reschedule.
! */
-#ifdef CONFIG_ROMCODE
- mov ax,#CONFIG_ROM_IRQ_DATA
- mov es,ax
- seg es
- push stashed_sp
- seg es
- push stashed_ss
-
-#else
- seg cs
- push stashed_sp
- seg cs
- push stashed_ss
-#endif
+ push bp ! push entry SP
+ push dx ! push entry SS
!
! We are on a suitable stack and cx says whether we can
! switch afterwards. The C code will want to eat CX so
@@ -530,19 +516,9 @@
mov bp,sp
mov _can_tswitch, ch
push cx ! Save ch
-#ifdef CONFIG_ROMCODE
- seg es
-#else
- seg cs ! Recover the IRQ we saved
-#endif
- mov ax,stashed_irq
push ax ! IRQ for later
push bp ! Register base
push ax ! IRQ number
-#ifdef CONFIG_ROMCODE
- mov ax,ds
- mov es,ax ;es back to dataseg
-#endif
!
! Call the C code
!
@@ -557,48 +533,22 @@
!
! Restore any chips
!
- cmp ax,#15
+ cmp ax,#16
jge was_trap ! Traps need no reset
- cmp ax,#8
- jge sec_8259 ! IRQ on low chip
-!
-! Reset primary 8259
-!
+ or ax,ax ! Is int #0?
+ jnz a4
+ dec cl ! Will call bios int?
+ je was_trap
+a4:
mov cl,al ! Save the IRQ number
- inb al,0x21 ! The chip line state
- jmp a7
-a7: jmp a8
-a8:
-! movb al,#1
-! shl al,cl ! Shift the irq (saved in cl) to a mask
-! orb al,_cache_21
-! movb _cache_21, al
- movb al,_cache_21 ! Extract the IRQ mask register
- outb 0x21,al ! Now ack the IRQ
- jmp a9
-a9: jmp a10
-a10: movb al,#0x20 ! EOI
- outb 0x20,al
- jmp was_trap
-
+ movb al,#0x20 ! EOI
+ cmp cl,#8
+ jb a6 ! IRQ on low chip
!
! Reset secondary 8259 if we have taken an AT rather
! than XT irq. We also have to prod the primay
! controller EOI..
!
-sec_8259:
- mov cl,al ! Save the IRQ for making masks
- inb al,0xA1
- jmp a1
-a1: jmp a2
-a2: movb al,#1
- shl al,cl
- orb al,_cache_A1
- movb _cache_A1, al
- outb 0xA1,al ! Now ack the IRQ
- jmp a3
-a3: jmp a4
-a4: movb al,#0x20
outb 0xA0,al
jmp a5
a5: jmp a6
@@ -609,6 +559,17 @@
!
was_trap:
+ orb cl,cl
+ jnz no_bios_call
+!
+! IRQ 0 (timer) has to go on to the bios for some systems
+!
+ dec bios_call_cnt_l
+ jne no_bios_call
+ mov bios_call_cnt_l,#5
+ pushf
+ callf [off_stashed_irq0_l]
+no_bios_call:
!
! Now look at rescheduling
!
@@ -655,83 +616,25 @@
pop cx
pop bx
pop es
-#ifdef CONFIG_ROMCODE
- mov ax,#CONFIG_ROM_IRQ_DATA
- mov ds,ax
-#else
- seg cs
-#endif
- mov ax, stashed_irq
- or ax,ax
- jz irq0_bios
pop ds
pop ax
!
! Iret restores CS:IP and F (thus including the interrupt bit)
!
iret
-!
-! IRQ 0 (timer) has to go on to the bios for some systems
-!
-! FIXME: should call the bios only every fifth event.
-!
-irq0_bios:
- pop ds
- pop ax ;now the stack empty
-
-;------------------------------------------------
-;Build new Stack
-;
-; SP -> RET seg
-; RET offs
-; SP-4 -> BP
-; SP-4 -> BX
-; DS
-; SP-8 -> free ;sp
-
-label1:
-
- sub sp,#4 ;space for retf
- push bp
- mov bp,sp
-
- push bx
- push ds
-#ifdef CONFIG_ROMCODE
- mov bx,#CONFIG_ROM_IRQ_DATA
-#else
- mov bx,cs
-#endif
- mov ds,bx
- mov bx,bios_call_cnt
- inc bx
- cmp bx,#5
- jne no_bios_call
-
- xor bx,bx
- mov bios_call_cnt,bx
- mov bx, seg_stashed_irq0
- mov [bp+4], bx
- mov bx, off_stashed_irq0
- mov [bp+2], bx
-
- pop ds
- pop bx
- pop bp
- retf
-
-no_bios_call: ;sp-8
- mov bios_call_cnt,bx
- pop ds
- pop bx ;sp-4
- pop bp
- add sp,#4
- iret
.data
.globl _can_tswitch
_can_tswitch:
.byte 0
+
+off_stashed_irq0_l:
+ .word 0
+seg_stashed_irq0_l:
+ .word 0
+bios_call_cnt_l:
+ .word 0
+
.zerow 256 ! (was) 128 byte interrupt stack
_intstack:
--
To unsubscribe from this list: send the line "unsubscribe linux-8086" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html