X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=alloc.c;h=cd67c38e239f005091946fcd2aab72b3cad4895c;hb=91b8735242adb1780c12f37b0a2fb87d9edde2d5;hp=358939ac1d957bdb5b8f6d44d80115bf16ffd086;hpb=d38858b0a1d960e82104939c810e6d4f30cbe6b0;p=debian%2Felilo diff --git a/alloc.c b/alloc.c index 358939a..cd67c38 100644 --- a/alloc.c +++ b/alloc.c @@ -105,13 +105,13 @@ alloc(UINTN size, EFI_MEMORY_TYPE type) status = uefi_call_wrapper(BS->AllocatePool, 3, type, size, &tmp); if (EFI_ERROR(status)) { - ERR_PRT((L"allocator: AllocatePool(%d, %d, 0x%x) failed (%r)\n", type, size, status)); + ERR_PRT((L"allocator: AllocatePool(%d, %d) failed (%r)\n", type, size, status)); return NULL; } alloc_add(tmp, size, ALLOC_POOL); - - DBG_PRT((L"alloc: allocated %d bytes @[0x%lx-0x%lx]\n", size, tmp, tmp+size)); - +#ifdef DEBUG_MEM + DBG_PRT((L"alloc: allocated %d bytes @[" PTR_FMT "-" PTR_FMT "]", size, tmp, tmp+size)); +#endif return tmp; } @@ -140,7 +140,7 @@ alloc_pages(UINTN pgcnt, EFI_MEMORY_TYPE type, EFI_ALLOCATE_TYPE where, VOID *ad alloc_add(addr, pgcnt, ALLOC_PAGES); - DBG_PRT((L"allocator: allocated %d pages @0x%lx\n", pgcnt, tmp)); + DBG_PRT((L"allocator: allocated %d pages @" PTR_FMT, pgcnt, tmp)); return addr; } @@ -158,13 +158,14 @@ free(VOID *addr) if (p->addr == addr) goto found; } /* not found */ - VERB_PRT(1, Print(L"allocator: invalid free @ 0x%lx\n", addr)); + VERB_PRT(1, Print(L"allocator: invalid free @ " PTR_FMT "\n", addr)); return; found: - DBG_PRT((L"free: %s @0x%lx size=%ld\n", +#ifdef DEBUG_MEM + DBG_PRT((L"free: %s @" PTR_FMT " size=%d", p->type == ALLOC_POOL ? L"Pool": L"Page", addr, p->size)); - +#endif if (p->type == ALLOC_POOL) uefi_call_wrapper(BS->FreePool, 1, addr); else @@ -194,9 +195,9 @@ free_all(VOID) alloc_entry_t *tmp; while(used_allocs) { - - DBG_PRT((L"free_all %a @ 0x%lx\n", used_allocs->type == ALLOC_POOL ? "pool" : "pages", used_allocs->addr)); - +#ifdef DEBUG_MEM + DBG_PRT((L"free_all %a @ " PTR_FMT, used_allocs->type == ALLOC_POOL ? "pool" : "pages", used_allocs->addr)); +#endif if (used_allocs->type == ALLOC_POOL) uefi_call_wrapper(BS->FreePool, 1, used_allocs->addr); else @@ -212,6 +213,27 @@ free_all(VOID) } } +INTN +alloc_kmem_anywhere(VOID **start_addr, UINTN pgcnt) +{ + void * tmp; + /* + * During "AllocateAnyPages" *start_addr will be ignored. + * Therefore we can safely subvert it to reuse this function with + * an alloc_kmem_anyhwere_below() semantic... + */ + tmp = alloc_pages(pgcnt, EfiLoaderData, + (*start_addr) ? AllocateMaxAddress : AllocateAnyPages, + *start_addr); + if (tmp == NULL) return -1; + + kmem_addr = tmp; + kmem_pgcnt = pgcnt; + *start_addr = tmp; + + return 0; +} + INTN alloc_kmem(VOID *start_addr, UINTN pgcnt) { @@ -226,13 +248,17 @@ alloc_kmem(VOID *start_addr, UINTN pgcnt) VOID free_kmem(VOID) { - DBG_PRT((L"free_kmem before (%lx, %ld)\n", kmem_addr, kmem_pgcnt)); +#ifdef DEBUG_MEM + DBG_PRT((L"free_kmem before (" PTR_FMT ", %d)", kmem_addr, kmem_pgcnt)); +#endif if (kmem_addr && kmem_pgcnt != 0) { free(kmem_addr); kmem_addr = NULL; kmem_pgcnt = 0; } - DBG_PRT((L"free_kmem after (%lx, %ld)\n", kmem_addr, kmem_pgcnt)); +#ifdef DEBUG_MEM + DBG_PRT((L"free_kmem after (" PTR_FMT ", %d)", kmem_addr, kmem_pgcnt)); +#endif } VOID