1 | 2 | execute NetBSD kernel 3 | 4 | written by ITOH Yasufumi 5 | public domain 6 | 7 | $NetBSD: execkern.S,v 1.4 2011/02/21 02:31:58 itohy Exp $ 8 9 #include <machine/asm.h> 10 #include "execkern.h" 11 12 #define MFP 0x00E88000 /* MFP */ 13 #define MFP_IERA (MFP+0x07) /* (B) interrupt enable reg A */ 14 #define MFP_IERB (MFP+0x09) /* (B) interrupt enable reg B */ 15 #define MFP_RSR (MFP+0x2B) /* (B) USART receiver status reg */ 16 17 #ifndef SRAM_MEMSZ 18 #define SRAM 0x00ED0000 /* SRAM start addr */ 19 #define SRAM_MEMSZ (SRAM + 8) /* (L) size of main memory */ 20 #endif 21 22 | a3+0 load address 23 | 24 | a3+4 section #1 image top address 25 | a3+8 section #1 size 26 | a3+12 section #1 gap size 27 | : : 28 | a3+n-12 section #XK_NSEC image top address 29 | a3+n-8 section #XK_NSEC size 30 | a3+n-4 section #XK_NSEC gap size 31 | 32 | a3+n (reserved) (d5) 33 | a3+n+4 bootdev (d6) 34 | a3+n+8 boothowto (d7) 35 | a3+n+12 entry address (absolute address) 36 37 #ifndef XK_NO_C_INTERFACE 38 .text 39 .even 40 ENTRY_NOPROFILE(exec_kernel) 41 addql #4,%sp 42 moveal %sp@+,%a3 | struct execkern_arg * 43 #endif 44 45 moveal %a3@+,%a1 | load address 46 movel %a1,%d3 47 48 | 49 | copy image 50 | 51 52 movel #XK_NSEC-1,%d2 53 Lloop: 54 moveal %a3@+,%a0 | section image address 55 movel %a3@+,%d0 | section size 56 movel %d0,%d1 57 jbsr copy 58 movel %a3@+,%d0 | section gap 59 jbsr clear 60 61 dbra %d2,Lloop 62 63 | stop MFP interrupts (for compatibility) 64 clrb MFP_IERA 65 clrb MFP_IERB 66 clrb MFP_RSR 67 68 | 69 | execute kernel 70 | start(load_addr, mem_max, kernel_end) 71 | 72 movel %a1,%d0 73 addql #3,%d0 74 andib #0xFC,%d0 75 subl %d3,%d0 76 movel %d0,%sp@- | arg #3 (end of kernel) 77 movel SRAM_MEMSZ,%sp@- | arg #2 (RAM size from SRAM) 78 movel %d3,%sp@- | arg #1 (load address) 79 80 #if 0 81 movel %a3@+,%d5 | (reserved) 82 movel %a3@+,%d6 | boot device 83 movel %a3@+,%d7 | boot howto 84 85 movel %a3@+,%a0 | entry address 86 #else /* optimized */ 87 moveml %a3@+,%d5-%d7/%a0 88 #endif 89 90 | clear unused registers 91 moveq #0,%d0 92 moveq #0,%d1 93 moveq #0,%d2 94 moveq #0,%d3 95 moveq #0,%d4 96 moveal %d0,%a1 97 moveal %d0,%a2 98 moveal %d0,%a3 99 moveal %d0,%a4 100 moveal %d0,%a5 101 moveal %d0,%a6 102 103 jsr %a0@ | execute NetBSD kernel 104 | NOTREACHED 105 106 | ??? returned from kernel -- issue software reset 107 subal %a1,%a1 108 moveml 0x00ff0000,#0x0101 | get RESET vectors (%d0: ssp, %a0: pc) 109 moveml #0x0101,%a1@ | put them at 0x00000000 (for Xellent) 110 .long 0x4E7B9801 | movec %a1,%vbr 111 jmp %a0@ | go to reset address 112 113 114 | 115 | utility routines 116 | 117 118 | copy %d0 bytes from higher (%a0) to lower (%a1) address 119 1: moveb %a0@+,%a1@+ 120 copy: subql #1,%d0 121 bpls 1b 122 rts 123 124 | clear %d0 bytes at %a1 125 | do nothing if %d0 is zero 126 1: clrb %a1@+ 127 clear: subql #1,%d0 128 bpls 1b 129 rts 130