]> git.ozlabs.org Git - yaboot.git/blobdiff - second/prom.c
Be explicit in order of evaluation in the reiserfs code
[yaboot.git] / second / prom.c
index 3310ef364b9345ed4c220226a1e47cb4d66a4596..51870d910423e5147a0e2ed88e6e60d1739d2c7b 100644 (file)
@@ -196,7 +196,7 @@ prom_get_devtype (char *device)
      char       tmp[64];
 
      if (strstr(device, TOK_ISCSI))
-         device = strcpy(tmp, "/vdevice/gscsi/disk");
+         return FILE_DEVICE_ISCSI;
 
      /* Find OF device phandle */
      dev = prom_finddevice(device);
@@ -472,6 +472,19 @@ prom_printf (char *fmt, ...)
      va_end (ap);
 }
 
+void
+prom_debug (char *fmt, ...)
+{
+     va_list ap;
+
+     if (!yaboot_debug)
+          return;
+
+     va_start (ap, fmt);
+     prom_vfprintf (prom_stdout, fmt, ap);
+     va_end (ap);
+}
+
 void
 prom_perror (int error, char *filename)
 {
@@ -576,26 +589,54 @@ prom_claim_chunk(void *virt, unsigned int size, unsigned int align)
      void *found, *addr;
      for(addr=virt; addr <= (void*)PROM_CLAIM_MAX_ADDR;
          addr+=(0x100000/sizeof(addr))) {
-          found = prom_claim(addr, size, 0);
+          found = call_prom("claim", 3, 1, addr, size, 0);
+          if (found != (void *)-1) {
+               prom_debug("claim of 0x%x at 0x%x returned 0x%x\n", size, (int)addr, (int)found);
+               return(found);
+          }
+     }
+     prom_printf("ERROR: claim of 0x%x in range 0x%x-0x%x failed\n", size, (int)virt, PROM_CLAIM_MAX_ADDR);
+     return((void*)-1);
+}
+
+/* Start from top of memory and work down to get the needed space */
+void *
+prom_claim_chunk_top(unsigned int size, unsigned int align)
+{
+     void *found, *addr;
+     for(addr=(void*)PROM_CLAIM_MAX_ADDR; addr >= (void *)size;
+         addr-=(0x100000/sizeof(addr))) {
+          found = call_prom("claim", 3, 1, addr, size, 0);
           if (found != (void *)-1) {
-               DEBUG_F("claimed %i at 0x%x (0x%x)\n",size,(int)found,(int)virt);
+               prom_debug("claim of 0x%x at 0x%x returned 0x%x\n", size, (int)addr, (int)found);
                return(found);
           }
      }
-     prom_printf("Claim error, can't allocate %x at 0x%x\n",size,(int)virt);
+     prom_printf("ERROR: claim of 0x%x in range 0x0-0x%x failed\n", size, PROM_CLAIM_MAX_ADDR);
      return((void*)-1);
 }
 
 void *
 prom_claim (void *virt, unsigned int size, unsigned int align)
 {
-     return call_prom ("claim", 3, 1, virt, size, align);
+     void *ret;
+
+     ret = call_prom ("claim", 3, 1, virt, size, align);
+     if (ret == (void *)-1)
+          prom_printf("ERROR: claim of 0x%x at 0x%x failed\n", size, (int)virt);
+     else
+          prom_debug("claim of 0x%x at 0x%x returned 0x%x\n", size, (int)virt, (int)ret);
+
+     return ret;
 }
 
 void
 prom_release(void *virt, unsigned int size)
 {
-     call_prom ("release", 2, 0, virt, size);
+     void *ret;
+
+     ret = call_prom ("release", 2, 0, virt, size);
+     prom_debug("release of 0x%x at 0x%x returned 0x%x\n", size, (int)virt, (int)ret);
 }
 
 void
@@ -674,7 +715,7 @@ struct bootp_packet * prom_get_netinfo (void)
 
      chosen = prom_finddevice("/chosen");
      if (chosen < 0) {
-          DEBUG_F("chosen=%d\n", chosen);
+          DEBUG_F("chosen=%lu\n", (unsigned long)chosen);
       return 0;
      }