Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/x68k/stand/boot_ustar Primary boot for ustarfs.



details:   https://anonhg.NetBSD.org/src/rev/733d49a0d0b6
branches:  trunk
changeset: 515560:733d49a0d0b6
user:      minoura <minoura%NetBSD.org@localhost>
date:      Fri Sep 28 15:22:21 2001 +0000

description:
Primary boot for ustarfs.
Supports floppy only.

diffstat:

 sys/arch/x68k/stand/boot_ustar/Makefile            |   54 ++++++
 sys/arch/x68k/stand/boot_ustar/boot_ustar.S        |  176 +++++++++++++++++++++
 sys/arch/x68k/stand/boot_ustar/boot_ustar.ldscript |   49 +++++
 3 files changed, 279 insertions(+), 0 deletions(-)

diffs (291 lines):

diff -r 578e1922c5f2 -r 733d49a0d0b6 sys/arch/x68k/stand/boot_ustar/Makefile
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/x68k/stand/boot_ustar/Makefile   Fri Sep 28 15:22:21 2001 +0000
@@ -0,0 +1,54 @@
+#      $NetBSD: Makefile,v 1.1 2001/09/28 15:22:21 minoura Exp $
+
+.include <bsd.own.mk>
+
+BOOT=  boot_ustar
+VERSION=1.0
+
+# text and bss addresses in hex
+TEXT=          002000          # Primary (me)
+BOOT_TEXT=     006000          # Secondary (/boot)
+
+PROG=          $(BOOT)
+BINDIR=                /usr/mdec
+STRIPFLAG=
+BINMODE=       444
+MKMAN=         no
+
+OBJCOPY?=      objcopy
+
+COMMONDIR=     ${.CURDIR}/../common
+LIBIOCS=       ${.CURDIR}/../libiocs
+#.PATH:                ${COMMONDIR}
+#SRCS= boot_ustar.S exec_image.S
+SRCS=  boot_ustar.S
+
+CPPFLAGS+= -DTEXTADDR="0x$(TEXT)" -DBOOT_TEXTADDR="0x$(BOOT_TEXT)"
+CPPFLAGS+= -DBOOT=\"$(BOOT)\" -DBOOT_VERS=\"$(VERSION)\"
+CPPFLAGS+= -I${COMMONDIR} -I${LIBIOCS}
+AFLAGS=           ${CFLAGS:M-[ID]*}
+.if ${OBJECT_FMT} == "ELF"
+LDFLAGS=   -n -Bstatic -T ${.CURDIR}/${BOOT}.ldscript
+LDFLAGS+=  -noinhibit-exec     # XXX
+.else
+LDFLAGS=   -n -Bstatic -Ttext ${TEXT}
+.endif
+
+CLEANFILES=    $(BOOT).x s.x x.s x.o
+
+
+$(BOOT): $(OBJS)
+       $(LD) $(LDFLAGS) -o $(BOOT).x $(OBJS) $(LDADD)
+       @$(NM) --target=a.out-m68k-netbsd $(BOOT).x | sed -n '/T first_kbyte/p'
+       @if [ `(echo ibase=16; \
+               $(NM) --target=a.out-m68k-netbsd $(BOOT).x | sed -n 's/T first_kbyte/-$(TEXT)-400/p' | \
+                               tr a-f A-F) | bc` -gt 0 ];\
+       then echo '$(BOOT): first_kbyte exceeds the first killobyte'; exit 1; fi
+       @$(SIZE) --target=a.out-m68k-netbsd $(BOOT).x
+       @if [ `(echo ibase=16; \
+               $(NM) --target=a.out-m68k-netbsd $(BOOT).x | sed -n 's/D _edata/-$(TEXT)-2000/p' | tr a-f A-F) |\
+                       bc` -gt 0 ];\
+       then    echo '$(BOOT): text+data is too large'; exit 1; fi
+       @$(OBJCOPY) -I a.out-m68k-netbsd -O binary $(BOOT).x $(BOOT)
+
+.include <bsd.prog.mk>
diff -r 578e1922c5f2 -r 733d49a0d0b6 sys/arch/x68k/stand/boot_ustar/boot_ustar.S
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/x68k/stand/boot_ustar/boot_ustar.S       Fri Sep 28 15:22:21 2001 +0000
@@ -0,0 +1,176 @@
+| file: boot_ustar.S
+| author: chapuni(webmaster%chapuni.com@localhost)
+|         Yasha(itohy%netbsd.org@localhost)
+|        minoura%netbsd.org@localhost
+|
+| $NetBSD: boot_ustar.S,v 1.1 2001/09/28 15:22:22 minoura Exp $
+
+| supports floppy only
+
+#include <sys/reboot.h>
+#include <machine/asm.h>
+#include <machine/bootinfo.h>
+#include "iocscall.h"
+
+#define BOOT_ERROR(s)  jbsr boot_error; .asciz s; .even
+#define READ_BUFFER    0x000e0000
+
+       .text
+ASENTRY_NOPROFILE(start)
+ASENTRY_NOPROFILE(top)
+               bras    _ASM_LABEL(entry0)
+               .ascii  "SHARP/"
+               .ascii  "X680x0"
+               .word   0x8199,0x94e6,0x82ea,0x82bd
+               .word   0x8e9e,0x82c9,0x82cd,0x8cbb
+               .word   0x8ec0,0x93a6,0x94f0,0x8149
+               .word   0
+ASENTRY_NOPROFILE(entry0)
+               IOCS(__BOOTINF)
+               lsll    #8,%d0          | clear MSByte
+               lsrl    #8,%d0          |
+
+               |
+               | 0x80...0x8F           SASI
+               | 0x90...0x93           Floppy
+               | 0xED0000...0xED3FFE   SRAM
+               | others                ROM (SCSI?)
+               |
+               movel   %d0,%d1
+               clrb    %d1
+               tstl    %d1
+               jne     boot_dev_unsupported
+
+               bra     _ASM_LABEL(entry)
+
+|      Disklabel= 404bytes
+|      Since LABELLOFFSET in <machine/disklabel.h> is 0x40,
+|      entry must be after 0x000001d4 (0x000021d4)
+               nop
+GLOBAL(disklabel)
+               .space  404
+
+ASENTRY_NOPROFILE(entry)
+               |
+               | SASI or Floppy
+               |
+               movel   %d0,%d4
+               andib   #0xFC,%d0
+               cmpib   #0x90,%d0
+               jne     boot_dev_unsupported    | boot from SASI?
+               |
+               | Floppy
+               |   read first 64KB (XXX: CONSTANT!!)
+               |
+               andib   #0x03,%d0       | drive # (head=0)
+               jbsr    check_fd_format
+               moveb   %d4,%d2
+               lslw    #8,%d2
+               moveq   #0x70,%d1
+               orw     %d2,%d1         | PDA*256 + MODE
+               movel   %d0,%d2         | read position (first sector)
+               movel   #65536,%d3      | read bytes
+               moval   #(BOOT_TEXTADDR-8192-0x200-32),%a1
+               moval   %a1,%a4         | save buffer addr
+               IOCS(__B_READ)
+               jra     boot_read_done
+
+#include "chkfmt.s"
+
+boot_dev_unsupported:
+               BOOT_ERROR("unsupported boot device")
+
+booterr_msg:   .ascii  "\r\n\n"
+               .ascii  BOOT
+               .asciz  ": "
+reboot_msg:    .asciz  "\r\n[Hit key to reboot]"
+               .even
+
+ASENTRY_NOPROFILE(boot_error)
+               lea     %pc@(booterr_msg),%a1
+               IOCS(__B_PRINT)
+               moveal  %sp@+,%a1
+               IOCS(__B_PRINT)
+               lea     %pc@(reboot_msg),%a1
+               IOCS(__B_PRINT)
+
+               | wait for a key press (or release of a modifier)
+               IOCS(__B_KEYINP)
+
+               | issue software reset
+               trap    #10
+               | NOTREACHED
+
+boot_read_done:
+               lea     %a4@(8192),%a1          | USTAR header
+#if 0  /* too big to fit */
+               cmpl    #0x55535441,%a1@        | filename `USTA
+               bne     error_invalidname
+#endif
+               cmpl    #0x522e766f,%a1@(4)     |           R.vo...'
+               bne     error_invalidname
+               cmpl    #0x00757374,%a1@(256)   | magic `\0ust'
+               bne     error_invalidfs
+               cmpl    #0x61722020,%a1@(260)   | magic `ar  '
+               bne     error_invalidfs
+
+               lea     %a1@(0x200),%a2         | a.out header
+               movml   %a2@+,%d0-%d4/%a5
+               addal   #8,%a2                  | start of text
+
+#if 0
+               cmpal   #BOOT_TEXTADDR,%a5
+               bne     error_invalidboot
+#endif
+
+               cmpl    #0x00870107,%d0         | a.out magic
+               bne     error_invalidmagic
+
+               addl    %d2,%d1                 | a_text+a_data
+               movl    %d3,%d4                 | save a_bss
+               addl    %d1,%d3                 | a_text+a_data+a_bss
+
+       /* clear out bss */
+               lea     %a2@(%d1),%a3
+1:             movb    #0,%a3@+
+               subl    #1,%d4
+               bne     1b
+
+               andil   #3,%d4
+               swap    %d4
+               addil   #(B_DEVMAGIC+X68K_MAJOR_FD),%d4
+               movl    #RB_SINGLE,%sp@-        | boothowto
+               movl    %d4,%sp@-               | bootdev
+               movl    %d3,%sp@-               | size
+               pea     %a5@                    | entry
+               pea     %a5@                    | executed
+               pea     %a5@                    | loaded
+
+               jbsr    _C_LABEL(exec_image)
+
+error_invalidname:
+error_invalidfs:
+error_invalidmagic:    BOOT_ERROR("Invalid boot disk")
+
+|
+| void memcpy(void *dst, const void *src, size_t count);
+|
+|      small and slow memcpy...
+|      THIS FUNCTION DOES NOT CONFORM THE ANSI STANDARD
+|
+ENTRY_NOPROFILE(memcpy)
+       lea     %sp@(12),%a1
+       movel   %a1@,%d1        | count
+|      jeq     Lmcpret
+       moveal  %a1@-,%a0       | src
+       moveal  %a1@-,%a1       | dest
+1:     moveb   %a0@+,%a1@+
+       subql   #1,%d1
+       jne     1b
+Lmcpret:
+|      movel   %sp@(8),%d0     | uncomment this to conform ANSI
+       rts
+
+#include "exec_image.S"
+
+ASGLOBAL(first_kbyte)
diff -r 578e1922c5f2 -r 733d49a0d0b6 sys/arch/x68k/stand/boot_ustar/boot_ustar.ldscript
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/x68k/stand/boot_ustar/boot_ustar.ldscript        Fri Sep 28 15:22:21 2001 +0000
@@ -0,0 +1,49 @@
+OUTPUT_FORMAT("a.out-m68k-netbsd", "a.out-m68k-netbsd",
+             "a.out-m68k-netbsd")
+OUTPUT_ARCH(m68k)
+ENTRY(start)
+SEARCH_DIR(/usr/lib);
+/*__DYNAMIC = 0; */
+PROVIDE (__stack = 0);
+SECTIONS
+{
+  . = 0x00002000;
+  .text :
+  {
+    CREATE_OBJECT_SYMBOLS
+    *(.text)
+    *(.rodata)
+    /* The next six sections are for SunOS dynamic linking.  The order
+       is important.  */
+    *(.dynrel)
+    *(.hash)
+    *(.dynsym)
+    *(.dynstr)
+    *(.rules)
+    *(.need)
+    etext = .;
+    _etext = .;
+  }
+/*  . = ALIGN(0x2000); */
+  .data :
+  {
+    /* The first three sections are for SunOS dynamic linking.  */
+    *(.dynamic)
+    *(.got)
+    *(.plt)
+    *(.data)
+    *(.linux-dynamic) /* For Linux dynamic linking.  */
+    CONSTRUCTORS
+    edata  =  .;
+    _edata  =  .;
+  }
+  .bss :
+  {
+    __bss_start = .;
+   *(.bss)
+   *(COMMON)
+   end = ALIGN(4) ;
+   _end = ALIGN(4) ;
+  }
+  /DISCARD/ : { *(.ident) *(.stab) *(.stabstr) }
+}



Home | Main Index | Thread Index | Old Index