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
>
prev parent 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).