trampolineLE.S 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*-
  2. * SPDX-License-Identifier: BSD-2-Clause
  3. *
  4. * Copyright (c) 2020 Brandon Bergren <bdragon@FreeBSD.org>
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions
  8. * are met:
  9. * 1. Redistributions of source code must retain the above copyright
  10. * notice, this list of conditions and the following disclaimer.
  11. * 2. Redistributions in binary form must reproduce the above copyright
  12. * notice, this list of conditions and the following disclaimer in the
  13. * documentation and/or other materials provided with the distribution.
  14. *
  15. * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  16. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  18. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  19. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  20. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  21. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  22. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  23. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  24. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  25. * SUCH DAMAGE.
  26. */
  27. #include <machine/asm.h>
  28. /**
  29. * int openfirmware_trampoline(void *buf, int (*cb)(void *));
  30. */
  31. ASENTRY_NOPROF(openfirmware_trampoline)
  32. mflr %r0
  33. stw %r0, 4(%r1)
  34. stwu %r1, -16(%r1)
  35. stw %r30, 8(%r1)
  36. /* Save current MSR for restoration post-call. */
  37. mfmsr %r30
  38. mr %r5, %r30
  39. /* Remove LE bit from MSR. */
  40. clrrwi %r5, %r5, 1
  41. mtsrr0 %r4
  42. mtsrr1 %r5
  43. LOAD_LR_NIA
  44. 1:
  45. mflr %r4
  46. addi %r4, %r4, (2f - 1b)
  47. mtlr %r4
  48. /* Switch to BE and transfer control to OF entry */
  49. rfid
  50. 2:
  51. /* Control is returned here, but in BE. */
  52. .long 0x05009f42 /* LOAD_LR_NIA */
  53. /* 0: */
  54. .long 0xa603db7f /* mtsrr1 %r30 */
  55. .long 0xa602c87f /* mflr %r30 */
  56. .long 0x1400de3b /* addi %r30, %r30, (1f - 0b) */
  57. .long 0xa603da7f /* mtsrr0 %r30 */
  58. .long 0x2400004c /* rfid */
  59. /* 1: */
  60. 1:
  61. /* Back to normal. Tidy up for return. */
  62. lwz %r30, 8(%r1)
  63. lwz %r0, 20(%r1)
  64. addi %r1, %r1, 16
  65. mtlr %r0
  66. blr
  67. ASEND(openfirmware_trampoline)