1| 2| execute NetBSD kernel 3| 4| written by Yasha (ITOH Yasufumi) 5| public domain 6| 7| $NetBSD: execkern.S,v 1.1 1998/09/01 19:51:56 itohy Exp $ 8 9/* XXX this value is from <machine/exec_aout.h> */ 10#define __LDPGSZ 8192 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 kernel image top address (a.out header is excluded) 23| a3+4 load address 24| a3+8 text size 25| a3+12 data size 26| a3+16 bss size 27| a3+20 symbol size 28| a3+24 (reserved) (d5) 29| a3+28 bootdev (d6) 30| a3+32 boothowto (d7) 31| a3+36 entry address (absolute address) 32 33#ifndef XK_NO_C_INTERFACE 34 .text 35 .even 36 .globl _exec_kernel 37_exec_kernel: 38 addql #4,sp 39 moveal sp@+,a3 | struct execkern_arg * 40#endif 41 42 moveal a3@+,a0 | image address 43 moveal a3@+,a1 | load address 44 movel a1,d3 45 46 | 47 | copy image 48 | 49 50 | copy text segment 51 movel a3@+,d0 | text size 52 movel d0,d1 53 jbsr copy 54 55 | clear gap between text and data 56 negl d1 57 andil #__LDPGSZ-1,d1 58 movel d1,d0 | gap size between text and data 59 jbsr clear 60 61 | copy data segment 62 movel a3@+,d0 | data size 63 jbsr copy 64 65 | clear bss 66 movel a3@+,d0 | bss size 67 jbsr clear 68 69 | copy symbol table 70 movel a3@+,d0 | symbol table size 71 movel d0,a1@+ 72 beqs Lnotable 73 jbsr copy 74 75 | copy string table size 76 movel a0@+,d0 77 movel d0,a1@+ 78 beqs Lnotable 79 80 | copy string table 81 subql #4,d0 | table size is already copied 82 jbsr copy 83 84Lnotable: 85 86 | stop MFP interrupts (for compatibility) 87 clrb MFP_IERA 88 clrb MFP_IERB 89 clrb MFP_RSR 90 91 | 92 | execute kernel 93 | start(load_addr, mem_max, kernel_end) 94 | 95 movel a1,d0 96 addql #3,d0 97 andib #0xFC,d0 98 subl d3,d0 99 movel d0,sp@- | arg #3 (kernel size) 100 movel SRAM_MEMSZ,sp@- | arg #2 (RAM size from SRAM) 101 movel d3,sp@- | arg #1 (load address) 102 103#if 0 104 movel a3@+,d5 | (reserved) 105 movel a3@+,d6 | boot device 106 movel a3@+,d7 | boot howto 107 108 movel a3@+,a0 | entry address 109#else /* optimized */ 110 moveml a3@+,d5-d7/a0 111#endif 112 113 | clear unused registers 114 moveq #0,d0 115 moveq #0,d1 116 moveq #0,d2 117 moveq #0,d3 118 moveq #0,d4 119 moveal d0,a1 120 moveal d0,a2 121 moveal d0,a3 122 moveal d0,a4 123 moveal d0,a5 124 moveal d0,a6 125 126 jsr a0@ | execute NetBSD kernel 127 | NOTREACHED 128 129 | ??? returned from kernel -- issue software reset 130 subal a1,a1 131 moveml 0x00ff0000,#0x0101 | get RESET vectors (d0: ssp, a0: pc) 132 moveml #0x0101,a1@ | put them at 0x00000000 (for Xellent) 133 .long 0x4E7B9801 | movec a1,vbr 134 jmp a0@ | go to reset address 135 136 137| 138| utility routines 139| 140 141| copy d0 bytes from higher (a0) to lower (a1) address 1421: moveb a0@+,a1@+ 143copy: subql #1,d0 144 bpls 1b 145 rts 146 147| clear d0 bytes at a1 148| do nothing if d0 is zero 1491: clrb a1@+ 150clear: subql #1,d0 151 bpls 1b 152 rts 153