Re: More corrections to patch for irqtab.c

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Juan,

Thanks for the patches, it is good to know that ELKS is not completely abandoned.....

Hans
www.ht-lab.com

On 02/02/2012 23:31, Juan Perez-Sanchez wrote:
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


--
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


[Index of Archives]     [Kernel]     [Linux ia64]     [DCCP]     [Linux for ARM]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux