summaryrefslogtreecommitdiffstats
path: root/qemu/roms/openhackware/src/start.S
diff options
context:
space:
mode:
Diffstat (limited to 'qemu/roms/openhackware/src/start.S')
-rw-r--r--qemu/roms/openhackware/src/start.S379
1 files changed, 0 insertions, 379 deletions
diff --git a/qemu/roms/openhackware/src/start.S b/qemu/roms/openhackware/src/start.S
deleted file mode 100644
index 471e56fef..000000000
--- a/qemu/roms/openhackware/src/start.S
+++ /dev/null
@@ -1,379 +0,0 @@
-/*
- * <start.S>
- *
- * BIOS start code for Open Hack'Ware.
- *
- * Copyright (C) 2004-2005 Jocelyn Mayer (l_indien@magic.fr)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License V2
- * as published by the Free Software Foundation
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#define ASSEMBLY_CODE
-#include "bios.h"
-
-.section .start, "ax"
-.align 2
-
-.globl _start
-_start:
- /* Save our stack pointer */
- lis r11, saved_params@h ;
- ori r11, r11, saved_params@l ;
- stw r1, 0(r11) ;
- /* Fill space from _bss_start to _ram_start with zeroes */
- lis r11, _bss_start@h ;
- ori r11, r11, _bss_start@l ;
- lis r12, _ram_start@h ;
- ori r12, r12, _ram_start@l ;
- subf r12, r11, r12 ;
- srawi r12, r12, 2 ;
- cmpi 0, r12, 0 ;
- beq _bss_done ;
- mtctr r12 ;
- subi r11, r11, 4 ;
- li r12, 0 ;
-_bss_loop:
- stwu r12, 4(r11) ;
- bdnz _bss_loop ;
-_bss_done:
- /* Now, we have a real C environment: call main */
- bl main ;
- /* If we return, stop */
-.globl bug
-bug:
- li r0, 0x80 ;
- mtlr r0 ;
- blr ;
-_return_loop:
- b _return_loop ;
-
-.section .data
-.align 2
-saved_params:
- .long 0x00000000 /* OF stack */
- .long 0x00000000 /* client stack */
- .long 0x00000000 /* client link */
-
-.section .text
-.align 2
-
-.globl transfer_handler
-transfer_handler:
- /* Build a new stack room and launch loaded image
- * void transfer_handler (void *residual, void *load_addr,
- * void *OF_entry, void *bootinfos,
- * void *cmdline, void *unused,
- * void *nip, void *stack_base);
- */
- mfmsr r0 ;
- mtspr SRR1, r0 ;
- mtspr SRR0, r9 ;
- li r0, 0 ;
- mr r1, r10 ;
- stw r1, -16(r1) ;
- stwu r0, -4(r1) ;
- stwu r0, -4(r1) ;
- stwu r0, -4(r1) ;
- stwu r0, -4(r1) ;
- /* Skip frame pointer */
- stwu r0, -8(r1) ;
- stwu r0, -4(r1) ;
- stwu r0, -4(r1) ;
- rfi ;
- /* Should never return, but who knows... */
- bl bug ;
-
-.globl OF_entry
-OF_entry:
- /* Save the stack pointer and get our own one */
- lis r11, saved_params@h ;
- ori r11, r11, saved_params@l ;
- mflr r12 ;
- stw r12, 8(r11) ;
- stw r1, 4(r11) ;
- lwz r1, 0(r11) ;
- bl OF_client_entry ;
- lis r11, saved_params@h ;
- ori r11, r11, saved_params@l ;
- lwz r12, 8(r11) ;
- mtlr r12 ;
- lwz r1, 4(r11) ;
- blr ;
-
- /* PPC helpers */
-.globl mfmsr
-mfmsr:
- /* uint32_t mfmsr (void); */
- mfmsr r3 ;
- blr ;
-.globl mtmsr
-mtmsr:
- /* void mtmsr (uint32_t msr); */
- lis r0, _mtmsr_rfi@h ;
- ori r0, r0, _mtmsr_rfi@l ;
- mtspr 26, r0 ;
- mtspr 27, r3 ;
- rfi ;
-_mtmsr_rfi:
- blr ;
-.globl MMU_on
-MMU_on:
- /* void MMU_on (void); */
- stwu r1, -16(r1) ;
- mflr r0 ;
- stw r0, 20(r1) ;
- mfmsr r3 ;
- ori r3, r3, 0x30 ;
- bl mtmsr ;
- lwz r0, 20(r1) ;
- mtlr r0 ;
- addi r1, r1, 16 ;
- blr ;
-
-.globl MMU_off
-MMU_off:
- /* void MMU_off (void); */
- stwu r1, -16(r1) ;
- mflr r0 ;
- stw r0, 20(r1) ;
- mfmsr r3 ;
- andi. r3, r3, 0xFFCF ;
- bl mtmsr ;
- lwz r0, 20(r1) ;
- mtlr r0 ;
- addi r1, r1, 16 ;
- blr ;
-
-.globl mfpvr
-mfpvr:
- /* uint32_t mfpvr (void); */
- mfpvr r3 ;
- blr ;
-
-.globl mftb
-mftb:
- /* void mftb (uint32_t *tb); */
- stwu r1, -16(r1) ;
- stw r11, 12(r1) ;
- stw r12, 8(r1) ;
- /* No need to save lr */
-_tb_loop:
- mftbu r11 ;
- mftb r12 ;
- mftbu r0 ;
- cmpw r0, r11 ;
- bne _tb_loop ;
- stw r11, 0(r3) ;
- stw r12, 4(r3) ;
- lwz r12, 8(r1) ;
- lwz r11, 12(r1) ;
- addi r1, r1, 16 ;
- blr ;
-
- /* IO helpers */
-.globl inb
-inb:
- /* uint32_t inb (uint16_t port); */
- stwu r1, -16(r1) ;
- stw r11, 12(r1) ;
- lis r11, isa_io_base@h ;
- ori r11, r11, isa_io_base@l ;
- lwz r11, 0(r11) ;
- add r3, r3, r11 ;
- lbz r3, 0(r3) ;
- eieio ;
- lwz r11, 12(r1) ;
- addi r1, r1, 16 ;
- blr ;
-
-.globl outb
-outb:
- /* void outb (uint16_t port, uint32_t val); */
- stwu r1, -16(r1) ;
- stw r11, 12(r1) ;
- lis r11, isa_io_base@h ;
- ori r11, r11, isa_io_base@l ;
- lwz r11, 0(r11) ;
- add r3, r3, r11 ;
- eieio ;
- stb r4, 0(r3) ;
- lwz r11, 12(r1) ;
- addi r1, r1, 16 ;
- blr ;
-
-.globl inw
-inw:
- /* uint32_t inw (uint16_t port); */
- stwu r1, -16(r1) ;
- stw r11, 12(r1) ;
- lis r11, isa_io_base@h ;
- ori r11, r11, isa_io_base@l ;
- lwz r11, 0(r11) ;
- add r3, r3, r11 ;
- lhbrx r3, 0, r3 ;
- eieio ;
- lwz r11, 12(r1) ;
- addi r1, r1, 16 ;
- blr ;
-
-.globl outw
-outw:
- /* void outw (uint16_t port, uint32_t val); */
- stwu r1, -16(r1) ;
- stw r11, 12(r1) ;
- lis r11, isa_io_base@h ;
- ori r11, r11, isa_io_base@l ;
- lwz r11, 0(r11) ;
- add r3, r3, r11 ;
- eieio ;
- sthbrx r4, 0, r3 ;
- lwz r11, 12(r1) ;
- addi r1, r1, 16 ;
- blr ;
-
-.globl inl
-inl:
- /* uint32_t inl (uint16_t port); */
- stwu r1, -16(r1) ;
- stw r11, 12(r1) ;
- lis r11, isa_io_base@h ;
- ori r11, r11, isa_io_base@l ;
- lwz r11, 0(r11) ;
- add r3, r3, r11 ;
- lwbrx r3, 0, r3 ;
- eieio ;
- lwz r11, 12(r1) ;
- addi r1, r1, 16 ;
- blr ;
-
-.globl outl
-outl:
- /* void outl (uint16_t port, uint32_t val); */
- stwu r1, -16(r1) ;
- stw r11, 12(r1) ;
- lis r11, isa_io_base@h ;
- ori r11, r11, isa_io_base@l ;
- lwz r11, 0(r11) ;
- add r3, r3, r11 ;
- eieio ;
- stwbrx r4, 0, r3 ;
- lwz r11, 12(r1) ;
- addi r1, r1, 16 ;
- blr ;
-
-.globl eieio
-eieio:
- eieio ;
- blr ;
-
- /* Misc helpers */
-.globl ldswap16
-ldswap16:
- /* uint16_t ldswap16 (uint16_t *addr); */
- lhbrx r3, 0, r3 ;
- blr ;
-
-.globl stswap16
-stswap16:
- /* void stswap16 (void *addr, uint16_t val); */
- sthbrx r4, 0, r3 ;
- blr ;
-
-.globl ldswap32
-ldswap32:
- /* uint32_t ldswap32 (uint32_t *addr); */
- lwbrx r3, 0, r3 ;
- blr ;
-
-.globl stswap32
-stswap32:
- /* void stswap32 (void *addr, uint32_t val); */
- stwbrx r4, 0, r3 ;
- blr ;
-
-.globl mul64
-mul64:
- /* void mul64 (uint32_t *ret, uint32_t a, uint32_t b); */
- mulhwu r0, r4, r5 ;
- stw r0, 0(r3) ;
- mullw r0, r4, r5 ;
- stw r0, 4(r3) ;
- blr ;
-
-.globl add64
-add64:
- /* void add64 (uint32_t *ret, uint32_t *a, uint32_t *b); */
- stwu r1, -16(r1) ;
- stw r11, 12(r1) ;
- stw r12, 8(r1) ;
- lwz r11, 4(r4) ;
- lwz r12, 4(r5) ;
- addc r0, r11, r12 ;
- stw r0, 4(r3) ;
- lwz r11, 0(r4) ;
- lwz r12, 0(r5) ;
- adde r0, r11, r12 ;
- stw r0, 0(r3) ;
- lwz r12, 8(r1) ;
- lwz r11, 4(r1) ;
- addi r1, r1, 16 ;
- blr ;
-
-.globl setjmp
-setjmp:
- /* int setjmp (jmp_buf env); */
- /* save gprs */
- stmw r0, 0(r3) ;
- /* save lr, ctr, xer and ccr */
- mflr r0 ;
- stw r0, 0x80(r3) ;
- mfctr r0 ;
- stw r0, 0x84(r3) ;
- mfxer r0 ;
- stw r0, 0x88(r3) ;
- mfcr r0 ;
- stw r0, 0x8C(r3) ;
- /* return 0 */
- li r3, 0 ;
- blr ;
-
-.globl longjmp
-longjmp:
- /* void longjmp (jmp_buf env, int val); */
- /* Let's pretend env is our stack */
- mr r1, r3 ;
- /* Be sure we won't return 0 */
- cmpi 0, r4, 0 ;
- bne _longjmp_cont ;
- addi r4, r4, 1 ;
-_longjmp_cont:
- /* Store return value in jmp_buf */
- stw r4, 0x0C(r1) ;
- /* restore lr, ctr, xer and ccr */
- lwz r0, 0x80(r1) ;
- mtlr r0 ;
- lwz r0, 0x84(r1) ;
- mtctr r0 ;
- lwz r0, 0x88(r1) ;
- mtxer r0 ;
- lwz r0, 0x8C(r1) ;
- mtcr r0 ;
- /* Restore r2 to r31 */
- lmw r2, 0x08(r1) ;
- /* Restore r0 (could forget it...) */
- lwz r0, 0x00(r1) ;
- /* Restore stack */
- lwz r1, 0x04(r1) ;
- /* Return */
- blr ;