rem: int arch_smp_init(kernel_args *ka)
add: arch_smp_init(kernel_args *ka)
context: int arch_smp_init(kernel_args *ka){	dprintf("arch_smp_init: entry\n");	if(ka->num_cpus > 1) {		// setup some globals		num_cpus = ka->num_cpus;		apic = ka->arch_args.apic;		ioapic = ka->arch_args.ioapic;		memcpy(cpu_apic_id, ka->arch_args.cpu_apic_id, sizeof(ka->arch_args.cpu_apic_id));		memcpy(cpu_os_id, ka->arch_args.cpu_os_id, sizeof(ka->arch_args.cpu_os_id));		memcpy(cpu_apic_version, ka->arch_args.cpu_apic_version, sizeof(ka->arch_args.cpu_apic_version));		apic_timer_tics_per_sec = ka->arch_args.apic_time_cv_factor;		// setup regions that represent the apic & ioapic		vm_create_anonymous_region(vm_get_kernel_aspace_id(), "local_apic", (void *)&apic,			REGION_ADDR_EXACT_ADDRESS, PAGE_SIZE, REGION_WIRING_WIRED_ALREADY, LOCK_RW|LOCK_KERNEL);		vm_create_anonymous_region(vm_get_kernel_aspace_id(), "ioapic", (void *)&ioapic,			REGION_ADDR_EXACT_ADDRESS, PAGE_SIZE, REGION_WIRING_WIRED_ALREADY, LOCK_RW|LOCK_KERNEL);		install_interrupt_handler(0xfb, &i386_timer_interrupt, NULL);		install_interrupt_handler(0xfd, &i386_ici_interrupt, NULL);		install_interrupt_handler(0xfe, &i386_smp_error_interrupt, NULL);		install_interrupt_handler(0xff, &i386_spurious_interrupt, NULL);	} else {		num_cpus = 1;	}	return 0;}