Expand PMF_FN_* macros.
[netbsd-mini2440.git] / sys / arch / x68k / stand / common / execkern.S
blobd63b113a4947c67683b307a63a89b3c6963ca8de
2 |       execute NetBSD kernel
4 |       written by Yasha (ITOH Yasufumi)
5 |       public domain
7 |       $NetBSD: execkern.S,v 1.2 2001/06/12 16:57:27 minoura Exp $
9 #include <machine/asm.h>
10 #include "execkern.h"
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 */
17 #ifndef SRAM_MEMSZ
18 #define SRAM            0x00ED0000      /* SRAM start addr */
19 #define SRAM_MEMSZ      (SRAM + 8)      /* (L) size of main memory */
20 #endif
22 |       a3+0    load address
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
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)
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
45         moveal  %a3@+,%a1               | load address
46         movel   %a1,%d3
48         |
49         | copy image
50         |
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
61         dbra    %d2,Lloop
63         | stop MFP interrupts (for compatibility)
64         clrb    MFP_IERA
65         clrb    MFP_IERB
66         clrb    MFP_RSR
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)
80 #if 0
81         movel   %a3@+,%d5               | (reserved)
82         movel   %a3@+,%d6               | boot device
83         movel   %a3@+,%d7               | boot howto
85         movel   %a3@+,%a0               | entry address
86 #else   /* optimized */
87         moveml  %a3@+,%d5-%d7/%a0
88 #endif
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
103         jsr     %a0@                    | execute NetBSD kernel
104         | NOTREACHED
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
115 | utility routines
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
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