f83288645c
Fix boot1 and loader on PowerPC64 little-endian (LE). Due to endian issues, boot1 couldn't find the UFS boot partition and loader wasn't able to load the kernel. Most of the issues happened because boot1 and loader were BE binaries trying to access LE UFS partitions and because loader expects the kernel ELF image to use the same endian as itself. To fix these issues, boot1 and loader are now built as LE binaries on PPC64LE. To support this, the functions that call OpenFirmware were enhanced to correctly perform endian conversion on its input and output arguments and to change the CPU into BE mode before making the calls, as OpenFirmware always runs in BE. Besides that, some other small fixes were needed. Submitted by: bdragon (initial version) Reviewed by: alfredo, jhibbits Sponsored by: Instituto de Pesquisas Eldorado (eldorado.org.br) Differential Revision: https://reviews.freebsd.org/D32160
72 lines
2.3 KiB
ArmAsm
72 lines
2.3 KiB
ArmAsm
/*-
|
|
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
|
*
|
|
* Copyright (c) 2020 Brandon Bergren <bdragon@FreeBSD.org>
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*
|
|
* $FreeBSD$
|
|
*/
|
|
|
|
#include <machine/asm.h>
|
|
|
|
/**
|
|
* int openfirmware_trampoline(void *buf, int (*cb)(void *));
|
|
*/
|
|
ASENTRY_NOPROF(openfirmware_trampoline)
|
|
mflr %r0
|
|
stw %r0, 4(%r1)
|
|
stwu %r1, -16(%r1)
|
|
stw %r30, 8(%r1)
|
|
/* Save current MSR for restoration post-call. */
|
|
mfmsr %r30
|
|
mr %r5, %r30
|
|
/* Remove LE bit from MSR. */
|
|
clrrwi %r5, %r5, 1
|
|
mtsrr0 %r4
|
|
mtsrr1 %r5
|
|
LOAD_LR_NIA
|
|
1:
|
|
mflr %r4
|
|
addi %r4, %r4, (2f - 1b)
|
|
mtlr %r4
|
|
/* Switch to BE and transfer control to OF entry */
|
|
rfid
|
|
2:
|
|
/* Control is returned here, but in BE. */
|
|
.long 0x05009f42 /* LOAD_LR_NIA */
|
|
/* 0: */
|
|
.long 0xa603db7f /* mtsrr1 %r30 */
|
|
.long 0xa602c87f /* mflr %r30 */
|
|
.long 0x1400de3b /* addi %r30, %r30, (1f - 0b) */
|
|
.long 0xa603da7f /* mtsrr0 %r30 */
|
|
.long 0x2400004c /* rfid */
|
|
/* 1: */
|
|
1:
|
|
/* Back to normal. Tidy up for return. */
|
|
lwz %r30, 8(%r1)
|
|
lwz %r0, 20(%r1)
|
|
addi %r1, %r1, 16
|
|
mtlr %r0
|
|
blr
|
|
ASEND(openfirmware_trampoline)
|