From: Pete Popov <ppopov@mvista.com>
To: Geoffrey Espin <espin@idiom.com>
Cc: Krishna Kondaka <krishna@sanera.net>,
linux-mips <linux-mips@oss.sgi.com>
Subject: Re: No bzImage target for MIPS
Date: 14 Dec 2001 10:05:47 -0800 [thread overview]
Message-ID: <1008353149.27799.144.camel@zeus> (raw)
In-Reply-To: <20011213192846.A36207@idiom.com>
On Thu, 2001-12-13 at 19:28, Geoffrey Espin wrote:
>
> > > There is no "bzImage" target in the mips linux Makefiles. Could
> > > you tell me why this is missing? If I want to generate a
> > > compressed image for linux on MIPS, how do I do it?
>
> I guess Bill Gates was right, he practically created the Open
> Source movement by "providing" an excellent BIOS. </sarcasm>
>
> One of Embedded Linux's unspoken "problems" is lack of truly
> universal boot program. GRUB is as univeral as x86, not!
> Ppcboot is one of the best, but notice the 'ppc' in the name?
> I gather that PMON is used by many in MIPS... but that is another
> secret you won't find revealed, even in Jun Sun's execellent MIPS
> Porting Guide. :-)
The "original" pmon has outlived its purpose, although it's still found
on many boards. I've become a fan of MIPS Tech's yamon; it's small, it
works, it has just the features I need in an embedded system, and, did I
say it works?. Unfortunately the code is released under NDA only. If
MIPS opened the code, I think you would see it on many more boards.
> COming from a certain proprietary RTOS, I believe, using the OS
> itself, as the "boot monitor" is best approach. All reusable
> code, fastest bootstrap (i.e. no 2nd stage loading), etc... But,
> of course, not optimal for size, though my image is 1.3M which
> includes a 580K cramfs ramdisk.
That's fine once you've ported the kernel to your board. What do you do
before that point?
> > Download the linux-mips drop-in tree from sourceforge.net. Take a look
> > at arch/mips/zboot. The only zImage support in that directory is for
> > the Alchemy Pb1000 board. That's one way to do it and I basically
>
> I finally did rework this. I have a single 360 line "<board>/misc.c" file,
> a <board>/Boot.make included by arch/linux/boot/Makefile, and <board>/boot.S.
> There is no cut & pasting of code elsewhere in the linux tree, there are
> no new directories (zboot, compressed, blah-blah). Its just glue that
> sticks in front of vmlinux.bin.gz. Where <board> is Korva (AKA Markham),
> for now. Support for compressed, or not, plus linking a kernel to run
> at low memory or high. Running at 'high' allows the kernel to load
> another kernel into 'low' memory without burning flash. All selectable
> from "make menuconfig".
>
> Keeping up with sf.net is one of my failings... so no patch, sorry.
> Attached are the key files, if anyone thinks this is worth pursuing.
That's OK, I'm sure someone with interest in the Korva can create the
patch. But I fail to see how having this code in every <board>
directory is better than having a separate boot directory like the ppc
arch. The ppc-like zImage support I added is a bit different from the
patch below. It assumes that you do have a boot loader and the 'kernel
loader' is basically separate from the kernel image itself. Adding
initrd support that's not statically compiled in the kernel should be
pretty easy and I like that approach better than statically compiled
initrd images.
Pete
> Geoff
> --
> Geoffrey Espin espin@idiom.com
> --
>
> =misc.c=========================================================================
> /*
> * For Korva/Markham MIPS by Geoffrey Espin espin@idiom.com
> * Based on numerous predecessors including...
> *
> * Author: Johnnie Peters <jpeters@mvista.com>
> * Editor: Tom Rini <trini@mvista.com>
> * Ported by Pete Popov <ppopov@mvista.com> to
> * Copyright 2000-2001 MontaVista Software Inc.
> *
> * This program is free software; you can redistribute it and/or modify it
> * under the terms of the GNU General Public License as published by the
> * Free Software Foundation; either version 2 of the License, or (at your
> * option) any later version.
> *
> * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
> * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
> * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
> * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
> * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> *
> * You should have received a copy of the GNU General Public License along
> * with this program; if not, write to the Free Software Foundation, Inc.,
> * 675 Mass Ave, Cambridge, MA 02139, USA.
> */
>
> #include <linux/config.h>
>
> #include <stdarg.h>
> #include <asm/page.h>
>
> #include "../../../fs/jffs2/zlib.c" /**/
> #include "../../../lib/ctype.c"
> #undef __HAVE_ARCH_MEMCPY
> #undef __HAVE_ARCH_MEMSET
> #include "../../../lib/string.c"
> #define CONFIG_REMOTE_DEBUG
> #include "../korva/dbg_io.c"
>
> extern char _end[]; /* end of bss */
>
> int printk(const char *fmt, ...);
> void putc(const char c);
>
> void gunzip(void *, int, unsigned char *, int *);
>
> /* NEC KORVA/MARKHAM */
> #define DELAY(n) { volatile int x,y; for (x=0;x<100000*(n);x++) y=x; }
> #define LED(n) *(volatile unsigned char*)0xb000001c = (n)
>
> #define ZIMAGE_OFFSET 0x00010000 /* 64k per Makefile/VMA/vrboot */
> #define ZIMAGE_SIZE 0x00200000 /* 2M */
>
> #define AVAIL_RAM_START (PAGE_ALIGN((int)_end)) /* scratch area after image */
> #define AVAIL_RAM_SIZE 0x00100000 /* 1M */
>
> char *avail_ram; /* used by zalloc */
> char *end_avail;
>
> void
> decompress_kernel(void)
> {
> char *zimage_start;
> int zimage_size;
> int i;
>
> for (i = 0; i < 8; i++) {
> LED(1 << (7 - i));
> DELAY(5);
> }
>
> /* fix for dbg_io.c on Korva/Markham */
> *((volatile uint8 *) (0xb0000000 + 0)) |= 0x8; /* GMR = 0x8 UCSEL (uart) */
> avail_ram = (char *) AVAIL_RAM_START; /* used by zalloc */
> end_avail = (char *) (AVAIL_RAM_START + AVAIL_RAM_SIZE);
>
> zimage_start = (char *) (FLASHADDR + ZIMAGE_OFFSET);
> zimage_size = ZIMAGE_SIZE;
>
> printk("\nUncompressing from %#x to %#x\n", zimage_start, LOADADDR);
>
> #if 0
> printk("zImage [0-4]: %#x %#x %#x %#x\n",
> ((unsigned long *) zimage_start)[0],
> ((unsigned long *) zimage_start)[1],
> ((unsigned long *) zimage_start)[2],
> ((unsigned long *) zimage_start)[3]);
> #endif
>
> gunzip((void *) LOADADDR, 0x00400000, zimage_start, &zimage_size);
>
> #if 0
> printk("entry [0-4]: %#x %#x %#x %#x (at %#x size %d)\n",
> ((unsigned long *) KERNEL_ENTRY)[0],
> ((unsigned long *) KERNEL_ENTRY)[1],
> ((unsigned long *) KERNEL_ENTRY)[2],
> ((unsigned long *) KERNEL_ENTRY)[3], KERNEL_ENTRY, zimage_size);
> #endif
>
> printk("Booting Linux at %#x\n", KERNEL_ENTRY);
>
> for (i = 0; i < 8; i++) {
> LED(1 << (i));
> DELAY(5);
> }
>
> /* XXX returning and letting boot.S jump used to work? */
> if (1) {
> __asm__ __volatile__("jr\t%0"::"r"(KERNEL_ENTRY));
> }
> }
>
> void
> exit(void)
> {
> printk("\nexit\n");
> while (1) ;
> }
>
> void
> putc(const char c)
> {
> #define serial_putc(ch) putDebugChar(ch)
>
> serial_putc(c);
> if (c == '\n')
> serial_putc('\r');
> }
>
> void *
> zalloc(void *x, unsigned items, unsigned size)
> {
> void *p = avail_ram;
>
> size *= items;
> size = (size + 7) & -8;
> avail_ram += size;
> if (avail_ram > end_avail) {
> printk("oops... zalloc(%#x, %d, %#x) out of memory\n",
> (int) x, items, size);
> p = NULL;
> }
> return p;
> }
>
> void
> zfree(void *x, void *addr)
> {
> }
>
> void
> gunzip(void *dst, int dstlen, unsigned char *src, int *lenp)
> {
> #define HEAD_CRC 2
> #define EXTRA_FIELD 4
> #define ORIG_NAME 8
> #define COMMENT 0x10
> #define RESERVED 0xe0
>
> #define DEFLATED 8
>
> z_stream s;
> int r, i, flags;
>
> /* skip header */
> i = 10;
> flags = src[3];
> if (src[2] != DEFLATED || (flags & RESERVED) != 0) {
> printk("bad gzipped data\n");
> exit();
> }
> if ((flags & EXTRA_FIELD) != 0)
> i = 12 + src[10] + (src[11] << 8);
> if ((flags & ORIG_NAME) != 0)
> while (src[i++] != 0) ;
> if ((flags & COMMENT) != 0)
> while (src[i++] != 0) ;
> if ((flags & HEAD_CRC) != 0)
> i += 2;
> if (i >= *lenp) {
> printk("gunzip: ran out of data in header\n");
> exit();
> }
>
> s.zalloc = zalloc;
> s.zfree = zfree;
> r = inflateInit2(&s, -MAX_WBITS);
> if (r != Z_OK) {
> printk("inflateInit2 returned %#x\n", r);
> exit();
> }
> s.next_in = src + i;
> s.avail_in = *lenp - i;
> s.next_out = dst;
> s.avail_out = dstlen;
> r = inflate(&s, Z_FINISH);
> if (r != Z_OK && r != Z_STREAM_END) {
> printk("inflate returned %#x\n", r);
> exit();
> }
> *lenp = s.next_out - (unsigned char *) dst;
> inflateEnd(&s);
> }
>
> int
> _cvt(unsigned long val, char *buf, long radix, char *digits)
> {
> char temp[80];
> char *cp = temp;
> int length = 0;
> if (val == 0) { /* Special case */
> *cp++ = '0';
> } else
> while (val) {
> *cp++ = digits[val % radix];
> val /= radix;
> }
> while (cp != temp) {
> *buf++ = *--cp;
> length++;
> }
> *buf = '\0';
> return (length);
> }
>
> #define is_digit(c) ((c >= '0') && (c <= '9'))
>
> void
> _vprintk(void (*putc) (const char), const char *fmt0, va_list ap)
> {
> char c, sign, *cp = 0;
> int left_prec, right_prec, zero_fill, length = 0, pad, pad_on_right;
> char buf[32];
> long val;
>
> while ((c = *fmt0++)) {
> if (c == '%') {
> c = *fmt0++;
> left_prec = right_prec = pad_on_right = 0;
> if (c == '#')
> c = *fmt0++; /* ignore alternate fmt */
>
> if (c == '-') {
> c = *fmt0++;
> pad_on_right++;
> }
> if (c == '0') {
> zero_fill = 1;
> c = *fmt0++;
> } else {
> zero_fill = 0;
> }
> while (is_digit(c)) {
> left_prec = (left_prec * 10) + (c - '0');
> c = *fmt0++;
> }
> if (c == '.') {
> c = *fmt0++;
> zero_fill++;
> while (is_digit(c)) {
> right_prec =
> (right_prec * 10) + (c - '0');
> c = *fmt0++;
> }
> } else {
> right_prec = left_prec;
> }
>
> sign = '\0';
> switch (c) {
> case 'd':
> case 'x':
> case 'X':
> val = va_arg(ap, long);
> switch (c) {
> case 'd':
> if (val < 0) {
> sign = '-';
> val = -val;
> }
> length =
> _cvt(val, buf, 10, "0123456789");
> break;
> case 'x':
> length =
> _cvt(val, buf, 16,
> "0123456789abcdef");
> break;
> case 'X':
> length =
> _cvt(val, buf, 16,
> "0123456789ABCDEF");
> break;
> }
> cp = buf;
> break;
> case 's':
> cp = va_arg(ap, char *);
> length = strlen(cp);
> break;
> case 'c':
> c = va_arg(ap, long /*char */ );
> (*putc) (c);
> continue;
> default:
> (*putc) ('?');
> }
> pad = left_prec - length;
> if (sign != '\0') {
> pad--;
> }
> if (zero_fill) {
> c = '0';
> if (sign != '\0') {
> (*putc) (sign);
> sign = '\0';
> }
> } else {
> c = ' ';
> }
> if (!pad_on_right) {
> while (pad-- > 0) {
> (*putc) (c);
> }
> }
> if (sign != '\0') {
> (*putc) (sign);
> }
> while (length-- > 0) {
> (*putc) (c = *cp++);
> if (c == '\n') {
> (*putc) ('\r');
> }
> }
> if (pad_on_right) {
> while (pad-- > 0) {
> (*putc) (c);
> }
> }
> } else {
> (*putc) (c);
> if (c == '\n') {
> (*putc) ('\r');
> }
> }
> }
> }
>
> int
> printk(const char *fmt, ...)
> {
> va_list args;
> va_start(args, fmt);
> _vprintk(putc, fmt, args);
> va_end(args);
> return 0;
> }
>
> =boot.S=========================================================================
> /*
> * boot.S
> *
> * Modified by Geoffrey Espin <espin@idiom.com> for NEC Electronics
> *
> * Copyright (C) 1999 Bradley D. LaRonde
> * Copyright (C) 2001 Dai Itasaka <Daisaku_Itasaka@el.nec.com>
> *
> * This file is subject to the terms and conditions of the GNU General Public
> * License. See the file "COPYING" in the main directory of this archive
> * for more details.
> */
>
> #include <linux/config.h>
>
> #include <asm/asm.h>
> #include <asm/regdef.h>
> #include <asm/addrspace.h>
> #include <asm/mipsregs.h>
>
> #define FLASH_BEGIN (FLASHADDR+0x00010000) // skip first 64k (this program)
> #define FLASH_END (FLASHADDR+0x00400000) // 4M; see Boot.make
>
>
> /*
> EC:7(CPU clock / 1), EP:0(1word/1cycle), AD:0(VR4000 compatible)
> M16:0(Disable), BE:1(Big endian), CS:1(+10), IC:4(16K), DC:3(8K)
> K0:2(Disable)
>
> 31 30 28 27 24 23 22 21 19 18 17 16 15 14 13 12 11 9 8 6 5 3 2 0
> +---+-----+-----+---+-----+---+---+---+---+---+-----+---+-----+----+---+----+
> | 0 | EC | EP | AD| 0 |M16| 0 | 1 | 0 | BE| 1 0 | CS| IC | DC | 0 | K0 |
> +---+-----+-----+---+-----+---+---+---+---+---+-----+---+-----+----+---+----+
> EC : Tclock rate, EP : Transfer data pattern setting,
> AD : Accelerate data mode, M16 : MIPS16 ISA mode enable
> BE : BigEndian, CS : Cache Size mode Indication(fixed to 1)
> IC : Instruction Cache Size, DC : Data Cache Size,
> K0 : kseg0 coherency algorithm
>
> See uPD98501 Preliminary User's Manual, Chapter 2, page 156.
> */
>
> #define KORVA_CONFIG_INIT_VAL_BE 0x7002d8c2 /*BE*/
> #define KORVA_CONFIG_INIT_VAL 0x700258c2 /*LE*/
>
>
> #define DEBUG
> #ifdef DEBUG
> #define DEBUG_LED 0xb000001c
> #define CHECKPOINT(n) li t4, n; sw t4, DEBUG_LED;
> #else
> #define CHECKPOINT(n)
> #endif
>
> LEAF(__start)
> .set mips3
> .set noreorder
>
> nop // patched by script if using Kyoto-Micro ROM Emulator
> nop
> nop
>
> mtc0 zero, CP0_STATUS // disable interrupts
> mtc0 zero, CP0_CAUSE // clear interrupts
> li t0, KORVA_CONFIG_INIT_VAL
> mtc0 t0, CP0_CONFIG // make sure the cache is disabled
> mtc0 zero, CP0_WATCHLO
> mtc0 zero, CP0_WATCHHI // disable watch exception
>
> CHECKPOINT(0xB1)
>
> /* setup_hardware (was function, now PIC as may be linked at RAM) */
>
> // check if the CPU is running at 66MHz or 100MHz
> lui t0, 0xb000
> lw t1, 4(t0) // 0xb0000004 = GSR
> li t0, 2 // CCLKSEL
> and t0, t0, t1
> beq zero, t0, clk100
> lui t0, 0xb000
>
> clk66:
> li t1, 0x120 // SDMDR
> sw t1, 0x108(t0) // *(0xb0000108) = 0x120;
> li t1, 0x000 // SDPTR
> sw t1, 0x110(t0) // *(0xb0000110) = 0x000;
>
> beq zero, zero, 1f
> nop
>
> clk100:
> li t1, 0x230 // SDMDR
> sw t1, 0x108(t0) // *(0xb0000108) = 0x230;
> li t1, 0x021 // SDPTR
> sw t1, 0x110(t0) // *(0xb0000110) = 0x021;
>
> 1:
> #if defined(CONFIG_NEC_MARKHAM_32MB)
> li t1, 0x3c2 // SDTSR 32M
> // CAB=0x02, RAB=0x40 BTM=0x0080 SIZE=0x300(32M)
> #else
> li t1, 0x1a1 // SDTSR 8M
> // CAB=0x01, RAB=0x20 BTM=0x0080 SIZE=0x100(8M)
> #endif
> sw t1, 0x10c(t0) // *(0xb000010c) = 0x1a1/0x3c2;
>
> // allow writing to flash parts
> li t1, 0x100 // RMMDR (00 4MB mode) WM=1 unmasked
> sw t1, 0x100(t0) // *(0xb0000100) = 0x000;
>
> li t1, 0x003 // RMATR FAT_8
> sw t1, 0x104(t0) // *(0xb0000104) = 0x003;
>
> li t1, 0x000 // IMR
> sw t1, 0x00c(t0) // disable all INTs
>
> nop
> /* end of setup_hardware */
>
> CHECKPOINT(0xB2)
>
> /* invalidate_cache (was function, now PIC as may be linked at RAM) */
>
> mtc0 zero, CP0_TAGLO // invalidate the instruction cache
> li s0, 0x80000000
> li s1, 0x80000000 + (1 << 14) // 16k
> 1:
> cache (2 << 2) | 0, (s0)
> add s0, 0x10
> bne s0, s1, 1b
> nop
>
> mtc0 zero, CP0_TAGLO // invalidate the data cache
> li s0, 0x80000000
> li s1, 0x80000000 + (1 << 13) // 8k
> 1:
> cache (2 << 2) | 1, (s0)
> add s0, 0x10
> bne s0, s1, 1b
> nop
>
> nop
> /* end of invalidate_cache */
>
> CHECKPOINT(0xB3)
>
> mfc0 t0, CP0_CONFIG // enable kseg0 caching
> ori t0, 0x1 // cached
> mtc0 t0, CP0_CONFIG
>
> CHECKPOINT(0xB4)
>
> #ifdef CONFIG_NEC_KORVA_COMPRESSED
> relocate:
> la sp, .stack
> move s0, a0
> move s1, a1
> move s2, a2
> move s3, a3
>
> la a0, __start
>
> li a1, FLASHADDR
> la a2, _edata
> subu t1, a2, a0
> srl t1, t1, 2
>
> /* copy text section */
> li t0, 0
> 1: lw v0, 0(a1)
> nop
> sw v0, 0(a0)
> xor t0, t0, v0
> addu a0, 4
> bne a2, a0, 1b
> addu a1, 4
>
> /* clear BSS */
> la a0, _edata
> la a2, _end
> 2: sw zero, 0(a0)
> bne a2, a0, 2b
> addu a0, 4
>
> /* now that code is in RAM we can jump okay */
>
> // decompress kernel to ram
> la ra, 1f
> la t4, decompress_kernel // elsewhere in 'C'
> jr t4
> #else
> /* actually we were linked at ROM so we're okay */
>
> // copy kernel to ram
> la ra, 1f
> la t4, copy_kernel
> jr t4
> #endif
> nop
> 1:
>
> CHECKPOINT(0xB5)
>
> // jump to kernel entry point
> li t4, KERNEL_ENTRY
> jr t4
> nop
>
> nop
> END(__start)
>
>
> LEAF(copy_kernel)
> // copy kernel from ROM to RAM
>
> // Load s0 = src, s1 = src_end, s2 = dest.
> li s0, FLASH_BEGIN
> li s1, FLASH_END
>
> li s2, LOADADDR
>
> sw zero, (s2)
> sw zero, 4(s2)
> sw zero, 8(s2)
> sw zero, 12(s2)
>
> 1:
> // Only update LED once in a while.
> and t0, s0, 0xffff
> bne t0, zero, 2f
>
> // Show copy progress on LED.
> srl t0, s0, 16
> sh t0, DEBUG_LED
>
> 2:
> // Copy src to dest.
> lw t0, (s0)
> bne t0, zero, 3f
> nop
> sw zero, (s2)
> beq zero, zero, 4f
> nop
> 3:
> sw t0, (s2)
> 4:
> // Increment src and dest.
> add s0, 4
> add s2, 4
>
> // Loop if still more to go.
> bne s0, s1, 1b
> nop
>
> jr ra
> nop
> END(copy_kernel)
>
> #ifdef CONFIG_NEC_KORVA_COMPRESSED
> .comm .stack,4096*2,4 // used by relocate to call 'C' program
> #endif
>
> =Boot.make======================================================================
> # Boot.make - used by ../boot/Makefile
>
> OBJCOPY = mipsel-linux-objcopy
> OBJCOPY_FLAGS = -R .stab -R .stabstr -R .comment -R .note -R .reginfo -R .mdebug
> OBJDUMP = mipsel-linux-objdump
> #OBJDUMP_HFLAGS = --disassemble-all -b srec -m mips:4600 -EL
>
> TOPDIR = ../../..
>
> ifeq ($(LINUX_SRC),)
> LINUX_SRC=$(TOPDIR)
> endif
> VMLINUX=$(LINUX_SRC)/vmlinux
> SYSTEM_MAP=$(LINUX_SRC)/System.map
>
> ifeq ($(USERLAND),)
> USERLAND=$(LINUX_SRC)/../userland
> endif
>
> FLASHADDR = 0xbfc00000
>
> # see arch/mips/Makefile LOADADDR
> # 0x10000 bottom 64k reserved by/for boot.S (FLASH_BEGIN)
> # 0x02000 additional 8k reserved RAM image vector table (see LOADADDR)
>
> ifdef CONFIG_NEC_MARKHAM_BOOTROM
> NN=10#in hex is 16M
> LOADADDR += 0x81002000
> ZLOADADDR += 0x81402000# +4M
> VMA = 0x7f00e000 # 0x0-0x81000000+0x10000-0x2000
> ZVMA = 0x7ebfe000 # 0x0-0x81402000
> else
> NN=00
> LOADADDR += 0x80002000
> ZLOADADDR += 0x80402000# +4M
> VMA = 0x8000e000 # 0x0-0x80000000+0x10000-0x2000
> ZVMA = 0x7fbfe000 # 0x0-0x80402000
> endif
>
> KERNEL_ENTRY=$(shell awk '/kernel_entry/{print "0x" $$1}' $(LINUX_SRC)/System.map)
>
> override CFLAGS += -DKERNEL_ENTRY=$(KERNEL_ENTRY) -DNN=$(NN)
> override CFLAGS += -DLOADADDR=$(LOADADDR) -DFLASHADDR=$(FLASHADDR) -DZLOADADDR=$(ZLOADADDR)
>
> ifdef CONFIG_NEC_KORVA_COMPRESSED
> zbootroms: bin zsrec
> else
> bootroms: bin srec
> endif
>
> $(TOPDIR)/arch/$(ARCH)/ld.script.$(ZLOADADDR)_z: $(TOPDIR)/arch/$(ARCH)/ld.script.in
> sed -e 's/kernel_entry/__start/' -e 's/@@LOADADDR@@/$(ZLOADADDR)/' <$< >$@
>
> ZLINKFLAGS += -T $(TOPDIR)/arch/$(ARCH)/ld.script.$(ZLOADADDR)_z
>
> misc.c: ../korva/misc.c
> @rm -f $@
> cp $< $@
>
> boot.S: ../korva/boot.S
> @rm -f $@
> cp $< $@
>
> #vrboot$(NN): boot.o
> vrboot$(NN): boot.o misc.o $(TOPDIR)/arch/$(ARCH)/ld.script.$(ZLOADADDR)_z
> @rm -f $@
> ifdef CONFIG_NEC_KORVA_COMPRESSED
> $(LD) $(LDFLAGS) -static -EL -N -o $@ $(ZLINKFLAGS) boot.o misc.o
> else
> $(LD) $(LDFLAGS) -static -EL -N -o $@ -Ttext $(FLASHADDR) boot.o
> endif
> @rm -f $^ ../boot/misc.c ../boot/boot.S
>
> vmlinux$(NN): $(VMLINUX)
> @rm -f System$(NN).map
> cp -p $(SYSTEM_MAP) System$(NN).map
> cp -p $< $@
>
> # move sections to 0, then add bfc00000 for ROMulator
> vrvmlinux$(NN)-0: vmlinux$(NN) vrboot$(NN)
> @rm -f $@
> $(OBJCOPY) $(OBJCOPY_FLAGS) --change-addresses 0 -O binary \
> vrboot$(NN) vrboot$(NN)-0.bin
> $(OBJCOPY) $(OBJCOPY_FLAGS) --change-addresses $(VMA) \
> vmlinux$(NN) vmlinux$(NN)-0
> $(OBJCOPY) $(OBJCOPY_FLAGS) --add-section .vrboot=vrboot$(NN)-0.bin \
> --set-section-flags .vrboot=,alloc,load,readonly,code \
> vmlinux$(NN)-0 vrvmlinux$(NN)-0
>
> vrvmlinux$(NN)-bfc: vrvmlinux$(NN)-0
> $(OBJCOPY) $(OBJCOPY_FLAGS) --change-address $(FLASHADDR) \
> vrvmlinux$(NN)-0 vrvmlinux$(NN)-bfc
>
> # xxx-bfc.bin is for 'reload' & 'reburn' used on a running system
> vrvmlinux$(NN)-bfc.bin: vrvmlinux$(NN)-0
> $(OBJCOPY) $(OBJCOPY_FLAGS) --change-address $(FLASHADDR) -O binary \
> vrvmlinux$(NN)-0 vrvmlinux$(NN)-bfc.bin
>
> bin: vrvmlinux$(NN)-bfc vrvmlinux$(NN)-bfc.bin
>
> vrvmlinux$(NN)-0.srec: vrvmlinux$(NN)-0
> $(OBJCOPY) $(OBJCOPY_FLAGS) -O srec --srec-forceS3 --gap-fill 0 \
> vrvmlinux$(NN)-0 vrvmlinux$(NN)-0.srec
> $(OBJCOPY) $(OBJCOPY_FLAGS) --change-address $(FLASHADDR) -O srec \
> vrvmlinux$(NN)-0 vrvmlinux$(NN)-bfc.srec
>
> srec: vrvmlinux$(NN)-0.srec
>
> # used by 'reburn' script for Korva (8M) which needs small 256K chunks
> split:
> @rm -rf split
> @mkdir split
> cd split && split -b 256k ../vrvmlinux00-bfc.bin vrvm
>
> # compressed...
>
> vmlinux$(NN).bin.gz: vmlinux$(NN)
> $(OBJCOPY) -S -O binary $< $<.bin
> gzip -vf $<.bin
>
> zvrvmlinux$(NN)-0: vmlinux$(NN).bin.gz vrboot$(NN)
> @rm -f $@
> $(OBJCOPY) $(OBJCOPY_FLAGS) --change-addresses=$(ZVMA) \
> vrboot$(NN) zvrboot$(NN)-0
> $(OBJCOPY) $(OBJCOPY_FLAGS) --add-section .vmlinux=vmlinux$(NN).bin.gz \
> --change-section-address .vmlinux=0x10000 \
> --set-section-flags .vmlinux=,alloc,load,readonly,code \
> zvrboot$(NN)-0 zvrvmlinux$(NN)-0
>
> zvrvmlinux$(NN)-0.srec: zvrvmlinux$(NN)-0
> $(OBJCOPY) $(OBJCOPY_FLAGS) -O srec --srec-forceS3 \
> zvrvmlinux$(NN)-0 zvrvmlinux$(NN)-0.srec
> $(OBJCOPY) $(OBJCOPY_FLAGS) -O srec --srec-forceS3 \
> --change-address 0xbfc00000 \
> zvrvmlinux$(NN)-0 zvrvmlinux$(NN)-bfc.srec
>
> zsrec: zvrvmlinux$(NN)-0.srec
>
> clean::
> @rm -f System* vrvmlinux* vmlinux* vrboot* zvrvmlinux*
> ================================================================================
next prev parent reply other threads:[~2001-12-14 19:22 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-12-14 0:47 No bzImage target for MIPS Krishna Kondaka
2001-12-14 1:10 ` Pete Popov
2001-12-14 3:28 ` Geoffrey Espin
2001-12-14 3:51 ` Keith Owens
2001-12-14 4:12 ` Geoffrey Espin
2001-12-14 18:05 ` Pete Popov [this message]
2001-12-14 18:52 ` Geoffrey Espin
2001-12-14 19:11 ` Pete Popov
2001-12-15 8:31 ` Karsten Merker
2001-12-15 9:14 ` Keith Owens
2001-12-15 12:46 ` Florian Lohoff
2001-12-17 20:32 ` Ralf Baechle
2001-12-17 13:12 ` Maciej W. Rozycki
2001-12-15 12:42 ` Florian Lohoff
-- strict thread matches above, loose matches on Subject: below --
2001-12-14 0:55 Marc Karasek
2001-12-14 22:59 Marc Karasek
2001-12-14 23:42 ` Pete Popov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1008353149.27799.144.camel@zeus \
--to=ppopov@mvista.com \
--cc=espin@idiom.com \
--cc=krishna@sanera.net \
--cc=linux-mips@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox