All of lore.kernel.org
 help / color / mirror / Atom feed
From: ht-lab <hans64@ht-lab.com>
To: Juan Perez-Sanchez <lithoxs@gmail.com>
Cc: linux-8086 <linux-8086@vger.kernel.org>
Subject: Re: More corrections to patch for irqtab.c
Date: Fri, 03 Feb 2012 08:40:33 +0000	[thread overview]
Message-ID: <4F2B9D81.4090401@ht-lab.com> (raw)
In-Reply-To: <CAD6VGuYQOAPXje-WGXerfCo5AvD7VhAcV4h-FAr-2uG3sONuvg@mail.gmail.com>

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@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>


      reply	other threads:[~2012-02-03  8:40 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-02 23:31 More corrections to patch for irqtab.c Juan Perez-Sanchez
2012-02-03  8:40 ` ht-lab [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4F2B9D81.4090401@ht-lab.com \
    --to=hans64@ht-lab.com \
    --cc=linux-8086@vger.kernel.org \
    --cc=lithoxs@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.