armv7: make compile on Ubuntu 14.04 (GCC 4.8.2)
authorSimon Gerber <simon.gerber@inf.ethz.ch>
Mon, 18 Jul 2016 08:01:01 +0000 (10:01 +0200)
committerSimon Gerber <simon.gerber@inf.ethz.ch>
Mon, 18 Jul 2016 08:02:50 +0000 (10:02 +0200)
 * add __attribute__((noreturn)) for stuff in kernel/armv7 that calls panic().
 * add missing return statement in lib/multiboot.
 * Update README with needed freebsd-glue and libelf-freebsd-dev packages for
   arm_boot
 * cleanup format strings in arm_boot/arm_bootimage.c
 * fix compileNativeC to put linker flags after source file in
   hake/RuleDefs.hs

Signed-off-by: Simon Gerber <simon.gerber@inf.ethz.ch>

README
hake/RuleDefs.hs
kernel/arch/armv7/boot_driver.c
kernel/arch/armv7/plat_omap44xx.c
kernel/arch/armv7/plat_zynq7.c
kernel/arch/armv7/startup_arch.c
lib/multiboot/grubmenu.c
tools/arm_boot/arm_bootimage.c

diff --git a/README b/README
index a404ed8..e7943d7 100644 (file)
--- a/README
+++ b/README
@@ -94,7 +94,7 @@ of writing), this means the following:
    - On Ubuntu LTS, install the following packages: 
      libghc-mtl-dev libghc-ghc-mtl-dev cabal-install libghc-src-exts-dev
      libghc-async-dev libghc-ghc-paths-dev libghc-parsec3-dev
-     libghc-random-dev 
+     libghc-random-dev freebsd-glue libelf-freebsd-dev
    - Then, run cabal-install bytestring-trie
 
 Building
index 521b78c..688798d 100644 (file)
@@ -887,8 +887,9 @@ compileNativeC prog cfiles cflags ldflags localLibs =
             Str "$(CFLAGS)",
             Str "$(LDFLAGS)" ]
           ++ [ (Str flag) | flag <- cflags ]
-          ++ [ (Str flag) | flag <- ldflags ]
           ++ [ (In SrcTree "src" dep) | dep <- cfiles ]
+          -- source file needs to be left of ldflags for modern-ish GCC
+          ++ [ (Str flag) | flag <- ldflags ]
           ++ [ In BuildTree "tools" ("/lib" </> ("lib" ++ l ++ ".a")) |
                l <- localLibs ])
 
