Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/sandpoint/stand/altboot With the new boot argument ...



details:   https://anonhg.NetBSD.org/src/rev/8b1c4e31a646
branches:  trunk
changeset: 763214:8b1c4e31a646
user:      phx <phx%NetBSD.org@localhost>
date:      Sun Mar 13 15:23:43 2011 +0000

description:
With the new boot argument "altboot" the program can replace itself with a
new binary while running.
The default boot path was changed from nfs: to wd0:.
Bumped altboot version to 1.7.

diffstat:

 sys/arch/sandpoint/stand/altboot/README.altboot |   9 ++-
 sys/arch/sandpoint/stand/altboot/entry.S        |  67 +++++++++++++++++-------
 sys/arch/sandpoint/stand/altboot/main.c         |  27 ++++++++-
 sys/arch/sandpoint/stand/altboot/version        |   3 +
 4 files changed, 79 insertions(+), 27 deletions(-)

diffs (204 lines):

diff -r 7befda0469e9 -r 8b1c4e31a646 sys/arch/sandpoint/stand/altboot/README.altboot
--- a/sys/arch/sandpoint/stand/altboot/README.altboot   Sun Mar 13 12:58:02 2011 +0000
+++ b/sys/arch/sandpoint/stand/altboot/README.altboot   Sun Mar 13 15:23:43 2011 +0000
@@ -1,6 +1,6 @@
 /// notes about altboot ///
 
-$NetBSD: README.altboot,v 1.1 2011/01/23 01:05:30 nisimura Exp $
+$NetBSD: README.altboot,v 1.2 2011/03/13 15:23:43 phx Exp $
 
 Altboot is a functional bridge to fill the gap between a NAS product
 custom bootloader and the NetBSD kernel startup environment.  Altboot
@@ -17,7 +17,7 @@
   targets to make it possible having common NetBSD kernels for them.
 - builds and hands a bootinfo list to the NetBSD kernel.
 
-Altboot is known working on two models.
+Altboot is known working on at least three models.
 - KuroBox with a popular U-Boot as the replacement of vendor proprietary
 
    U-Boot 1.1.4 LiSt 2.1.0 (Sep 21 2006 - 00:22:56) LinkStation / KuroBox
@@ -26,6 +26,10 @@
 
    PPCBoot 2.0.0 (Mar  1 2005 - 15:31:41)
 
+- D-Link DSM-G600 with heavily restricted vendor custom U-Boot
+
+   U-Boot 0.2.0 (May 26 2005 - 19:38:32)
+
 The standard use of altboot is to invoke it with a short script from
 U-Boot/PPCboot, where the altboot image is stored in an unoccupied 128KB
 section of the target's HW NOR flash.  Combined with standard
@@ -45,4 +49,3 @@
 - preloaded kernel module names (under development).
 
                              ### ### ###
-
diff -r 7befda0469e9 -r 8b1c4e31a646 sys/arch/sandpoint/stand/altboot/entry.S
--- a/sys/arch/sandpoint/stand/altboot/entry.S  Sun Mar 13 12:58:02 2011 +0000
+++ b/sys/arch/sandpoint/stand/altboot/entry.S  Sun Mar 13 15:23:43 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: entry.S,v 1.2 2011/02/26 20:11:24 phx Exp $ */
+/* $NetBSD: entry.S,v 1.3 2011/03/13 15:23:43 phx Exp $ */
 
 #include <powerpc/psl.h>
 #include <powerpc/spr.h>
@@ -24,25 +24,12 @@
         * U-Boot/PPCBoot forgets to flush the cache when using the "bootm"
         * command, so we have to do that now.
         */
-       lis     3,_start@ha
-       addi    3,3,_start@l
-       andi.   3,3,~31@l
-       lis     4,(_edata+31)@ha
-       addi    4,4,(_edata+31)@l
-       mr      5,3
-10:
-       dcbst   0,5
-       addi    5,5,32
-       cmplw   5,4
-       ble     10b
-       sync
-11:
-       icbi    0,3
-       addi    3,3,32
-       cmplw   3,4
-       ble     11b
-       sync
-       isync
+       lis     11,_start@ha
+       addi    11,11,_start@l
+       andi.   11,11,~31@l
+       lis     12,(_edata+31)@ha
+       addi    12,12,(_edata+31)@l
+       bl      syncicache
 
        mfspr   11,SPR_HID0
        andi.   0,11,HID0_DCE
