Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

powerpc/booke: Provide exception macros with interrupt name

DO_KVM will need to identify the particular exception type.

There is an existing set of arbitrary numbers that Linux passes,
but it's an undocumented mess that sort of corresponds to server/classic
exception vectors but not really.

Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Avi Kivity <avi@redhat.com>

authored by

Scott Wood and committed by
Avi Kivity
cfac5784 ab9fc405

+68 -48
+14 -9
arch/powerpc/kernel/head_44x.S
··· 248 248 249 249 interrupt_base: 250 250 /* Critical Input Interrupt */ 251 - CRITICAL_EXCEPTION(0x0100, CriticalInput, unknown_exception) 251 + CRITICAL_EXCEPTION(0x0100, CRITICAL, CriticalInput, unknown_exception) 252 252 253 253 /* Machine Check Interrupt */ 254 - CRITICAL_EXCEPTION(0x0200, MachineCheck, machine_check_exception) 254 + CRITICAL_EXCEPTION(0x0200, MACHINE_CHECK, MachineCheck, \ 255 + machine_check_exception) 255 256 MCHECK_EXCEPTION(0x0210, MachineCheckA, machine_check_exception) 256 257 257 258 /* Data Storage Interrupt */ ··· 262 261 INSTRUCTION_STORAGE_EXCEPTION 263 262 264 263 /* External Input Interrupt */ 265 - EXCEPTION(0x0500, ExternalInput, do_IRQ, EXC_XFER_LITE) 264 + EXCEPTION(0x0500, BOOKE_INTERRUPT_EXTERNAL, ExternalInput, \ 265 + do_IRQ, EXC_XFER_LITE) 266 266 267 267 /* Alignment Interrupt */ 268 268 ALIGNMENT_EXCEPTION ··· 275 273 #ifdef CONFIG_PPC_FPU 276 274 FP_UNAVAILABLE_EXCEPTION 277 275 #else 278 - EXCEPTION(0x2010, FloatingPointUnavailable, unknown_exception, EXC_XFER_EE) 276 + EXCEPTION(0x2010, BOOKE_INTERRUPT_FP_UNAVAIL, \ 277 + FloatingPointUnavailable, unknown_exception, EXC_XFER_EE) 279 278 #endif 280 279 /* System Call Interrupt */ 281 280 START_EXCEPTION(SystemCall) 282 - NORMAL_EXCEPTION_PROLOG 281 + NORMAL_EXCEPTION_PROLOG(BOOKE_INTERRUPT_SYSCALL) 283 282 EXC_XFER_EE_LITE(0x0c00, DoSyscall) 284 283 285 284 /* Auxiliary Processor Unavailable Interrupt */ 286 - EXCEPTION(0x2020, AuxillaryProcessorUnavailable, unknown_exception, EXC_XFER_EE) 285 + EXCEPTION(0x2020, BOOKE_INTERRUPT_AP_UNAVAIL, \ 286 + AuxillaryProcessorUnavailable, unknown_exception, EXC_XFER_EE) 287 287 288 288 /* Decrementer Interrupt */ 289 289 DECREMENTER_EXCEPTION 290 290 291 291 /* Fixed Internal Timer Interrupt */ 292 292 /* TODO: Add FIT support */ 293 - EXCEPTION(0x1010, FixedIntervalTimer, unknown_exception, EXC_XFER_EE) 293 + EXCEPTION(0x1010, BOOKE_INTERRUPT_FIT, FixedIntervalTimer, \ 294 + unknown_exception, EXC_XFER_EE) 294 295 295 296 /* Watchdog Timer Interrupt */ 296 297 /* TODO: Add watchdog support */ 297 298 #ifdef CONFIG_BOOKE_WDT 298 - CRITICAL_EXCEPTION(0x1020, WatchdogTimer, WatchdogException) 299 + CRITICAL_EXCEPTION(0x1020, WATCHDOG, WatchdogTimer, WatchdogException) 299 300 #else 300 - CRITICAL_EXCEPTION(0x1020, WatchdogTimer, unknown_exception) 301 + CRITICAL_EXCEPTION(0x1020, WATCHDOG, WatchdogTimer, unknown_exception) 301 302 #endif 302 303 303 304 /* Data TLB Error Interrupt */
+22 -19
arch/powerpc/kernel/head_booke.h
··· 2 2 #define __HEAD_BOOKE_H__ 3 3 4 4 #include <asm/ptrace.h> /* for STACK_FRAME_REGS_MARKER */ 5 + #include <asm/kvm_asm.h> 6 + 5 7 /* 6 8 * Macros used for common Book-e exception handling 7 9 */ ··· 30 28 */ 31 29 #define THREAD_NORMSAVE(offset) (THREAD_NORMSAVES + (offset * 4)) 32 30 33 - #define NORMAL_EXCEPTION_PROLOG \ 31 + #define NORMAL_EXCEPTION_PROLOG(intno) \ 34 32 mtspr SPRN_SPRG_WSCRATCH0, r10; /* save one register */ \ 35 33 mfspr r10, SPRN_SPRG_THREAD; \ 36 34 stw r11, THREAD_NORMSAVE(0)(r10); \ ··· 115 113 * registers as the normal prolog above. Instead we use a portion of the 116 114 * critical/machine check exception stack at low physical addresses. 117 115 */ 118 - #define EXC_LEVEL_EXCEPTION_PROLOG(exc_level, exc_level_srr0, exc_level_srr1) \ 116 + #define EXC_LEVEL_EXCEPTION_PROLOG(exc_level, intno, exc_level_srr0, exc_level_srr1) \ 119 117 mtspr SPRN_SPRG_WSCRATCH_##exc_level,r8; \ 120 118 BOOKE_LOAD_EXC_LEVEL_STACK(exc_level);/* r8 points to the exc_level stack*/ \ 121 119 stw r9,GPR9(r8); /* save various registers */\ ··· 164 162 SAVE_4GPRS(3, r11); \ 165 163 SAVE_2GPRS(7, r11) 166 164 167 - #define CRITICAL_EXCEPTION_PROLOG \ 168 - EXC_LEVEL_EXCEPTION_PROLOG(CRIT, SPRN_CSRR0, SPRN_CSRR1) 165 + #define CRITICAL_EXCEPTION_PROLOG(intno) \ 166 + EXC_LEVEL_EXCEPTION_PROLOG(CRIT, intno, SPRN_CSRR0, SPRN_CSRR1) 169 167 #define DEBUG_EXCEPTION_PROLOG \ 170 - EXC_LEVEL_EXCEPTION_PROLOG(DBG, SPRN_DSRR0, SPRN_DSRR1) 168 + EXC_LEVEL_EXCEPTION_PROLOG(DBG, DEBUG, SPRN_DSRR0, SPRN_DSRR1) 171 169 #define MCHECK_EXCEPTION_PROLOG \ 172 - EXC_LEVEL_EXCEPTION_PROLOG(MC, SPRN_MCSRR0, SPRN_MCSRR1) 170 + EXC_LEVEL_EXCEPTION_PROLOG(MC, MACHINE_CHECK, \ 171 + SPRN_MCSRR0, SPRN_MCSRR1) 173 172 174 173 /* 175 174 * Exception vectors. ··· 184 181 .long func; \ 185 182 .long ret_from_except_full 186 183 187 - #define EXCEPTION(n, label, hdlr, xfer) \ 184 + #define EXCEPTION(n, intno, label, hdlr, xfer) \ 188 185 START_EXCEPTION(label); \ 189 - NORMAL_EXCEPTION_PROLOG; \ 186 + NORMAL_EXCEPTION_PROLOG(intno); \ 190 187 addi r3,r1,STACK_FRAME_OVERHEAD; \ 191 188 xfer(n, hdlr) 192 189 193 - #define CRITICAL_EXCEPTION(n, label, hdlr) \ 194 - START_EXCEPTION(label); \ 195 - CRITICAL_EXCEPTION_PROLOG; \ 196 - addi r3,r1,STACK_FRAME_OVERHEAD; \ 190 + #define CRITICAL_EXCEPTION(n, intno, label, hdlr) \ 191 + START_EXCEPTION(label); \ 192 + CRITICAL_EXCEPTION_PROLOG(intno); \ 193 + addi r3,r1,STACK_FRAME_OVERHEAD; \ 197 194 EXC_XFER_TEMPLATE(hdlr, n+2, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), \ 198 195 NOCOPY, crit_transfer_to_handler, \ 199 196 ret_from_crit_exc) ··· 305 302 306 303 #define DEBUG_CRIT_EXCEPTION \ 307 304 START_EXCEPTION(DebugCrit); \ 308 - CRITICAL_EXCEPTION_PROLOG; \ 305 + CRITICAL_EXCEPTION_PROLOG(DEBUG); \ 309 306 \ 310 307 /* \ 311 308 * If there is a single step or branch-taken exception in an \ ··· 358 355 359 356 #define DATA_STORAGE_EXCEPTION \ 360 357 START_EXCEPTION(DataStorage) \ 361 - NORMAL_EXCEPTION_PROLOG; \ 358 + NORMAL_EXCEPTION_PROLOG(DATA_STORAGE); \ 362 359 mfspr r5,SPRN_ESR; /* Grab the ESR and save it */ \ 363 360 stw r5,_ESR(r11); \ 364 361 mfspr r4,SPRN_DEAR; /* Grab the DEAR */ \ ··· 366 363 367 364 #define INSTRUCTION_STORAGE_EXCEPTION \ 368 365 START_EXCEPTION(InstructionStorage) \ 369 - NORMAL_EXCEPTION_PROLOG; \ 366 + NORMAL_EXCEPTION_PROLOG(INST_STORAGE); \ 370 367 mfspr r5,SPRN_ESR; /* Grab the ESR and save it */ \ 371 368 stw r5,_ESR(r11); \ 372 369 mr r4,r12; /* Pass SRR0 as arg2 */ \ ··· 375 372 376 373 #define ALIGNMENT_EXCEPTION \ 377 374 START_EXCEPTION(Alignment) \ 378 - NORMAL_EXCEPTION_PROLOG; \ 375 + NORMAL_EXCEPTION_PROLOG(ALIGNMENT); \ 379 376 mfspr r4,SPRN_DEAR; /* Grab the DEAR and save it */ \ 380 377 stw r4,_DEAR(r11); \ 381 378 addi r3,r1,STACK_FRAME_OVERHEAD; \ ··· 383 380 384 381 #define PROGRAM_EXCEPTION \ 385 382 START_EXCEPTION(Program) \ 386 - NORMAL_EXCEPTION_PROLOG; \ 383 + NORMAL_EXCEPTION_PROLOG(PROGRAM); \ 387 384 mfspr r4,SPRN_ESR; /* Grab the ESR and save it */ \ 388 385 stw r4,_ESR(r11); \ 389 386 addi r3,r1,STACK_FRAME_OVERHEAD; \ ··· 391 388 392 389 #define DECREMENTER_EXCEPTION \ 393 390 START_EXCEPTION(Decrementer) \ 394 - NORMAL_EXCEPTION_PROLOG; \ 391 + NORMAL_EXCEPTION_PROLOG(DECREMENTER); \ 395 392 lis r0,TSR_DIS@h; /* Setup the DEC interrupt mask */ \ 396 393 mtspr SPRN_TSR,r0; /* Clear the DEC interrupt */ \ 397 394 addi r3,r1,STACK_FRAME_OVERHEAD; \ ··· 399 396 400 397 #define FP_UNAVAILABLE_EXCEPTION \ 401 398 START_EXCEPTION(FloatingPointUnavailable) \ 402 - NORMAL_EXCEPTION_PROLOG; \ 399 + NORMAL_EXCEPTION_PROLOG(FP_UNAVAIL); \ 403 400 beq 1f; \ 404 401 bl load_up_fpu; /* if from user, just load it up */ \ 405 402 b fast_exception_return; \
+32 -20
arch/powerpc/kernel/head_fsl_booke.S
··· 301 301 302 302 interrupt_base: 303 303 /* Critical Input Interrupt */ 304 - CRITICAL_EXCEPTION(0x0100, CriticalInput, unknown_exception) 304 + CRITICAL_EXCEPTION(0x0100, CRITICAL, CriticalInput, unknown_exception) 305 305 306 306 /* Machine Check Interrupt */ 307 307 #ifdef CONFIG_E200 308 308 /* no RFMCI, MCSRRs on E200 */ 309 - CRITICAL_EXCEPTION(0x0200, MachineCheck, machine_check_exception) 309 + CRITICAL_EXCEPTION(0x0200, MACHINE_CHECK, MachineCheck, \ 310 + machine_check_exception) 310 311 #else 311 312 MCHECK_EXCEPTION(0x0200, MachineCheck, machine_check_exception) 312 313 #endif 313 314 314 315 /* Data Storage Interrupt */ 315 316 START_EXCEPTION(DataStorage) 316 - NORMAL_EXCEPTION_PROLOG 317 + NORMAL_EXCEPTION_PROLOG(DATA_STORAGE) 317 318 mfspr r5,SPRN_ESR /* Grab the ESR, save it, pass arg3 */ 318 319 stw r5,_ESR(r11) 319 320 mfspr r4,SPRN_DEAR /* Grab the DEAR, save it, pass arg2 */ ··· 329 328 INSTRUCTION_STORAGE_EXCEPTION 330 329 331 330 /* External Input Interrupt */ 332 - EXCEPTION(0x0500, ExternalInput, do_IRQ, EXC_XFER_LITE) 331 + EXCEPTION(0x0500, EXTERNAL, ExternalInput, do_IRQ, EXC_XFER_LITE) 333 332 334 333 /* Alignment Interrupt */ 335 334 ALIGNMENT_EXCEPTION ··· 343 342 #else 344 343 #ifdef CONFIG_E200 345 344 /* E200 treats 'normal' floating point instructions as FP Unavail exception */ 346 - EXCEPTION(0x0800, FloatingPointUnavailable, program_check_exception, EXC_XFER_EE) 345 + EXCEPTION(0x0800, FP_UNAVAIL, FloatingPointUnavailable, \ 346 + program_check_exception, EXC_XFER_EE) 347 347 #else 348 - EXCEPTION(0x0800, FloatingPointUnavailable, unknown_exception, EXC_XFER_EE) 348 + EXCEPTION(0x0800, FP_UNAVAIL, FloatingPointUnavailable, \ 349 + unknown_exception, EXC_XFER_EE) 349 350 #endif 350 351 #endif 351 352 352 353 /* System Call Interrupt */ 353 354 START_EXCEPTION(SystemCall) 354 - NORMAL_EXCEPTION_PROLOG 355 + NORMAL_EXCEPTION_PROLOG(SYSCALL) 355 356 EXC_XFER_EE_LITE(0x0c00, DoSyscall) 356 357 357 358 /* Auxiliary Processor Unavailable Interrupt */ 358 - EXCEPTION(0x2900, AuxillaryProcessorUnavailable, unknown_exception, EXC_XFER_EE) 359 + EXCEPTION(0x2900, AP_UNAVAIL, AuxillaryProcessorUnavailable, \ 360 + unknown_exception, EXC_XFER_EE) 359 361 360 362 /* Decrementer Interrupt */ 361 363 DECREMENTER_EXCEPTION 362 364 363 365 /* Fixed Internal Timer Interrupt */ 364 366 /* TODO: Add FIT support */ 365 - EXCEPTION(0x3100, FixedIntervalTimer, unknown_exception, EXC_XFER_EE) 367 + EXCEPTION(0x3100, FIT, FixedIntervalTimer, \ 368 + unknown_exception, EXC_XFER_EE) 366 369 367 370 /* Watchdog Timer Interrupt */ 368 371 #ifdef CONFIG_BOOKE_WDT 369 - CRITICAL_EXCEPTION(0x3200, WatchdogTimer, WatchdogException) 372 + CRITICAL_EXCEPTION(0x3200, WATCHDOG, WatchdogTimer, WatchdogException) 370 373 #else 371 - CRITICAL_EXCEPTION(0x3200, WatchdogTimer, unknown_exception) 374 + CRITICAL_EXCEPTION(0x3200, WATCHDOG, WatchdogTimer, unknown_exception) 372 375 #endif 373 376 374 377 /* Data TLB Error Interrupt */ ··· 543 538 #ifdef CONFIG_SPE 544 539 /* SPE Unavailable */ 545 540 START_EXCEPTION(SPEUnavailable) 546 - NORMAL_EXCEPTION_PROLOG 541 + NORMAL_EXCEPTION_PROLOG(SPE_UNAVAIL) 547 542 bne load_up_spe 548 543 addi r3,r1,STACK_FRAME_OVERHEAD 549 544 EXC_XFER_EE_LITE(0x2010, KernelSPE) 550 545 #else 551 - EXCEPTION(0x2020, SPEUnavailable, unknown_exception, EXC_XFER_EE) 546 + EXCEPTION(0x2020, SPE_UNAVAIL, SPEUnavailable, \ 547 + unknown_exception, EXC_XFER_EE) 552 548 #endif /* CONFIG_SPE */ 553 549 554 550 /* SPE Floating Point Data */ 555 551 #ifdef CONFIG_SPE 556 - EXCEPTION(0x2030, SPEFloatingPointData, SPEFloatingPointException, EXC_XFER_EE); 552 + EXCEPTION(0x2030, SPE_FP_DATA, SPEFloatingPointData, \ 553 + SPEFloatingPointException, EXC_XFER_EE); 557 554 558 555 /* SPE Floating Point Round */ 559 - EXCEPTION(0x2050, SPEFloatingPointRound, SPEFloatingPointRoundException, EXC_XFER_EE) 556 + EXCEPTION(0x2050, SPE_FP_ROUND, SPEFloatingPointRound, \ 557 + SPEFloatingPointRoundException, EXC_XFER_EE) 560 558 #else 561 - EXCEPTION(0x2040, SPEFloatingPointData, unknown_exception, EXC_XFER_EE) 562 - EXCEPTION(0x2050, SPEFloatingPointRound, unknown_exception, EXC_XFER_EE) 559 + EXCEPTION(0x2040, SPE_FP_DATA, SPEFloatingPointData, \ 560 + unknown_exception, EXC_XFER_EE) 561 + EXCEPTION(0x2050, SPE_FP_ROUND, SPEFloatingPointRound, \ 562 + unknown_exception, EXC_XFER_EE) 563 563 #endif /* CONFIG_SPE */ 564 564 565 565 /* Performance Monitor */ 566 - EXCEPTION(0x2060, PerformanceMonitor, performance_monitor_exception, EXC_XFER_STD) 566 + EXCEPTION(0x2060, PERFORMANCE_MONITOR, PerformanceMonitor, \ 567 + performance_monitor_exception, EXC_XFER_STD) 567 568 568 - EXCEPTION(0x2070, Doorbell, doorbell_exception, EXC_XFER_STD) 569 + EXCEPTION(0x2070, DOORBELL, Doorbell, doorbell_exception, EXC_XFER_STD) 569 570 570 - CRITICAL_EXCEPTION(0x2080, CriticalDoorbell, unknown_exception) 571 + CRITICAL_EXCEPTION(0x2080, DOORBELL_CRITICAL, \ 572 + CriticalDoorbell, unknown_exception) 571 573 572 574 /* Debug Interrupt */ 573 575 DEBUG_DEBUG_EXCEPTION