示例#1
0
文件: start.cpp 项目: mmuman/haiku
extern "C" void
start(void *openFirmwareEntry)
{
	char bootargs[512];

	// stage2 args - might be set via the command line one day
	stage2_args args;
	args.heap_size = HEAP_SIZE;
	args.arguments = NULL;

	of_init((int (*)(void*))openFirmwareEntry);

	// check for arguments
	if (of_getprop(gChosen, "bootargs", bootargs, sizeof(bootargs))
			!= OF_FAILED) {
		static const char *sArgs[] = { NULL, NULL };
		sArgs[0] = (const char *)bootargs;
		args.arguments = sArgs;
		args.arguments_count = 1;
	}

	determine_machine();
	console_init();

	if ((gMachine & MACHINE_QEMU) != 0)
		dprintf("OpenBIOS (QEMU?) OpenFirmware machine detected\n");
	else if ((gMachine & MACHINE_PEGASOS) != 0)
		dprintf("Pegasos PowerPC machine detected\n");
	else
		dprintf("Apple PowerPC machine assumed\n");

	// Initialize and take over MMU and set the OpenFirmware callbacks - it
	// will ask us for memory after that instead of maintaining it itself
	// (the kernel will need to adjust the callback later on as well)
	arch_mmu_init();

	if (boot_arch_cpu_init() != B_OK)
		of_exit();

	if (init_real_time_clock() != B_OK)
		of_exit();

	// check for key presses once
	sBootOptions = 0;
	int key = console_check_for_key();
	if (key == 32) {
		// space bar: option menu
		sBootOptions |= BOOT_OPTION_MENU;
	} else if (key == 27) {
		// ESC: debug output
		sBootOptions |= BOOT_OPTION_DEBUG_OUTPUT;
	}

	gKernelArgs.platform_args.openfirmware_entry = openFirmwareEntry;

	main(&args);
		// if everything goes fine, main() never returns

	of_exit();
}
示例#2
0
文件: main.c 项目: HTshandou/newos
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();
}