@@ -169,6 +156,46 @@
        bctr
 
 /*
+ * newaltboot(argc, argv, altboot_base, altboot_len)
+ * To be executed in a safe memory region. Copies the new altboot from
+ * altboot_base to 0x1000000 and starts it there.
+ */
+       .globl  newaltboot
+newaltboot:
+       lis     7,0x1000000@h
+       mr      11,7
+       subi    7,7,4
+       subi    5,5,4
+       add     12,11,6
+       addi    6,6,3
+       srawi   6,6,2
+       mtctr   6
+1:     lwzu    8,4(5)
+       stwu    8,4(7)
+       bdnz+   1b
+       mtctr   11
+       addi    12,12,31
+       bl      syncicache
+       bctr
+syncicache:
+/* r11=start, r12=end, r10=scratch */
+       mr      10,11
+2:     dcbst   0,10
+       addi    10,10,32
+       cmplw   10,12
+       ble     2b
+       sync
+3:     icbi    0,11
+       addi    11,11,32
+       cmplw   11,12
+       ble     3b
+       sync
+       isync
+       blr
+       .globl  newaltboot_end
+newaltboot_end:
+
+/*
  * reverse endian access to mimic outw/outl/inw/inl
  */
        .globl out16rb
diff -r 7befda0469e9 -r 8b1c4e31a646 sys/arch/sandpoint/stand/altboot/main.c
--- a/sys/arch/sandpoint/stand/altboot/main.c   Sun Mar 13 12:58:02 2011 +0000
+++ b/sys/arch/sandpoint/stand/altboot/main.c   Sun Mar 13 15:23:43 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: main.c,v 1.11 2011/03/13 01:56:21 phx Exp $ */
+/* $NetBSD: main.c,v 1.12 2011/03/13 15:23:43 phx Exp $ */
 
 /*-
  * Copyright (c) 2007 The NetBSD Foundation, Inc.
@@ -54,7 +54,8 @@
        { "quiet",      AB_QUIET },
        { "verb",       AB_VERBOSE },
        { "silent",     AB_SILENT },
-       { "debug",      AB_DEBUG }
+       { "debug",      AB_DEBUG },
+       { "altboot",    -1 }
 };
 
 void *bootinfo; /* low memory reserved to pass bootinfo structures */
@@ -89,7 +90,9 @@
 int module_open(struct boot_module *);
 
 void main(int, char **, char *, char *);
+
 extern char bootprog_name[], bootprog_rev[];
+extern char newaltboot[], newaltboot_end[];
 
 struct pcidev lata[2];
 struct pcidev lnif[1];
@@ -104,7 +107,7 @@
 static int parse_cmdline(char **, int, char *, char *);
 static int is_space(char);
 
-#define        BNAME_DEFAULT "nfs:"
+#define        BNAME_DEFAULT "wd0:"
 #define MAX_ARGS 10
 
 void
@@ -113,6 +116,7 @@
        struct brdprop *brdprop;
        unsigned long marks[MARK_MAX];
        char *new_argv[MAX_ARGS];
+       ssize_t len;
        int n, i, fd, howto;
        char *bname;
 
@@ -232,7 +236,22 @@
        }
        printf("loading \"%s\" ", bi_path.bootpath);
        marks[MARK_START] = 0;
-       if (fdloadfile(fd, marks, LOAD_KERNEL) < 0)
+
+       if (howto == -1) {
+               /* load another altboot binary and replace ourselves */
+               len = read(fd, (void *)0x100000, 0x1000000 - 0x100000);
+               if (len == -1)
+                       goto loadfail;
+               close(fd);
+               netif_shutdown_all();
+
+               memcpy((void *)0xf0000, newaltboot,
+                   newaltboot_end - newaltboot);
+               __syncicache((void *)0xf0000, newaltboot_end - newaltboot);
+               printf("Restarting...\n");
+               run((void *)1, argv, (void *)0x100000, (void *)len,
+                   (void *)0xf0000);
+       } else if (fdloadfile(fd, marks, LOAD_KERNEL) < 0)
                goto loadfail;
        close(fd);
 
diff -r 7befda0469e9 -r 8b1c4e31a646 sys/arch/sandpoint/stand/altboot/version
--- a/sys/arch/sandpoint/stand/altboot/version  Sun Mar 13 12:58:02 2011 +0000
+++ b/sys/arch/sandpoint/stand/altboot/version  Sun Mar 13 15:23:43 2011 +0000
@@ -6,3 +6,6 @@
 1.4:   load kernels from local disk
 1.5:   altboot is the new name as this is capable of handling net & dsk.
 1.6:   build altboot.img to fake a Linux kernel module, supports bootargs
+1.7:   ST1023/IP1000A driver, load kernels from memory (mem:), possibility
+       to replace altboot with a new version while running, interactive
+       mode, default boot path is now wd0:netbsd in multiuser mode



Home | Main Index | Thread Index | Old Index