From patchwork Fri Mar 27 05:11:39 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Herrenschmidt X-Patchwork-Id: 455302 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 0E4331400B7 for ; Fri, 27 Mar 2015 16:11:55 +1100 (AEDT) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id E5FD81A050C for ; Fri, 27 Mar 2015 16:11:54 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Received: from gate.crashing.org (gate.crashing.org [63.228.1.57]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 671FF1A005A for ; Fri, 27 Mar 2015 16:11:45 +1100 (AEDT) Received: from localhost (localhost.localdomain [127.0.0.1]) by gate.crashing.org (8.14.1/8.13.8) with ESMTP id t2R5BeEx029691 for ; Fri, 27 Mar 2015 00:11:41 -0500 Message-ID: <1427433099.6468.164.camel@kernel.crashing.org> From: Benjamin Herrenschmidt To: skiboot@lists.ozlabs.org Date: Fri, 27 Mar 2015 16:11:39 +1100 X-Mailer: Evolution 3.12.10-0ubuntu1~14.10.1 Mime-Version: 1.0 Subject: [Skiboot] [PATCH 1/2] exceptions: Remove deprecated exception patching stuff X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Linux no longer calls it, it never worked on LE and generally speaking never really did anything useful anyway. Signed-off-by: Benjamin Herrenschmidt --- asm/head.S | 125 ------------------------- core/exceptions.c | 268 +++--------------------------------------------------- 2 files changed, 14 insertions(+), 379 deletions(-) diff --git a/asm/head.S b/asm/head.S index d368236..740adbf 100644 --- a/asm/head.S +++ b/asm/head.S @@ -871,128 +871,3 @@ start_kernel_secondary: mtctr %r3 mfspr %r3,SPR_PIR bctr - - .global exc_primary_start -exc_primary_start: - mtspr SPR_HSPRG1,%r1 - mfspr %r1,SPR_CFAR -0: b . - .global exc_primary_end -exc_primary_end: - - .global exc_primary_patch_branch -exc_primary_patch_branch: - .long 0b - exc_primary_start - - .global exc_secondary_start -exc_secondary_start: - mtspr SPR_CFAR,%r1 - mfspr %r1,SPR_PIR -0: GET_STACK(%r1,%r1) - stdu %r1,-STACK_FRAMESIZE(%r1) - std %r3,STACK_GPR3(%r1) - mfspr %r3,SPR_HSPRG1 - std %r3,STACK_GPR1(%r1) - mfspr %r3,SPR_CFAR - std %r3,STACK_CFAR(%r1) -1: mfspr %r3,SPR_SRR0 - std %r3,STACK_SRR0(%r1) -2: mfspr %r3,SPR_SRR1 - std %r3,STACK_SRR1(%r1) - mflr %r3 - std %r3,STACK_LR(%r1) - LOAD_IMM32(%r3,exception_entry_common - __head); - addis %r3,%r3,SKIBOOT_BASE@h - mtlr %r3 -3: li %r3,0 - blrl /* XXX Use a BH=01 variant to avoid link stack problems */ - ld %r3,STACK_LR(%r1) - mtlr %r3 - ld %r3,STACK_SRR0(%r1) -4: mtspr SPR_SRR0,%r3 - ld %r3,STACK_SRR1(%r1) -5: mtspr SPR_SRR1,%r3 - ld %r3,STACK_GPR3(%r1) - ld %r1,STACK_GPR1(%r1) -6: rfid - .global exc_secondary_end -exc_secondary_end: - - .global exc_secondary_patch_stack -exc_secondary_patch_stack: - .long 0b - exc_secondary_start - .global exc_secondary_patch_mfsrr0 -exc_secondary_patch_mfsrr0: - .long 1b - exc_secondary_start - .global exc_secondary_patch_mfsrr1 -exc_secondary_patch_mfsrr1: - .long 2b - exc_secondary_start - .global exc_secondary_patch_type -exc_secondary_patch_type: - .long 3b - exc_secondary_start - .global exc_secondary_patch_mtsrr0 -exc_secondary_patch_mtsrr0: - .long 4b - exc_secondary_start - .global exc_secondary_patch_mtsrr1 -exc_secondary_patch_mtsrr1: - .long 5b - exc_secondary_start - .global exc_secondary_patch_rfid -exc_secondary_patch_rfid: - .long 6b - exc_secondary_start - - /* The rest of the exception entry code */ -exception_entry_common: - std %r3,STACK_TYPE(%r1) - - /* We save the exception return LR in the stack-locals area */ - mflr %r3 - std %r3,STACK_LOCALS(%r1) - - /* Save more stuff */ - std %r0,STACK_GPR0(%r1) - std %r2,STACK_GPR2(%r1) - std %r4,STACK_GPR4(%r1) - std %r5,STACK_GPR5(%r1) - std %r6,STACK_GPR6(%r1) - std %r7,STACK_GPR7(%r1) - std %r8,STACK_GPR8(%r1) - std %r9,STACK_GPR9(%r1) - std %r10,STACK_GPR10(%r1) - std %r11,STACK_GPR11(%r1) - std %r12,STACK_GPR12(%r1) - std %r13,STACK_GPR13(%r1) - mfcr %r3 - stw %r3,STACK_CR(%r1) - mfctr %r3 - std %r3,STACK_CTR(%r1) - - GET_CPU() - - LOAD_IMM64(%r2, SKIBOOT_BASE) - addis %r2,%r2,(__toc_start - __head)@ha - addi %r2,%r2,(__toc_start - __head)@l - - mr %r3,%r1 - bl exception_entry - - ld %r3,STACK_CTR(%r1) - lwz %r4,STACK_CR(%r1) - mtctr %r3 - mtcr %r4 - - ld %r0,STACK_GPR0(%r1) - ld %r2,STACK_GPR2(%r1) - ld %r4,STACK_GPR4(%r1) - ld %r5,STACK_GPR5(%r1) - ld %r6,STACK_GPR6(%r1) - ld %r7,STACK_GPR7(%r1) - ld %r8,STACK_GPR8(%r1) - ld %r9,STACK_GPR9(%r1) - ld %r10,STACK_GPR10(%r1) - ld %r11,STACK_GPR11(%r1) - ld %r12,STACK_GPR12(%r1) - ld %r13,STACK_GPR13(%r1) - - ld %r3,STACK_LOCALS(%r1) - mtlr %r3 - blr diff --git a/core/exceptions.c b/core/exceptions.c index 552123a..83efa36 100644 --- a/core/exceptions.c +++ b/core/exceptions.c @@ -21,48 +21,16 @@ #include #include -extern uint8_t exc_primary_start; -extern uint8_t exc_primary_end; - -extern uint32_t exc_primary_patch_branch; - -extern uint8_t exc_secondary_start; -extern uint8_t exc_secondary_end; - -extern uint32_t exc_secondary_patch_stack; -extern uint32_t exc_secondary_patch_mfsrr0; -extern uint32_t exc_secondary_patch_mfsrr1; -extern uint32_t exc_secondary_patch_type; -extern uint32_t exc_secondary_patch_mtsrr0; -extern uint32_t exc_secondary_patch_mtsrr1; -extern uint32_t exc_secondary_patch_rfid; - -static struct lock hmi_lock = LOCK_UNLOCKED; - #define REG "%016llx" #define REGS_PER_LINE 4 -#define LAST_VOLATILE 13 -static void dump_regs(struct stack_frame *stack, uint64_t hmer) +static void dump_regs(struct stack_frame *stack) { - int i; - uint64_t tfmr; + unsigned int i; - if (hmer & SPR_HMER_MALFUNCTION_ALERT) - printf("HMI: malfunction Alert\n"); - if (hmer & SPR_HMER_HYP_RESOURCE_ERR) - printf("HMI: Hypervisor resource error.\n"); - if (hmer & SPR_HMER_TFAC_ERROR) { - tfmr = mfspr(SPR_TFMR); - printf("HMI: TFAC error: SPRN_TFMR = 0x%016llx\n", tfmr); - } - if (hmer & SPR_HMER_TFMR_PARITY_ERROR) { - tfmr = mfspr(SPR_TFMR); - printf("HMI: TFMR parity error: SPRN_TFMR = 0x%016llx\n", tfmr); - } - printf("TRAP: %04llx\n", stack->type); - printf("SRR0: "REG" SRR1: "REG"\n", stack->srr0, stack->srr1); - printf("CFAR: "REG" LR: "REG" CTR: "REG"\n", + printf("SRR0 : "REG" SRR1 : "REG"\n", stack->srr0, stack->srr1); + printf("HSRR0: "REG" HSRR1: "REG"\n", stack->srr0, stack->srr1); + printf("CFAR : "REG" LR : "REG" CTR: "REG"\n", stack->cfar, stack->lr, stack->ctr); printf(" CR: %08x XER: %08x\n", stack->cr, stack->xer); @@ -70,235 +38,27 @@ static void dump_regs(struct stack_frame *stack, uint64_t hmer) if ((i % REGS_PER_LINE) == 0) printf("\nGPR%02d: ", i); printf(REG " ", stack->gpr[i]); - if (i == LAST_VOLATILE) - break; } printf("\n"); } -/* - * HMER register layout: - * +===+==========+============================+========+===================+ - * |Bit|Name |Description |PowerKVM|Action | - * | | | |HMI | | - * | | | |enabled | | - * | | | |for this| | - * | | | |bit ? | | - * +===+==========+============================+========+===================+ - * |0 |malfunctio|A processor core in the |Yes |Raise attn from | - * | |n_allert |system has checkstopped | |sapphire resulting | - * | | |(failed recovery) and has | |xstop | - * | | |requested a CP Sparing | | | - * | | |to occur. This is | | | - * | | |broadcasted to every | | | - * | | |processor in the system | | | - * |---+----------+----------------------------+--------+-------------------| - * |1 |Reserved |reserved |n/a | | - * |---+----------+----------------------------+--------+-------------------| - * |2 |proc_recv_|Processor recovery occurred |Yes |Log message and | - * | |done |error-bit in fir not masked | |continue working. | - * | | |(see bit 11) | | | - * |---+----------+----------------------------+--------+-------------------| - * |3 |proc_recv_|Processor went through |Yes |Log message and | - * | |error_mask|recovery for an error which | |continue working. | - * | |ed |is actually masked for | | | - * | | |reporting | | | - * |---+----------+----------------------------+--------+-------------------| - * |4 | |Timer facility experienced |Yes |Raise attn from | - * | |tfac_error|an error. | |sapphire resulting | - * | | |TB, DEC, HDEC, PURR or SPURR| |xstop | - * | | |may be corrupted (details in| | | - * | | |TFMR) | | | - * |---+----------+----------------------------+--------+-------------------| - * |5 | |TFMR SPR itself is |Yes |Raise attn from | - * | |tfmr_parit|corrupted. | |sapphire resulting | - * | |y_error |Entire timing facility may | |xstop | - * | | |be compromised. | | | - * |---+----------+----------------------------+--------+-------------------| - * |6 |ha_overflo| UPS (Uniterrupted Power |No |N/A | - * | |w_warning |System) Overflow indication | | | - * | | |indicating that the UPS | | | - * | | |DirtyAddrTable has | | | - * | | |reached a limit where it | | | - * | | |requires PHYP unload support| | | - * |---+----------+----------------------------+--------+-------------------| - * |7 |reserved |reserved |n/a |n/a | - * |---+----------+----------------------------+--------+-------------------| - * |8 |xscom_fail|An XSCOM operation caused by|No |We handle it by | - * | | |a cache inhibited load/store| |manually reading | - * | | |from this thread failed. A | |HMER register. | - * | | |trap register is | | | - * | | |available. | | | - * | | | | | | - * |---+----------+----------------------------+--------+-------------------| - * |9 |xscom_done|An XSCOM operation caused by|No |We handle it by | - * | | |a cache inhibited load/store| |manually reading | - * | | |from this thread completed. | |HMER register. | - * | | |If hypervisor | | | - * | | |intends to use this bit, it | | | - * | | |is responsible for clearing | | | - * | | |it before performing the | | | - * | | |xscom operation. | | | - * | | |NOTE: this bit should always| | | - * | | |be masked in HMEER | | | - * |---+----------+----------------------------+--------+-------------------| - * |10 |reserved |reserved |n/a |n/a | - * |---+----------+----------------------------+--------+-------------------| - * |11 |proc_recv_|Processor recovery occurred |y |Log message and | - * | |again |again before bit2 or bit3 | |continue working. | - * | | |was cleared | | | - * |---+----------+----------------------------+--------+-------------------| - * |12-|reserved |was temperature sensor |n/a |n/a | - * |15 | |passed the critical point on| | | - * | | |the way up | | | - * |---+----------+----------------------------+--------+-------------------| - * |16 | |SCOM has set a reserved FIR |No |n/a | - * | |scom_fir_h|bit to cause recovery | | | - * | |m | | | | - * |---+----------+----------------------------+--------+-------------------| - * |17 |trig_fir_h|Debug trigger has set a |No |n/a | - * | |mi |reserved FIR bit to cause | | | - * | | |recovery | | | - * |---+----------+----------------------------+--------+-------------------| - * |18 |reserved |reserved |n/a |n/a | - * |---+----------+----------------------------+--------+-------------------| - * |19 |reserved |reserved |n/a |n/a | - * |---+----------+----------------------------+--------+-------------------| - * |20 |hyp_resour|A hypervisor resource error |y |Raise attn from | - * | |ce_err |occurred: data parity error | |sapphire resulting | - * | | |on, SPRC0:3; SPR_Modereg or | |xstop. | - * | | |HMEER. | | | - * | | |Note: this bit will cause an| | | - * | | |check_stop when (HV=1, PR=0 | | | - * | | |and EE=0) | | | - * |---+----------+----------------------------+--------+-------------------| - * |21-| |if bit 8 is active, the |No |We handle it by | - * |23 |xscom_stat|reason will be detailed in | |Manually reading | - * | |us |these bits. see chapter 11.1| |HMER register. | - * | | |This bits are information | | | - * | | |only and always masked | | | - * | | |(mask = '0') | | | - * | | |If hypervisor intends to use| | | - * | | |this bit, it is responsible | | | - * | | |for clearing it before | | | - * | | |performing the xscom | | | - * | | |operation. | | | - * |---+----------+----------------------------+--------+-------------------| - * |24-|Not |Not implemented |n/a |n/a | - * |63 |implemente| | | | - * | |d | | | | - * +-- +----------+----------------------------+--------+-------------------+ - * - * Above HMER bits can be enabled/disabled by modifying - * SPR_HMEER_HMI_ENABLE_MASK #define in include/processor.h - * If you modify support for any of the bits listed above, please make sure - * you change the above table to refelct that. - * - * NOTE: Per Dave Larson, never enable 8,9,21-23 - */ - -/* make compiler happy with a prototype */ -void handle_hmi(struct stack_frame *stack); - -void handle_hmi(struct stack_frame *stack) -{ - uint64_t orig_hmer; - int recover; - - orig_hmer = mfspr(SPR_HMER); - recover = handle_hmi_exception(orig_hmer, NULL); - if (recover) - return; - - /* - * Raise attn to crash. - * - * We get HMI on all threads at the same time. Using locks to avoid - * printf messages jumbled up. - */ - lock(&hmi_lock); - dump_regs(stack, orig_hmer); - /* Should we unlock? We are going down anyway. */ - unlock(&hmi_lock); - assert(false); -} - /* Called from head.S, thus no prototype */ -void exception_entry(struct stack_frame *stack); +void exception_entry(struct stack_frame *stack) __noreturn; void exception_entry(struct stack_frame *stack) { - switch(stack->type) { - case STACK_ENTRY_HMI: - handle_hmi(stack); - /* XXX TODO : Implement machine check */ - break; - case STACK_ENTRY_SOFTPATCH: - /* XXX TODO : Implement softpatch ? */ - break; - } + prerror("Unexpected exception %llx !\n", stack->type); + dump_regs(stack); + backtrace(); + _abort(); } -static int64_t patch_exception(uint64_t vector, uint64_t glue, bool hv) -{ - uint64_t iaddr; - - /* Copy over primary exception handler */ - memcpy((void *)vector, &exc_primary_start, - &exc_primary_end - &exc_primary_start); - - /* Patch branch instruction in primary handler */ - iaddr = vector + exc_primary_patch_branch; - *(uint32_t *)iaddr |= (glue - iaddr) & 0x03fffffc; - - /* Copy over secondary exception handler */ - memcpy((void *)glue, &exc_secondary_start, - &exc_secondary_end - &exc_secondary_start); - - /* Patch-in the vector number */ - *(uint32_t *)(glue + exc_secondary_patch_type) |= vector; - - BUILD_ASSERT(STACK_SIZE < 0x8000); - BUILD_ASSERT(!(CPU_STACKS_BASE & 0xffff)); - - /* Standard exception ? All done */ - if (!hv) - goto flush; - - /* HV exception, change the SRR's to HSRRs and rfid to hrfid - * - * The magic is that mfspr/mtspr of SRR can be turned into the - * equivalent HSRR version by OR'ing 0x4800. For rfid to hrfid - * we OR 0x200. - */ - *(uint32_t *)(glue + exc_secondary_patch_mfsrr0) |= 0x4800; - *(uint32_t *)(glue + exc_secondary_patch_mfsrr1) |= 0x4800; - *(uint32_t *)(glue + exc_secondary_patch_mtsrr0) |= 0x4800; - *(uint32_t *)(glue + exc_secondary_patch_mtsrr1) |= 0x4800; - *(uint32_t *)(glue + exc_secondary_patch_rfid) |= 0x200; - - flush: - /* On P7 and later all we need is : */ - sync_icache(); - - return OPAL_SUCCESS; -} - -static int64_t opal_register_exc_handler(uint64_t opal_exception, +static int64_t opal_register_exc_handler(uint64_t opal_exception __unused, uint64_t handler_address __unused, - uint64_t glue_cache_line) + uint64_t glue_cache_line __unused) { - switch(opal_exception) { - case OPAL_HYPERVISOR_MAINTENANCE_HANDLER: - return patch_exception(0xe60, glue_cache_line, true); -#if 0 /* We let Linux handle softpatch */ - case OPAL_SOFTPATCH_HANDLER: - return patch_exception(0x1500, glue_cache_line, true); -#endif - default: - break; - } - return OPAL_PARAMETER; + /* This interface is deprecated */ + return OPAL_UNSUPPORTED; } opal_call(OPAL_REGISTER_OPAL_EXCEPTION_HANDLER, opal_register_exc_handler, 3);