openblt

a hobby OS from the late 90s
git clone http://frotz.net/git/openblt.git
Log | Files | Refs | LICENSE

jump.S (3268B)


      1 /* $Id: //depot/blt/kernel/jump.S#8 $
      2 **
      3 ** Copyright 1998 Brian Swetland.  All rights reserved.
      4 ** Distributed under the terms of the OpenBLT License.
      5 */
      6 
      7 #include "smp.h"
      8 
      9 .text
     10 .globl __syscall
     11 .globl __null_irq
     12 .globl __timer_irq
     13 .globl __kbd_irq
     14 .globl __ipi_cf
     15 .globl __ipi_tlb
     16 .globl __ipi_pte
     17 .globl __ipi_resched
     18 .globl __ipi_stop
     19 .globl ehfunctab
     20 
     21 __null_irq:
     22 	movb $32, %al
     23 	outb %al, $32
     24 	iret
     25 
     26 __syscall:
     27 	pusha
     28 	call syscall
     29 	popa
     30 	iret
     31 
     32 __timer_irq:
     33 	pusha
     34 #ifdef __SMP__
     35 	movb smp_configured, %al
     36 	cmpb $1, %al
     37 	je 1f
     38 #endif
     39 	movb $32, %al
     40 	outb %al, $32
     41 #ifdef __SMP__
     42 	jmp 2f
     43 1:
     44 	call apic_eoi
     45 #endif
     46 2:
     47 	call timer_irq
     48 	popa
     49 	iret
     50 
     51 #define FAULT(n) \
     52 .globl __ex##n ;\
     53 __ex##n: ;\
     54 	pusha ;\
     55 	push $n ;\
     56 	mov $(n * 4 + ehfunctab), %ebx ;\
     57 	mov (%ebx), %ebx ;\
     58 	call *%ebx ;\
     59 	add $4,%esp ;\
     60 	popa ;\
     61 	iret
     62 
     63 #define FAULTE(n) \
     64 .globl __ex##n ;\
     65 __ex##n: ;\
     66 	pusha ;\
     67 	push $n ;\
     68 	mov $(n * 4 + ehfunctab), %ebx ;\
     69 	mov (%ebx), %ebx ;\
     70 	call *%ebx ;\
     71 	add $4,%esp ;\
     72 	popa ;\
     73 	add $4,%esp ;\
     74 	iret
     75 
     76 FAULT(0)
     77 FAULT(1)
     78 FAULT(2)
     79 FAULT(3)
     80 FAULT(4)
     81 FAULT(5)
     82 FAULT(6)
     83 FAULT(7)
     84 FAULTE(8)
     85 FAULT(9)
     86 FAULTE(10)
     87 FAULTE(11)
     88 FAULTE(12)
     89 FAULTE(13)
     90 FAULTE(14)
     91 FAULT(15)
     92 FAULT(16)
     93 FAULT(17)
     94 FAULT(18)
     95 
     96 #define IRQ(n) \
     97 .globl __irq##n ;\
     98 __irq##n: ;\
     99 	push $n ;\
    100 	pusha ;\
    101 	call irq_dispatch ;\
    102 	movb $0x20, %al ;\
    103 	outb %al, $0x20 ;\
    104 	popa ;\
    105 	add $4,%esp ;\
    106 	iret 
    107 
    108 #define IRQHI(n) \
    109 .globl __irq##n ;\
    110 __irq##n: ;\
    111 	push $n ;\
    112 	pusha ;\
    113 	call irq_dispatch ;\
    114 	movb $0x20, %al ;\
    115 	outb %al, $0xA0 ;\
    116 	movb $0x20, %al ;\
    117 	outb %al, $0x20 ;\
    118 	popa ;\
    119 	add $4,%esp ;\
    120 	iret			
    121 
    122 IRQ(1)
    123 IRQ(2)
    124 IRQ(3)
    125 IRQ(4)
    126 IRQ(5)
    127 IRQ(6)
    128 IRQ(7)
    129 IRQHI(8)
    130 IRQHI(9)
    131 IRQHI(10)
    132 IRQHI(11)
    133 IRQHI(12)
    134 IRQHI(13)
    135 IRQHI(14)
    136 IRQHI(15)
    137 
    138 # From: Jeff Bush <jeff@be.com>
    139 
    140 ;#       1. Stores necessary registers on old stack
    141 ;#       2. Changes old stack pointer to reflect new offset
    142 ;#       3. Change address space if necessary
    143 ;#       4. Pops state off old stack
    144 ;#       5. returns to address on old stack, resuming thread
    145 
    146 
    147 .globl          _context_switch
    148 .globl			thread_bootstrap
    149 .globl			kthread_bootstrap
    150 
    151 _context_switch:
    152 				pushf
    153                 pushl   %ebp
    154                 pushl   %esi
    155                 pushl   %edi
    156 				pushl	%ebx
    157                 movl    24(%esp), %eax          # Where to save stack pointer
    158                 movl    %esp, (%eax)            # Save old stack
    159                 movl    32(%esp), %eax          # Get new PDBR
    160                 movl    28(%esp), %ebx          # Get new stack loc
    161 
    162                 cmpl    $0, %eax                # Need to change addr. space?
    163                 je      changed_pdbr            # If parameter was zero, no
    164                 movl    %eax, %cr3              # Change address space
    165 
    166 changed_pdbr:   movl    %ebx, %esp              # switch to new stack
    167 				popl	%ebx
    168                 popl    %edi
    169                 popl    %esi
    170                 popl    %ebp
    171                 popf
    172                 ret
    173 				
    174 thread_bootstrap:
    175 				iret
    176 
    177 kthread_bootstrap:
    178 				lret
    179 
    180 
    181 #ifdef __SMP__
    182 
    183 __ipi_cf:
    184 	pushl $0x40
    185 	jmp __ipi
    186 __ipi_tlb:
    187 	pushl $0x41
    188 	jmp __ipi
    189 __ipi_pte:
    190 	pushl $0x42
    191 	jmp __ipi
    192 __ipi_resched:
    193 	pushl $0x43
    194 	jmp __ipi
    195 __ipi_stop:
    196 	pushl $0x44
    197 	jmp __ipi
    198 
    199 __ipi:
    200 	pusha
    201 	call ipi_dispatch
    202 	call apic_eoi
    203 	popa
    204 	add $4, %esp
    205 	iret
    206 
    207 #endif
    208