rem: init_double_fault();
context: arch_cpu_init_post_vm(kernel_args *args){	uint32 i;	// account for the segment descriptors	gGDT = (segment_descriptor *)args->arch_args.vir_gdt;	create_area("gdt", (void **)&gGDT, B_EXACT_ADDRESS, B_PAGE_SIZE, B_ALREADY_WIRED,		B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA);	// currently taken out of the build, because it's not yet used (and assumes	// (a fixed number of used GDT entries)	//i386_selector_init(gGDT);  // pass the new gdt	// setup task-state segments	sTSS = malloc(sizeof(struct tss *) * args->num_cpus);	if (sTSS == NULL) {		panic("arch_cpu_init_post_vm: could not allocate buffer for tss pointers\n");		return B_NO_MEMORY;	}	sIsTSSLoaded = malloc(sizeof(int) * args->num_cpus);	if (sIsTSSLoaded == NULL) {		panic("arch_cpu_init_post_vm: could not allocate buffer for tss booleans\n");		return B_NO_MEMORY;	}	memset(sIsTSSLoaded, 0, sizeof(int) * args->num_cpus);	for (i = 0; i < args->num_cpus; i++) {		char tssName[16];		area_id area;		sprintf(tssName, "tss%lu", i);		area = create_area(tssName, (void **)&sTSS[i], B_ANY_KERNEL_ADDRESS, B_PAGE_SIZE,			B_FULL_LOCK, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA);		if (area < 0) {			panic("arch_cpu_init2: unable to create region for tss\n");			return B_NO_MEMORY;		}		// initialize TSS		memset(sTSS[i], 0, sizeof(struct tss));		sTSS[i]->ss0 = KERNEL_DATA_SEG;		// add TSS descriptor for this new TSS		set_tss_descriptor(&gGDT[TSS_BASE_SEGMENT + i], (addr_t)sTSS[i], sizeof(struct tss));	}	// setup TLS descriptors (one for every CPU)	for (i = 0; i < args->num_cpus; i++) {		set_segment_descriptor(&gGDT[TLS_BASE_SEGMENT + i], 0, TLS_SIZE,			DT_DATA_WRITEABLE, DPL_USER);	}	init_double_fault();	return B_OK;}