Changeset View
Changeset View
Standalone View
Standalone View
stand/powerpc/ofw/trampolineLE.S
- This file was added.
/*- | |||||
* 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) |