162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  PS3 bootwrapper hvcalls.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Copyright (C) 2007 Sony Computer Entertainment Inc.
662306a36Sopenharmony_ci *  Copyright 2007 Sony Corp.
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include "ppc_asm.h"
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci	.machine "ppc64"
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci/*
1462306a36Sopenharmony_ci * The PS3 hypervisor uses a 64 bit "C" language calling convention.
1562306a36Sopenharmony_ci * The routines here marshal arguments between the 32 bit wrapper
1662306a36Sopenharmony_ci * program and the 64 bit hvcalls.
1762306a36Sopenharmony_ci *
1862306a36Sopenharmony_ci *  wrapper           lv1
1962306a36Sopenharmony_ci *  32-bit (h,l)      64-bit
2062306a36Sopenharmony_ci *
2162306a36Sopenharmony_ci *  1: r3,r4          <-> r3
2262306a36Sopenharmony_ci *  2: r5,r6          <-> r4
2362306a36Sopenharmony_ci *  3: r7,r8          <-> r5
2462306a36Sopenharmony_ci *  4: r9,r10         <-> r6
2562306a36Sopenharmony_ci *  5: 8(r1),12(r1)   <-> r7
2662306a36Sopenharmony_ci *  6: 16(r1),20(r1)  <-> r8
2762306a36Sopenharmony_ci *  7: 24(r1),28(r1)  <-> r9
2862306a36Sopenharmony_ci *  8: 32(r1),36(r1)  <-> r10
2962306a36Sopenharmony_ci *
3062306a36Sopenharmony_ci */
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci.macro GLOBAL name
3362306a36Sopenharmony_ci	.section ".text"
3462306a36Sopenharmony_ci	.balign 4
3562306a36Sopenharmony_ci	.globl \name
3662306a36Sopenharmony_ci\name:
3762306a36Sopenharmony_ci.endm
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci.macro NO_SUPPORT name
4062306a36Sopenharmony_ci	GLOBAL \name
4162306a36Sopenharmony_ci	b ps3_no_support
4262306a36Sopenharmony_ci.endm
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci.macro HVCALL num
4562306a36Sopenharmony_ci	li r11, \num
4662306a36Sopenharmony_ci	.long 0x44000022
4762306a36Sopenharmony_ci	extsw r3, r3
4862306a36Sopenharmony_ci.endm
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci.macro SAVE_LR offset=4
5162306a36Sopenharmony_ci	mflr r0
5262306a36Sopenharmony_ci	stw r0, \offset(r1)
5362306a36Sopenharmony_ci.endm
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci.macro LOAD_LR offset=4
5662306a36Sopenharmony_ci	lwz r0, \offset(r1)
5762306a36Sopenharmony_ci	mtlr r0
5862306a36Sopenharmony_ci.endm
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci.macro LOAD_64_REG target,high,low
6162306a36Sopenharmony_ci	sldi r11, \high, 32
6262306a36Sopenharmony_ci	or \target, r11, \low
6362306a36Sopenharmony_ci.endm
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci.macro LOAD_64_STACK target,offset
6662306a36Sopenharmony_ci	ld \target, \offset(r1)
6762306a36Sopenharmony_ci.endm
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci.macro LOAD_R3
7062306a36Sopenharmony_ci	LOAD_64_REG r3,r3,r4
7162306a36Sopenharmony_ci.endm
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci.macro LOAD_R4
7462306a36Sopenharmony_ci	LOAD_64_REG r4,r5,r6
7562306a36Sopenharmony_ci.endm
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci.macro LOAD_R5
7862306a36Sopenharmony_ci	LOAD_64_REG r5,r7,r8
7962306a36Sopenharmony_ci.endm
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci.macro LOAD_R6
8262306a36Sopenharmony_ci	LOAD_64_REG r6,r9,r10
8362306a36Sopenharmony_ci.endm
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci.macro LOAD_R7
8662306a36Sopenharmony_ci	LOAD_64_STACK r7,8
8762306a36Sopenharmony_ci.endm
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci.macro LOAD_R8
9062306a36Sopenharmony_ci	LOAD_64_STACK r8,16
9162306a36Sopenharmony_ci.endm
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci.macro LOAD_R9
9462306a36Sopenharmony_ci	LOAD_64_STACK r9,24
9562306a36Sopenharmony_ci.endm
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci.macro LOAD_R10
9862306a36Sopenharmony_ci	LOAD_64_STACK r10,32
9962306a36Sopenharmony_ci.endm
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci.macro LOAD_REGS_0
10262306a36Sopenharmony_ci	stwu 1,-16(1)
10362306a36Sopenharmony_ci	stw 3, 8(1)
10462306a36Sopenharmony_ci.endm
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci.macro LOAD_REGS_5
10762306a36Sopenharmony_ci	LOAD_R3
10862306a36Sopenharmony_ci	LOAD_R4
10962306a36Sopenharmony_ci	LOAD_R5
11062306a36Sopenharmony_ci	LOAD_R6
11162306a36Sopenharmony_ci	LOAD_R7
11262306a36Sopenharmony_ci.endm
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci.macro LOAD_REGS_6
11562306a36Sopenharmony_ci	LOAD_REGS_5
11662306a36Sopenharmony_ci	LOAD_R8
11762306a36Sopenharmony_ci.endm
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci.macro LOAD_REGS_8
12062306a36Sopenharmony_ci	LOAD_REGS_6
12162306a36Sopenharmony_ci	LOAD_R9
12262306a36Sopenharmony_ci	LOAD_R10
12362306a36Sopenharmony_ci.endm
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci.macro STORE_REGS_0_1
12662306a36Sopenharmony_ci	lwz r11, 8(r1)
12762306a36Sopenharmony_ci	std r4, 0(r11)
12862306a36Sopenharmony_ci	mr r4, r3
12962306a36Sopenharmony_ci	li r3, 0
13062306a36Sopenharmony_ci	addi r1,r1,16
13162306a36Sopenharmony_ci.endm
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci.macro STORE_REGS_5_2
13462306a36Sopenharmony_ci	lwz r11, 16(r1)
13562306a36Sopenharmony_ci	std r4, 0(r11)
13662306a36Sopenharmony_ci	lwz r11, 20(r1)
13762306a36Sopenharmony_ci	std r5, 0(r11)
13862306a36Sopenharmony_ci.endm
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci.macro STORE_REGS_6_1
14162306a36Sopenharmony_ci	lwz r11, 24(r1)
14262306a36Sopenharmony_ci	std r4, 0(r11)
14362306a36Sopenharmony_ci.endm
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ciGLOBAL lv1_get_logical_ppe_id
14662306a36Sopenharmony_ci	SAVE_LR
14762306a36Sopenharmony_ci	LOAD_REGS_0
14862306a36Sopenharmony_ci	HVCALL 69
14962306a36Sopenharmony_ci	STORE_REGS_0_1
15062306a36Sopenharmony_ci	LOAD_LR
15162306a36Sopenharmony_ci	blr
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ciGLOBAL lv1_get_logical_partition_id
15462306a36Sopenharmony_ci	SAVE_LR
15562306a36Sopenharmony_ci	LOAD_REGS_0
15662306a36Sopenharmony_ci	HVCALL 74
15762306a36Sopenharmony_ci	STORE_REGS_0_1
15862306a36Sopenharmony_ci	LOAD_LR
15962306a36Sopenharmony_ci	blr
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ciGLOBAL lv1_get_repository_node_value
16262306a36Sopenharmony_ci	SAVE_LR
16362306a36Sopenharmony_ci	LOAD_REGS_5
16462306a36Sopenharmony_ci	HVCALL 91
16562306a36Sopenharmony_ci	STORE_REGS_5_2
16662306a36Sopenharmony_ci	LOAD_LR
16762306a36Sopenharmony_ci	blr
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ciGLOBAL lv1_panic
17062306a36Sopenharmony_ci	SAVE_LR
17162306a36Sopenharmony_ci	LOAD_REGS_8
17262306a36Sopenharmony_ci	HVCALL 255
17362306a36Sopenharmony_ci	LOAD_LR
17462306a36Sopenharmony_ci	blr
175