Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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();
}