hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
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);