summaryrefslogtreecommitdiffstats
path: root/src/securerom/secureromasm.S
blob: 83dd42358b8a248524c39cc91e65dfb17a10079a (plain)
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# IBM_PROLOG_BEGIN_TAG
# This is an automatically generated prolog.
#
# $Source: src/securerom/secureromasm.S $
#
# OpenPOWER HostBoot Project
#
# Contributors Listed Below - COPYRIGHT 2017
# [+] International Business Machines Corp.
#
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied. See the License for the specific language governing
# permissions and limitations under the License.
#
# IBM_PROLOG_END_TAG
.include "kernel/ppcconsts.S"

#****************************************************************************
#*  SecureROM info - useful info used by HBBL. Must match ROM.H
#****************************************************************************
.set SECROM_EYECATCHER, 0x23534543524F4D00   # uint64_t '#SECROM.'
.set SECROM_VERSION, 0x0000000900000001   # uint64_t

# Before the SecureRom code starts there is SecureRomInfo see ROM.H
# - [8 bytes] - eyeCatch
# - [8 bytes] - version
# - [8 bytes] - branchtable offset
# - [16 bytes] - reserved
.section .text.securerominfo

eyeCatch:
    .quad SECROM_EYECATCHER

version:
    .quad SECROM_VERSION

branchtableoffset:
    .quad .text.branchtable

reserved:
    .zero 16 # 'reserve 16 bytes'

#****************************************************************************
#*  branch table - a more stable location for software entering rom code
#****************************************************************************
.section .text.branchtable

    .globl _SHA512_Init
_SHA512_Init:
    li r0, .L.SHA512_Init@l
    b remove_sha512_init_offset

    .globl _SHA512_Update
_SHA512_Update:
    li r0, .L.SHA512_Update@l
    b remove_sha512_update_offset

    .globl _SHA512_Final
_SHA512_Final:
    li r0, .L.SHA512_Final@l
    b remove_sha512_final_offset

    .globl _SHA512_Hash
_SHA512_Hash:
    li r0, .L.SHA512_Hash@l
    b remove_sha512_hash_offset

    .globl _ec_verify
_ec_verify:
    li r0, .L.ec_verify@l
    b remove_ec_verify_offset

    .globl _ROM_verify
_ROM_verify:
    li r0, .L.ROM_verify@l
    b remove_rom_verify_offset

# Helper Functions to load the negative offset into r10.
#
# In an effort to not move anything around in the branchtable nor change any of
# the parameters in the Hostboot C code, we have these helper functions to
# provide springboard with the offest to subtract to find the base secureROM
# address.
remove_sha512_init_offset:
    li r10, -_SHA512_Init
    b springboard

remove_sha512_update_offset:
    li r10, -_SHA512_Update
    b springboard

remove_sha512_final_offset:
    li r10, -_SHA512_Final
    b springboard

remove_sha512_hash_offset:
    li r10, -_SHA512_Hash
    b springboard

remove_ec_verify_offset:
    li r10, -_ec_verify
    b springboard

remove_rom_verify_offset:
    li r10, -_ROM_verify
    b springboard

springboard:
    b boingboing
boingboing:
    mfctr r2
    add r2, r2, r10 # get secureROM base address
    add r0, r0, r2 # calculate entry relative
    addi r2, r2, 0x4000 #TOC+0x8000  part 1
    addi r2, r2, (__toc_start+0x4000)@l #TOC+0x8000  part 2
    mtctr r0
    bctr # jump

# could put other assembly code routines here to conserve ROM space
# including the sreset routine

# need to align on branchtablebase+0x100 !!!
    .org .text.branchtable+0x100
    .globl _rom_sreset
_rom_sreset:
    li r0, rom_sreset@l
    b springboard
    nop

.section .data

.global hbi_ImageId
hbi_ImageId:
    .space 128
OpenPOWER on IntegriCloud