1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
| /* SPDX-License-Identifier: GPL-2.0-or-later */
| /*
| * Copyright (c) 2016 IBM Corporation.
| */
|
| #include "ppc_asm.h"
| #include "../include/asm/opal-api.h"
|
| .text
|
| .globl opal_kentry
| opal_kentry:
| /* r3 is the fdt ptr */
| mtctr r4
| li r4, 0
| li r5, 0
| li r6, 0
| li r7, 0
| ld r11,opal@got(r2)
| ld r8,0(r11)
| ld r9,8(r11)
| bctr
|
| #define OPAL_CALL(name, token) \
| .globl name; \
| name: \
| li r0, token; \
| b opal_call;
|
| opal_call:
| mflr r11
| std r11,16(r1)
| mfcr r12
| stw r12,8(r1)
| mr r13,r2
|
| /* Set opal return address */
| ld r11,opal_return@got(r2)
| mtlr r11
| mfmsr r12
|
| /* switch to BE when we enter OPAL */
| li r11,MSR_LE
| andc r12,r12,r11
| mtspr SPRN_HSRR1,r12
|
| /* load the opal call entry point and base */
| ld r11,opal@got(r2)
| ld r12,8(r11)
| ld r2,0(r11)
| mtspr SPRN_HSRR0,r12
| hrfid
|
| opal_return:
| FIXUP_ENDIAN
| mr r2,r13;
| lwz r11,8(r1);
| ld r12,16(r1)
| mtcr r11;
| mtlr r12
| blr
|
| OPAL_CALL(opal_console_write, OPAL_CONSOLE_WRITE);
| OPAL_CALL(opal_console_read, OPAL_CONSOLE_READ);
| OPAL_CALL(opal_console_write_buffer_space, OPAL_CONSOLE_WRITE_BUFFER_SPACE);
| OPAL_CALL(opal_poll_events, OPAL_POLL_EVENTS);
| OPAL_CALL(opal_console_flush, OPAL_CONSOLE_FLUSH);
|
|