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