static void *of_try_claim(unsigned long size) { unsigned long addr = 0; if (claim_base == 0) claim_base = _ALIGN_UP((unsigned long)_end, ONE_MB); for(; claim_base < RAM_END; claim_base += ONE_MB) { #ifdef DEBUG printf(" trying: 0x%08lx\n\r", claim_base); #endif addr = (unsigned long)of_claim(claim_base, size, 0); if ((void *)addr != (void *)-1) break; } if (addr == 0) return NULL; claim_base = PAGE_ALIGN(claim_base + size); return (void *)addr; }
void *of_vmlinux_alloc(unsigned long size) { unsigned long start = (unsigned long)_start, end = (unsigned long)_end; void *addr; void *p; /* */ addr = of_claim(start, end - start, 0); printf("Trying to claim from 0x%lx to 0x%lx (0x%lx) got %p\r\n", start, end, end - start, addr); p = malloc(size); if (!p) fatal("Can't allocate memory for kernel image!\n\r"); return p; }
void _start(int arg1, int arg2, void *openfirmware) { int chosen; of_init(openfirmware); /* open the input and output handle */ chosen = of_finddevice("/chosen"); of_getprop(chosen, "stdin", &of_input_handle, sizeof(of_input_handle)); of_getprop(chosen, "stdout", &of_output_handle, sizeof(of_output_handle)); puts("this is a test\n"); init_serial(); restart: puts("waiting for command\n"); { int base_address; int entry_point; int length; int command; unsigned char *ptr; void (*func)(int, int, void *); serial_read_int32(&command); if(command != 0x99) { puts("bad command, restarting\n"); goto restart; } serial_read_int32(&base_address); serial_read_int32(&length); serial_read_int32(&entry_point); puts("read base and length, claiming\n"); puts("base "); write_hex(base_address); puts("\nlength "); write_hex(length); puts("\nentry_point "); write_hex(entry_point); puts("\n"); ptr = (void *)base_address; of_claim(base_address, length, 0); puts("reading data\n"); serial_read(ptr, length); puts("done reading data, calling function\n"); func = (void *)entry_point; func(arg1, arg2, openfirmware); } of_exit(); }