예제 #1
0
void
cpu_physwindow_init(int cpu)
{
	cpu_data_t		*cdp = cpu_data_ptr[cpu];
	cpu_desc_index_t	*cdi = &cdp->cpu_desc_index;
        vm_offset_t 		phys_window;

	if (vm_allocate(kernel_map, &phys_window,
			PAGE_SIZE, VM_FLAGS_ANYWHERE)
				!= KERN_SUCCESS)
	        panic("cpu_physwindow_init: couldn't allocate phys map window");

        /*
         * make sure the page that encompasses the
         * pte pointer we're interested in actually
         * exists in the page table
         */
	pmap_expand(kernel_pmap, phys_window);

	cdp->cpu_physwindow_base = phys_window;
	cdp->cpu_physwindow_ptep = vtopte(phys_window);

	cdi->cdi_gdt[sel_idx(PHYS_WINDOW_SEL)] = physwindow_desc_pattern;
	cdi->cdi_gdt[sel_idx(PHYS_WINDOW_SEL)].offset = phys_window;

	fix_desc(&cdi->cdi_gdt[sel_idx(PHYS_WINDOW_SEL)], 1);
}
예제 #2
0
파일: kdp_machdep.c 프로젝트: dayt0n/xnu
void kdp_machine_init(void) {
    pt_entry_t *debugger_ptep;
    vm_map_offset_t debugger_window_kva;

    if (debug_boot_arg == 0)
        return;

    vm_map_entry_t e;
    kern_return_t kr = vm_map_find_space(kernel_map,
        &debugger_window_kva,
        PAGE_SIZE, 0,
        VM_MAKE_TAG(VM_MEMORY_IOKIT), &e);

    if (kr != KERN_SUCCESS) {
        panic("%s: vm_map_find_space failed with %d\n", __FUNCTION__, kr);
    }

    vm_map_unlock(kernel_map);

    debugger_ptep = pmap_pte(kernel_pmap, debugger_window_kva);

    if (debugger_ptep == NULL) {
        pmap_expand(kernel_pmap, debugger_window_kva);
        debugger_ptep = pmap_pte(kernel_pmap, debugger_window_kva);
    }
}