diff packages/hal/arm/arch/current/src/redboot_linux_exec.c @ 498:ae6f2695b07a

Misc fixes to Linux boot code - from Patrick Doyle
author gthomas
date Fri, 17 Jan 2003 16:49:11 +0000
parents 94b558c9fb67
children 9ffbb7d747b0
line wrap: on
line diff
--- a/packages/hal/arm/arch/current/src/redboot_linux_exec.c
+++ b/packages/hal/arm/arch/current/src/redboot_linux_exec.c
@@ -159,7 +159,14 @@ struct tag_ramdisk {
     u32 start;
 };
 
+/*
+ * this one accidentally used virtual addresses - as such,
+ * its depreciated.
+ */
 #define ATAG_INITRD	0x54410005
+
+/* describes where the compressed ramdisk image lives (physical address) */
+#define ATAG_INITRD2	0x54420005
 struct tag_initrd {
     u32 start;
     u32 size;
@@ -265,6 +272,9 @@ do_exec(int argc, char *argv[])
 
     base_addr = load_address;
     length = load_address_end - load_address;
+    // Round length up to the next quad word
+    length = (length + 3) & ~0x3;
+
     ramdisk_size = 4096*1024;
     init_opts(&opts[0], 'w', true, OPTION_ARG_TYPE_NUM, 
               (void **)&wait_time, (bool *)&wait_time_set, "wait timeout");
@@ -301,13 +311,12 @@ do_exec(int argc, char *argv[])
      * Don't double it if it's already a power of two, though.
      */
     params->u.mem.size  = 1<<hal_msbindex(CYGMEM_REGION_ram_SIZE);
-    if (params->u.mem.size < CYGMEM_REGION_ram_SIZE << 1)
+    if (params->u.mem.size < CYGMEM_REGION_ram_SIZE)
 	    params->u.mem.size <<= 1;
     params = (struct tag *)((long *)params + params->hdr.size);
-
     if (ramdisk_addr_set) {
         params->hdr.size = (sizeof(struct tag_initrd) + sizeof(struct tag_header))/sizeof(long);
-        params->hdr.tag = ATAG_INITRD;
+        params->hdr.tag = ATAG_INITRD2;
         params->u.initrd.start = CYGARC_PHYSICAL_ADDRESS(ramdisk_addr);
         params->u.initrd.size = ramdisk_size;
         params = (struct tag *)((long *)params + params->hdr.size);