12874c5fdSThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-or-later */ 29994a338SPaul Mackerras/* 39994a338SPaul Mackerras * This file contains miscellaneous low-level functions. 49994a338SPaul Mackerras * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) 59994a338SPaul Mackerras * 69994a338SPaul Mackerras * Largely rewritten by Cort Dougan (cort@cs.nmt.edu) 79994a338SPaul Mackerras * and Paul Mackerras. 89994a338SPaul Mackerras * 99994a338SPaul Mackerras */ 109994a338SPaul Mackerras 11*39326182SMasahiro Yamada#include <linux/export.h> 129994a338SPaul Mackerras#include <linux/sys.h> 139994a338SPaul Mackerras#include <asm/unistd.h> 149994a338SPaul Mackerras#include <asm/errno.h> 159994a338SPaul Mackerras#include <asm/reg.h> 169994a338SPaul Mackerras#include <asm/page.h> 179994a338SPaul Mackerras#include <asm/cache.h> 189994a338SPaul Mackerras#include <asm/cputable.h> 199994a338SPaul Mackerras#include <asm/mmu.h> 209994a338SPaul Mackerras#include <asm/ppc_asm.h> 219994a338SPaul Mackerras#include <asm/thread_info.h> 229994a338SPaul Mackerras#include <asm/asm-offsets.h> 233d1229d6SMichael Ellerman#include <asm/processor.h> 24f048aaceSBenjamin Herrenschmidt#include <asm/bug.h> 2546f52210SStephen Rothwell#include <asm/ptrace.h> 262c86cd18SChristophe Leroy#include <asm/feature-fixups.h> 279994a338SPaul Mackerras 289994a338SPaul Mackerras .text 299994a338SPaul Mackerras 309994a338SPaul Mackerras/* 31f2783c15SPaul Mackerras * This returns the high 64 bits of the product of two 64-bit numbers. 32f2783c15SPaul Mackerras */ 33f2783c15SPaul Mackerras_GLOBAL(mulhdu) 34f2783c15SPaul Mackerras cmpwi r6,0 35f2783c15SPaul Mackerras cmpwi cr1,r3,0 36f2783c15SPaul Mackerras mr r10,r4 37f2783c15SPaul Mackerras mulhwu r4,r4,r5 38f2783c15SPaul Mackerras beq 1f 39f2783c15SPaul Mackerras mulhwu r0,r10,r6 40f2783c15SPaul Mackerras mullw r7,r10,r5 41f2783c15SPaul Mackerras addc r7,r0,r7 42f2783c15SPaul Mackerras addze r4,r4 43f2783c15SPaul Mackerras1: beqlr cr1 /* all done if high part of A is 0 */ 44f2783c15SPaul Mackerras mullw r9,r3,r5 45737b01fcSChristophe Leroy mulhwu r10,r3,r5 46f2783c15SPaul Mackerras beq 2f 47737b01fcSChristophe Leroy mullw r0,r3,r6 48737b01fcSChristophe Leroy mulhwu r8,r3,r6 49f2783c15SPaul Mackerras addc r7,r0,r7 50f2783c15SPaul Mackerras adde r4,r4,r8 51737b01fcSChristophe Leroy addze r10,r10 52f2783c15SPaul Mackerras2: addc r4,r4,r9 53737b01fcSChristophe Leroy addze r3,r10 54f2783c15SPaul Mackerras blr 55f2783c15SPaul Mackerras 56f2783c15SPaul Mackerras/* 579994a338SPaul Mackerras * reloc_got2 runs through the .got2 section adding an offset 589994a338SPaul Mackerras * to each entry. 599994a338SPaul Mackerras */ 609994a338SPaul Mackerras_GLOBAL(reloc_got2) 619994a338SPaul Mackerras mflr r11 629994a338SPaul Mackerras lis r7,__got2_start@ha 639994a338SPaul Mackerras addi r7,r7,__got2_start@l 649994a338SPaul Mackerras lis r8,__got2_end@ha 659994a338SPaul Mackerras addi r8,r8,__got2_end@l 669994a338SPaul Mackerras subf r8,r7,r8 679994a338SPaul Mackerras srwi. r8,r8,2 689994a338SPaul Mackerras beqlr 699994a338SPaul Mackerras mtctr r8 7033e14024SChristophe Leroy bcl 20,31,$+4 719994a338SPaul Mackerras1: mflr r0 729994a338SPaul Mackerras lis r4,1b@ha 739994a338SPaul Mackerras addi r4,r4,1b@l 749994a338SPaul Mackerras subf r0,r4,r0 759994a338SPaul Mackerras add r7,r0,r7 769994a338SPaul Mackerras2: lwz r0,0(r7) 779994a338SPaul Mackerras add r0,r0,r3 789994a338SPaul Mackerras stw r0,0(r7) 799994a338SPaul Mackerras addi r7,r7,4 809994a338SPaul Mackerras bdnz 2b 819994a338SPaul Mackerras mtlr r11 829994a338SPaul Mackerras blr 839994a338SPaul Mackerras 849994a338SPaul Mackerras/* 859994a338SPaul Mackerras * call_setup_cpu - call the setup_cpu function for this cpu 869994a338SPaul Mackerras * r3 = data offset, r24 = cpu number 879994a338SPaul Mackerras * 889994a338SPaul Mackerras * Setup function is called with: 899994a338SPaul Mackerras * r3 = data offset 909994a338SPaul Mackerras * r4 = ptr to CPU spec (relocated) 919994a338SPaul Mackerras */ 929994a338SPaul Mackerras_GLOBAL(call_setup_cpu) 939994a338SPaul Mackerras addis r4,r3,cur_cpu_spec@ha 949994a338SPaul Mackerras addi r4,r4,cur_cpu_spec@l 959994a338SPaul Mackerras lwz r4,0(r4) 969994a338SPaul Mackerras add r4,r4,r3 979994a338SPaul Mackerras lwz r5,CPU_SPEC_SETUP(r4) 98b26f100dSGeoff Levand cmpwi 0,r5,0 999994a338SPaul Mackerras add r5,r5,r3 1009994a338SPaul Mackerras beqlr 1019994a338SPaul Mackerras mtctr r5 1029994a338SPaul Mackerras bctr 1039994a338SPaul Mackerras 104d7cceda9SChristophe Leroy#if defined(CONFIG_CPU_FREQ_PMAC) && defined(CONFIG_PPC_BOOK3S_32) 1059994a338SPaul Mackerras 1069994a338SPaul Mackerras/* This gets called by via-pmu.c to switch the PLL selection 1079994a338SPaul Mackerras * on 750fx CPU. This function should really be moved to some 1089994a338SPaul Mackerras * other place (as most of the cpufreq code in via-pmu 1099994a338SPaul Mackerras */ 1109994a338SPaul Mackerras_GLOBAL(low_choose_750fx_pll) 1119994a338SPaul Mackerras /* Clear MSR:EE */ 1129994a338SPaul Mackerras mfmsr r7 1139994a338SPaul Mackerras rlwinm r0,r7,0,17,15 1149994a338SPaul Mackerras mtmsr r0 1159994a338SPaul Mackerras 1169994a338SPaul Mackerras /* If switching to PLL1, disable HID0:BTIC */ 1179994a338SPaul Mackerras cmplwi cr0,r3,0 1189994a338SPaul Mackerras beq 1f 1199994a338SPaul Mackerras mfspr r5,SPRN_HID0 1209994a338SPaul Mackerras rlwinm r5,r5,0,27,25 1219994a338SPaul Mackerras sync 1229994a338SPaul Mackerras mtspr SPRN_HID0,r5 1239994a338SPaul Mackerras isync 1249994a338SPaul Mackerras sync 1259994a338SPaul Mackerras 1269994a338SPaul Mackerras1: 1279994a338SPaul Mackerras /* Calc new HID1 value */ 1289994a338SPaul Mackerras mfspr r4,SPRN_HID1 /* Build a HID1:PS bit from parameter */ 1299994a338SPaul Mackerras rlwinm r5,r3,16,15,15 /* Clear out HID1:PS from value read */ 1309994a338SPaul Mackerras rlwinm r4,r4,0,16,14 /* Could have I used rlwimi here ? */ 1319994a338SPaul Mackerras or r4,r4,r5 1329994a338SPaul Mackerras mtspr SPRN_HID1,r4 1339994a338SPaul Mackerras 13405486089SChristophe Leroy#ifdef CONFIG_SMP 1359994a338SPaul Mackerras /* Store new HID1 image */ 136f7354ccaSChristophe Leroy lwz r6,TASK_CPU(r2) 1379994a338SPaul Mackerras slwi r6,r6,2 13805486089SChristophe Leroy#else 13905486089SChristophe Leroy li r6, 0 14005486089SChristophe Leroy#endif 1419994a338SPaul Mackerras addis r6,r6,nap_save_hid1@ha 1429994a338SPaul Mackerras stw r4,nap_save_hid1@l(r6) 1439994a338SPaul Mackerras 1449994a338SPaul Mackerras /* If switching to PLL0, enable HID0:BTIC */ 1459994a338SPaul Mackerras cmplwi cr0,r3,0 1469994a338SPaul Mackerras bne 1f 1479994a338SPaul Mackerras mfspr r5,SPRN_HID0 1489994a338SPaul Mackerras ori r5,r5,HID0_BTIC 1499994a338SPaul Mackerras sync 1509994a338SPaul Mackerras mtspr SPRN_HID0,r5 1519994a338SPaul Mackerras isync 1529994a338SPaul Mackerras sync 1539994a338SPaul Mackerras 1549994a338SPaul Mackerras1: 1559994a338SPaul Mackerras /* Return */ 1569994a338SPaul Mackerras mtmsr r7 1579994a338SPaul Mackerras blr 1589994a338SPaul Mackerras 1599994a338SPaul Mackerras_GLOBAL(low_choose_7447a_dfs) 1609994a338SPaul Mackerras /* Clear MSR:EE */ 1619994a338SPaul Mackerras mfmsr r7 1629994a338SPaul Mackerras rlwinm r0,r7,0,17,15 1639994a338SPaul Mackerras mtmsr r0 1649994a338SPaul Mackerras 1659994a338SPaul Mackerras /* Calc new HID1 value */ 1669994a338SPaul Mackerras mfspr r4,SPRN_HID1 1679994a338SPaul Mackerras insrwi r4,r3,1,9 /* insert parameter into bit 9 */ 1689994a338SPaul Mackerras sync 1699994a338SPaul Mackerras mtspr SPRN_HID1,r4 1709994a338SPaul Mackerras sync 1719994a338SPaul Mackerras isync 1729994a338SPaul Mackerras 1739994a338SPaul Mackerras /* Return */ 1749994a338SPaul Mackerras mtmsr r7 1759994a338SPaul Mackerras blr 1769994a338SPaul Mackerras 177d7cceda9SChristophe Leroy#endif /* CONFIG_CPU_FREQ_PMAC && CONFIG_PPC_BOOK3S_32 */ 1789994a338SPaul Mackerras 1799dae8afdSBenjamin Herrenschmidt#ifdef CONFIG_40x 1809dae8afdSBenjamin Herrenschmidt 1819dae8afdSBenjamin Herrenschmidt/* 1829dae8afdSBenjamin Herrenschmidt * Do an IO access in real mode 1839dae8afdSBenjamin Herrenschmidt */ 1849dae8afdSBenjamin Herrenschmidt_GLOBAL(real_readb) 1859dae8afdSBenjamin Herrenschmidt mfmsr r7 186362957c2SChristophe Leroy rlwinm r0,r7,0,~MSR_DR 1879dae8afdSBenjamin Herrenschmidt sync 1889dae8afdSBenjamin Herrenschmidt mtmsr r0 1899dae8afdSBenjamin Herrenschmidt sync 1909dae8afdSBenjamin Herrenschmidt isync 1919dae8afdSBenjamin Herrenschmidt lbz r3,0(r3) 1929dae8afdSBenjamin Herrenschmidt sync 1939dae8afdSBenjamin Herrenschmidt mtmsr r7 1949dae8afdSBenjamin Herrenschmidt sync 1959dae8afdSBenjamin Herrenschmidt isync 1969dae8afdSBenjamin Herrenschmidt blr 1975f32e836SChristophe Leroy_ASM_NOKPROBE_SYMBOL(real_readb) 1989dae8afdSBenjamin Herrenschmidt 1999dae8afdSBenjamin Herrenschmidt /* 2009dae8afdSBenjamin Herrenschmidt * Do an IO access in real mode 2019dae8afdSBenjamin Herrenschmidt */ 2029dae8afdSBenjamin Herrenschmidt_GLOBAL(real_writeb) 2039dae8afdSBenjamin Herrenschmidt mfmsr r7 204362957c2SChristophe Leroy rlwinm r0,r7,0,~MSR_DR 2059dae8afdSBenjamin Herrenschmidt sync 2069dae8afdSBenjamin Herrenschmidt mtmsr r0 2079dae8afdSBenjamin Herrenschmidt sync 2089dae8afdSBenjamin Herrenschmidt isync 2099dae8afdSBenjamin Herrenschmidt stb r3,0(r4) 2109dae8afdSBenjamin Herrenschmidt sync 2119dae8afdSBenjamin Herrenschmidt mtmsr r7 2129dae8afdSBenjamin Herrenschmidt sync 2139dae8afdSBenjamin Herrenschmidt isync 2149dae8afdSBenjamin Herrenschmidt blr 2155f32e836SChristophe Leroy_ASM_NOKPROBE_SYMBOL(real_writeb) 2169dae8afdSBenjamin Herrenschmidt 2179dae8afdSBenjamin Herrenschmidt#endif /* CONFIG_40x */ 2189994a338SPaul Mackerras 2199994a338SPaul Mackerras/* 2209994a338SPaul Mackerras * Copy a whole page. We use the dcbz instruction on the destination 2219994a338SPaul Mackerras * to reduce memory traffic (it eliminates the unnecessary reads of 2229994a338SPaul Mackerras * the destination into cache). This requires that the destination 2239994a338SPaul Mackerras * is cacheable. 2249994a338SPaul Mackerras */ 2259994a338SPaul Mackerras#define COPY_16_BYTES \ 2269994a338SPaul Mackerras lwz r6,4(r4); \ 2279994a338SPaul Mackerras lwz r7,8(r4); \ 2289994a338SPaul Mackerras lwz r8,12(r4); \ 2299994a338SPaul Mackerras lwzu r9,16(r4); \ 2309994a338SPaul Mackerras stw r6,4(r3); \ 2319994a338SPaul Mackerras stw r7,8(r3); \ 2329994a338SPaul Mackerras stw r8,12(r3); \ 2339994a338SPaul Mackerras stwu r9,16(r3) 2349994a338SPaul Mackerras 2359994a338SPaul Mackerras_GLOBAL(copy_page) 2367ab0b7cbSChristophe Leroy rlwinm r5, r3, 0, L1_CACHE_BYTES - 1 2379994a338SPaul Mackerras addi r3,r3,-4 2387ab0b7cbSChristophe Leroy 2397ab0b7cbSChristophe Leroy0: twnei r5, 0 /* WARN if r3 is not cache aligned */ 2401e688dd2SChristophe Leroy EMIT_WARN_ENTRY 0b,__FILE__,__LINE__, BUGFLAG_WARNING 2417ab0b7cbSChristophe Leroy 2429994a338SPaul Mackerras addi r4,r4,-4 2439994a338SPaul Mackerras 2449994a338SPaul Mackerras li r5,4 2459994a338SPaul Mackerras 2469994a338SPaul Mackerras#if MAX_COPY_PREFETCH > 1 2479994a338SPaul Mackerras li r0,MAX_COPY_PREFETCH 2489994a338SPaul Mackerras li r11,4 2499994a338SPaul Mackerras mtctr r0 2509994a338SPaul Mackerras11: dcbt r11,r4 2517dffb720SStephen Rothwell addi r11,r11,L1_CACHE_BYTES 2529994a338SPaul Mackerras bdnz 11b 2539994a338SPaul Mackerras#else /* MAX_COPY_PREFETCH == 1 */ 2549994a338SPaul Mackerras dcbt r5,r4 2557dffb720SStephen Rothwell li r11,L1_CACHE_BYTES+4 2569994a338SPaul Mackerras#endif /* MAX_COPY_PREFETCH */ 257ca9153a3SIlya Yanok li r0,PAGE_SIZE/L1_CACHE_BYTES - MAX_COPY_PREFETCH 2589994a338SPaul Mackerras crclr 4*cr0+eq 2599994a338SPaul Mackerras2: 2609994a338SPaul Mackerras mtctr r0 2619994a338SPaul Mackerras1: 2629994a338SPaul Mackerras dcbt r11,r4 2639994a338SPaul Mackerras dcbz r5,r3 2649994a338SPaul Mackerras COPY_16_BYTES 2657dffb720SStephen Rothwell#if L1_CACHE_BYTES >= 32 2669994a338SPaul Mackerras COPY_16_BYTES 2677dffb720SStephen Rothwell#if L1_CACHE_BYTES >= 64 2689994a338SPaul Mackerras COPY_16_BYTES 2699994a338SPaul Mackerras COPY_16_BYTES 2707dffb720SStephen Rothwell#if L1_CACHE_BYTES >= 128 2719994a338SPaul Mackerras COPY_16_BYTES 2729994a338SPaul Mackerras COPY_16_BYTES 2739994a338SPaul Mackerras COPY_16_BYTES 2749994a338SPaul Mackerras COPY_16_BYTES 2759994a338SPaul Mackerras#endif 2769994a338SPaul Mackerras#endif 2779994a338SPaul Mackerras#endif 2789994a338SPaul Mackerras bdnz 1b 2799994a338SPaul Mackerras beqlr 2809994a338SPaul Mackerras crnot 4*cr0+eq,4*cr0+eq 2819994a338SPaul Mackerras li r0,MAX_COPY_PREFETCH 2829994a338SPaul Mackerras li r11,4 2839994a338SPaul Mackerras b 2b 2849445aa1aSAl ViroEXPORT_SYMBOL(copy_page) 2859994a338SPaul Mackerras 2869994a338SPaul Mackerras/* 2879994a338SPaul Mackerras * Extended precision shifts. 2889994a338SPaul Mackerras * 2899994a338SPaul Mackerras * Updated to be valid for shift counts from 0 to 63 inclusive. 2909994a338SPaul Mackerras * -- Gabriel 2919994a338SPaul Mackerras * 2929994a338SPaul Mackerras * R3/R4 has 64 bit value 2939994a338SPaul Mackerras * R5 has shift count 2949994a338SPaul Mackerras * result in R3/R4 2959994a338SPaul Mackerras * 2969994a338SPaul Mackerras * ashrdi3: arithmetic right shift (sign propagation) 2979994a338SPaul Mackerras * lshrdi3: logical right shift 2989994a338SPaul Mackerras * ashldi3: left shift 2999994a338SPaul Mackerras */ 3009994a338SPaul Mackerras_GLOBAL(__ashrdi3) 3019994a338SPaul Mackerras subfic r6,r5,32 3029994a338SPaul Mackerras srw r4,r4,r5 # LSW = count > 31 ? 0 : LSW >> count 3039994a338SPaul Mackerras addi r7,r5,32 # could be xori, or addi with -32 3049994a338SPaul Mackerras slw r6,r3,r6 # t1 = count > 31 ? 0 : MSW << (32-count) 3059994a338SPaul Mackerras rlwinm r8,r7,0,32 # t3 = (count < 32) ? 32 : 0 3069994a338SPaul Mackerras sraw r7,r3,r7 # t2 = MSW >> (count-32) 3079994a338SPaul Mackerras or r4,r4,r6 # LSW |= t1 3089994a338SPaul Mackerras slw r7,r7,r8 # t2 = (count < 32) ? 0 : t2 3099994a338SPaul Mackerras sraw r3,r3,r5 # MSW = MSW >> count 3109994a338SPaul Mackerras or r4,r4,r7 # LSW |= t2 3119994a338SPaul Mackerras blr 3129445aa1aSAl ViroEXPORT_SYMBOL(__ashrdi3) 3139994a338SPaul Mackerras 3149994a338SPaul Mackerras_GLOBAL(__ashldi3) 3159994a338SPaul Mackerras subfic r6,r5,32 3169994a338SPaul Mackerras slw r3,r3,r5 # MSW = count > 31 ? 0 : MSW << count 3179994a338SPaul Mackerras addi r7,r5,32 # could be xori, or addi with -32 3189994a338SPaul Mackerras srw r6,r4,r6 # t1 = count > 31 ? 0 : LSW >> (32-count) 3199994a338SPaul Mackerras slw r7,r4,r7 # t2 = count < 32 ? 0 : LSW << (count-32) 3209994a338SPaul Mackerras or r3,r3,r6 # MSW |= t1 3219994a338SPaul Mackerras slw r4,r4,r5 # LSW = LSW << count 3229994a338SPaul Mackerras or r3,r3,r7 # MSW |= t2 3239994a338SPaul Mackerras blr 3249445aa1aSAl ViroEXPORT_SYMBOL(__ashldi3) 3259994a338SPaul Mackerras 3269994a338SPaul Mackerras_GLOBAL(__lshrdi3) 3279994a338SPaul Mackerras subfic r6,r5,32 3289994a338SPaul Mackerras srw r4,r4,r5 # LSW = count > 31 ? 0 : LSW >> count 3299994a338SPaul Mackerras addi r7,r5,32 # could be xori, or addi with -32 3309994a338SPaul Mackerras slw r6,r3,r6 # t1 = count > 31 ? 0 : MSW << (32-count) 3319994a338SPaul Mackerras srw r7,r3,r7 # t2 = count < 32 ? 0 : MSW >> (count-32) 3329994a338SPaul Mackerras or r4,r4,r6 # LSW |= t1 3339994a338SPaul Mackerras srw r3,r3,r5 # MSW = MSW >> count 3349994a338SPaul Mackerras or r4,r4,r7 # LSW |= t2 3359994a338SPaul Mackerras blr 3369445aa1aSAl ViroEXPORT_SYMBOL(__lshrdi3) 3379994a338SPaul Mackerras 33895ff54f5SPaul Mackerras/* 33941b93b23SBharat Bhushan * 64-bit comparison: __cmpdi2(s64 a, s64 b) 34041b93b23SBharat Bhushan * Returns 0 if a < b, 1 if a == b, 2 if a > b. 34141b93b23SBharat Bhushan */ 34241b93b23SBharat Bhushan_GLOBAL(__cmpdi2) 34341b93b23SBharat Bhushan cmpw r3,r5 34441b93b23SBharat Bhushan li r3,1 34541b93b23SBharat Bhushan bne 1f 34641b93b23SBharat Bhushan cmplw r4,r6 34741b93b23SBharat Bhushan beqlr 34841b93b23SBharat Bhushan1: li r3,0 34941b93b23SBharat Bhushan bltlr 35041b93b23SBharat Bhushan li r3,2 35141b93b23SBharat Bhushan blr 3529445aa1aSAl ViroEXPORT_SYMBOL(__cmpdi2) 35341b93b23SBharat Bhushan/* 35495ff54f5SPaul Mackerras * 64-bit comparison: __ucmpdi2(u64 a, u64 b) 35595ff54f5SPaul Mackerras * Returns 0 if a < b, 1 if a == b, 2 if a > b. 35695ff54f5SPaul Mackerras */ 35795ff54f5SPaul Mackerras_GLOBAL(__ucmpdi2) 35895ff54f5SPaul Mackerras cmplw r3,r5 35995ff54f5SPaul Mackerras li r3,1 36095ff54f5SPaul Mackerras bne 1f 36195ff54f5SPaul Mackerras cmplw r4,r6 36295ff54f5SPaul Mackerras beqlr 36395ff54f5SPaul Mackerras1: li r3,0 36495ff54f5SPaul Mackerras bltlr 36595ff54f5SPaul Mackerras li r3,2 36695ff54f5SPaul Mackerras blr 3679445aa1aSAl ViroEXPORT_SYMBOL(__ucmpdi2) 36895ff54f5SPaul Mackerras 369ca9d7aeaSDavid Woodhouse_GLOBAL(__bswapdi2) 370ca9d7aeaSDavid Woodhouse rotlwi r9,r4,8 371ca9d7aeaSDavid Woodhouse rotlwi r10,r3,8 372ca9d7aeaSDavid Woodhouse rlwimi r9,r4,24,0,7 373ca9d7aeaSDavid Woodhouse rlwimi r10,r3,24,0,7 374ca9d7aeaSDavid Woodhouse rlwimi r9,r4,24,16,23 375ca9d7aeaSDavid Woodhouse rlwimi r10,r3,24,16,23 376ca9d7aeaSDavid Woodhouse mr r3,r9 377ca9d7aeaSDavid Woodhouse mr r4,r10 378ca9d7aeaSDavid Woodhouse blr 3799445aa1aSAl ViroEXPORT_SYMBOL(__bswapdi2) 380ca9d7aeaSDavid Woodhouse 38169e3cea8SBenjamin Herrenschmidt#ifdef CONFIG_SMP 38269e3cea8SBenjamin Herrenschmidt_GLOBAL(start_secondary_resume) 38369e3cea8SBenjamin Herrenschmidt /* Reset stack */ 3847306e83cSChristophe Leroy rlwinm r1, r1, 0, 0, 31 - THREAD_SHIFT 38590f1b431SNicholas Piggin addi r1,r1,THREAD_SIZE-STACK_FRAME_MIN_SIZE 38669e3cea8SBenjamin Herrenschmidt li r3,0 3876de06f31SJosh Boyer stw r3,0(r1) /* Zero the stack frame pointer */ 38869e3cea8SBenjamin Herrenschmidt bl start_secondary 38969e3cea8SBenjamin Herrenschmidt b . 39069e3cea8SBenjamin Herrenschmidt#endif /* CONFIG_SMP */ 391