xref: /openbmc/linux/arch/powerpc/kernel/misc_32.S (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
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