static void init_interface(void) { block_io_op_t op; reset_interface(); if (blk_ring == NULL) { op.cmd = BLOCK_IO_OP_RING_ADDRESS; (void)HYPERVISOR_block_io_op(&op); blk_ring = (blk_ring_t *)uvm_km_valloc_align(kernel_map, PAGE_SIZE, PAGE_SIZE); pmap_kenter_ma((vaddr_t)blk_ring, op.u.ring_mfn << PAGE_SHIFT, VM_PROT_READ|VM_PROT_WRITE); DPRINTF(XBDB_SETUP, ("init_interface: " "ring va %p and wired to %p\n", blk_ring, (void *)(op.u.ring_mfn << PAGE_SHIFT))); blk_ring->req_prod = blk_ring->resp_prod = resp_cons = req_prod = last_req_prod = 0; event_set_handler(_EVENT_BLKDEV, &xbd_response_handler, NULL, IPL_BIO); hypervisor_enable_event(_EVENT_BLKDEV); } __insn_barrier(); state = STATE_ACTIVE; }
vaddr_t uvm_km_valloc(struct vm_map *map, vsize_t size) { return(uvm_km_valloc_align(map, size, 0)); }
struct cpu_info * alloc_cpuinfo(struct mainbus_attach_args *ma) { paddr_t pa0, pa; vaddr_t va, va0; vsize_t sz = 8 * PAGE_SIZE; int portid; struct cpu_info *cpi, *ci; extern paddr_t cpu0paddr; portid = getpropint(ma->ma_node, "upa-portid", -1); if (portid == -1) portid = getpropint(ma->ma_node, "portid", -1); if (portid == -1) portid = getpropint(ma->ma_node, "cpuid", -1); if (portid == -1 && ma->ma_nreg > 0) portid = (ma->ma_reg[0].ur_paddr >> 32) & 0x0fffffff; if (portid == -1) panic("alloc_cpuinfo: portid"); for (cpi = cpus; cpi != NULL; cpi = cpi->ci_next) if (cpi->ci_upaid == portid) return cpi; va = uvm_km_valloc_align(kernel_map, sz, 8 * PAGE_SIZE, 0); if (va == 0) panic("alloc_cpuinfo: no virtual space"); va0 = va; pa0 = cpu0paddr; cpu0paddr += sz; for (pa = pa0; pa < cpu0paddr; pa += PAGE_SIZE, va += PAGE_SIZE) pmap_kenter_pa(va, pa, VM_PROT_READ | VM_PROT_WRITE); pmap_update(pmap_kernel()); cpi = (struct cpu_info *)(va0 + CPUINFO_VA - INTSTACK); memset((void *)va0, 0, sz); /* * Initialize cpuinfo structure. * * Arrange pcb, idle stack and interrupt stack in the same * way as is done for the boot CPU in pmap.c. */ cpi->ci_next = NULL; cpi->ci_curproc = NULL; cpi->ci_number = ncpus++; cpi->ci_upaid = portid; cpi->ci_fpproc = NULL; #ifdef MULTIPROCESSOR cpi->ci_spinup = cpu_hatch; /* XXX */ #else cpi->ci_spinup = NULL; #endif cpi->ci_initstack = cpi; cpi->ci_paddr = pa0; #ifdef SUN4V cpi->ci_mmfsa = pa0; #endif cpi->ci_self = cpi; cpi->ci_node = ma->ma_node; sched_init_cpu(cpi); /* * Finally, add itself to the list of active cpus. */ for (ci = cpus; ci->ci_next != NULL; ci = ci->ci_next) ; ci->ci_next = cpi; return (cpi); }