index 1c4aab4..79d8325 100644 (file)
@@ -173,6 +173,7 @@ init_bootargs(void) {
  * \param pointer address of \c multiboot_info on the BSP; or the
  * global structure if we're on an AP. 
  */
+__attribute__((noreturn))
 void boot(void *pointer, void *cpu_driver_entry)
 {
     /* If this pointer has been modified by the loader, it means we're got a
index 552c50e..e57bfa4 100644 (file)
@@ -136,8 +136,12 @@ size_t platform_get_ram_size(void)
  *
  * \returns Zero on successful boot, non-zero (error code) on failure
  */
+// XXX: panic() messes with GCC, remove attribute when code works again!
+__attribute__((noreturn))
 int platform_boot_aps(coreid_t core_id, genvaddr_t gen_entry)
 {
+    panic("Broken.\n");
+#if 0
     assert(paging_mmu_enabled());
     lvaddr_t entry = (lvaddr_t) gen_entry;
 
@@ -146,7 +150,6 @@ int platform_boot_aps(coreid_t core_id, genvaddr_t gen_entry)
     *ap_wait = AP_STARTING_UP;
     //cp15_invalidate_d_cache();
     
-    panic("Broken.\n");
 
     // map AUX_CORE_BOOT section
     static lvaddr_t aux_core_boot = 0;
@@ -175,6 +178,7 @@ int platform_boot_aps(coreid_t core_id, genvaddr_t gen_entry)
         ;
     debug(SUBSYS_STARTUP, "booted CPU%hhu\n", core_id);
     return 0;
+#endif
 }
 
 void platform_notify_bsp(void)
index 1805c1d..2115ba5 100644 (file)
@@ -120,12 +120,16 @@ platform_get_ram_size(void) {
  *
  * \returns Zero on successful boot, non-zero (error code) on failure
  */
+// XXX: panic() messes with GCC, remove attribute when code works again!
+__attribute__((noreturn))
 int
 platform_boot_aps(coreid_t core_id, genvaddr_t gen_entry) {
     panic("Unimplemented.\n");
-    return 0;
+    //return 0;
 }
 
+// XXX: panic() messes with GCC, remove attribute when code works again!
+__attribute__((noreturn))
 void
 platform_notify_bsp(void) {
     panic("Unimplemented.\n");
index ceaa367..ad498f2 100644 (file)
@@ -616,6 +616,8 @@ spawn_bsp_init(const char *name,
     return init_dcb;
 }
 
+// XXX: panic() messes with GCC, remove attribute when code works again!
+__attribute__((noreturn))
 struct dcb *spawn_app_init(struct arm_core_data *new_core_data,
                            const char *name, alloc_phys_func alloc_phys)
 {
index 7f3f4d1..ac772eb 100644 (file)
@@ -109,6 +109,7 @@ read_string(FILE *f, reader_t reader, char **bufptr) {
     }
 
     memcpy(*bufptr, buf, len);
+    return len;
 }
 
 struct menu_lst *
index 2b89ee2..2f97cf2 100644 (file)
@@ -206,7 +206,7 @@ load(int in_fd, size_t *loaded_size, uint32_t *entry_reloc,
                 }
 
                 seg_align= ph[i].p_align;
-                printf("Increasing alignment to %u to match segment %u\n",
+                printf("Increasing alignment to %u to match segment %zu\n",
                        seg_align, i);
             }
             else seg_align= BASE_PAGE_SIZE;
@@ -215,7 +215,7 @@ load(int in_fd, size_t *loaded_size, uint32_t *entry_reloc,
             uint32_t alloc_size= round_up(ph[i].p_memsz, seg_align);
 
             uint32_t base= phys_alloc(alloc_size, BASE_PAGE_SIZE);
-            printf("Allocated %dB at VA %08x (PA %08x) for segment %d\n",
+            printf("Allocated %dB at VA %08x (PA %08x) for segment %zu\n",
                    alloc_size, base + offset, base, i);
 
             /* Record the relocated base address of the segment. */
@@ -225,7 +225,7 @@ load(int in_fd, size_t *loaded_size, uint32_t *entry_reloc,
             if(ph[i].p_vaddr <= got_base &&
                (got_base - ph[i].p_vaddr) < ph[i].p_memsz) {
                 got_base_reloc = base + (got_base - ph[i].p_vaddr);
-                printf("got_base is in segment %d, relocated %08x to VA %08x\n",
+                printf("got_base is in segment %zu, relocated %08x to VA %08x\n",
                        i, got_base, got_base_reloc + offset);
                 found_got_base= 1;
             }
@@ -233,7 +233,7 @@ load(int in_fd, size_t *loaded_size, uint32_t *entry_reloc,
             if(ph[i].p_vaddr <= entry &&
                (entry - ph[i].p_vaddr) < ph[i].p_memsz) {
                 *entry_reloc = base + (entry - ph[i].p_vaddr);
-                printf("entry is in segment %d, relocated %08x to VA %08x\n",
+                printf("entry is in segment %zu, relocated %08x to VA %08x\n",
                        i, entry, *entry_reloc + offset);
                 found_entry= 1;
             }
@@ -257,7 +257,7 @@ load(int in_fd, size_t *loaded_size, uint32_t *entry_reloc,
                ph[i].p_vaddr <= sym_initaddr &&
                (sym_initaddr - ph[i].p_vaddr) < ph[i].p_memsz) {
                 uint32_t sym_offset= sym_initaddr - ph[i].p_vaddr;
-                printf("%s is in segment %d, offset %d\n",
+                printf("%s is in segment %zu, offset %d\n",
                        sym_to_resolve, i, sym_offset);
                 /* Return the address within the loaded image. */
                 *sym_addr= loaded_image + segment_offset[i] + sym_offset;
@@ -266,14 +266,14 @@ load(int in_fd, size_t *loaded_size, uint32_t *entry_reloc,
             }
         }
         else {
-            printf("Segment %d is non-loadable.\n", i);
+            printf("Segment %zu is non-loadable.\n", i);
         }
     }
     if(!found_got_base) fail("got_base not in any loadable segment.\n");
     if(!found_entry)    fail("entry point not in any loadable segment.\n");
 
     *loaded_size= round_up(total_size, BASE_PAGE_SIZE);
-    printf("Data size is %dB, segment (allocated) %dB\n",
+    printf("Data size is %zuB, segment (allocated) %zuB\n",
             total_size, *loaded_size);
 
     /* Now that all segments have been allocated, apply relocations. */
@@ -449,7 +449,7 @@ raw_load(const char *path, struct loaded_module *m) {
     if(!m->data) fail_errno("calloc");
     m->paddr= phys_alloc(m->len, BASE_PAGE_SIZE);
 
-    printf("Allocated 0x%xB at PA %08x for %s\n", m->len, m->paddr, path);
+    printf("Allocated 0x%zxB at PA %08x for %s\n", m->len, m->paddr, path);
 
     FILE *f= fopen(path, "r");
     size_t read_len= fread(m->data, 1, data_len, f);
@@ -693,7 +693,7 @@ main(int argc, char **argv) {
         add_image(out_elf, "cpudriver", cpu_image, cpu_size, cpu_base);
     for(size_t i= 0; i < menu->nmodules; i++) {
         char name[32];
-        snprintf(name, 32, "module%u", i);
+        snprintf(name, 32, "module%zu", i);
         add_image(out_elf, name, modules[i].data, modules[i].len,
                   modules[i].paddr);
     }