本文整理汇总了C++中pmap_kremove函数的典型用法代码示例。如果您正苦于以下问题:C++ pmap_kremove函数的具体用法?C++ pmap_kremove怎么用?C++ pmap_kremove使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了pmap_kremove函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: hibernate_quiesce_cpus
/*
* Quiesce CPUs in a multiprocessor machine before resuming. We need to do
* this since the APs will be hatched (but waiting for CPUF_GO), and we don't
* want the APs to be executing code and causing side effects during the
* unpack operation.
*/
void
hibernate_quiesce_cpus(void)
{
struct cpu_info *ci;
u_long i;
KASSERT(CPU_IS_PRIMARY(curcpu()));
pmap_kenter_pa(ACPI_TRAMPOLINE, ACPI_TRAMPOLINE, PROT_READ | PROT_EXEC);
pmap_kenter_pa(ACPI_TRAMP_DATA, ACPI_TRAMP_DATA,
PROT_READ | PROT_WRITE);
for (i = 0; i < MAXCPUS; i++) {
ci = cpu_info[i];
if (ci == NULL)
continue;
if (ci->ci_idle_pcb == NULL)
continue;
if ((ci->ci_flags & CPUF_PRESENT) == 0)
continue;
if (ci->ci_flags & (CPUF_BSP | CPUF_SP | CPUF_PRIMARY))
continue;
atomic_setbits_int(&ci->ci_flags, CPUF_GO | CPUF_PARK);
}
/* Wait a bit for the APs to park themselves */
delay(500000);
pmap_kremove(ACPI_TRAMPOLINE, PAGE_SIZE);
pmap_kremove(ACPI_TRAMP_DATA, PAGE_SIZE);
}
示例2: zbpci_config_space_va
/*
* This function is expected to be called in a critical section since it
* changes the per-cpu pci config space va-to-pa mappings.
*/
static vm_offset_t
zbpci_config_space_va(int bus, int slot, int func, int reg, int bytes)
{
int cpu;
vm_offset_t va_page;
vm_paddr_t pa, pa_page;
if (bus <= PCI_BUSMAX && slot <= PCI_SLOTMAX && func <= PCI_FUNCMAX &&
reg <= PCI_REGMAX && (bytes == 1 || bytes == 2 || bytes == 4) &&
((reg & (bytes - 1)) == 0)) {
cpu = PCPU_GET(cpuid);
va_page = zbpci_config_space[cpu].vaddr;
pa = CFG_PADDR_BASE |
(bus << 16) | (slot << 11) | (func << 8) | reg;
#if _BYTE_ORDER == _BIG_ENDIAN
pa = pa ^ (4 - bytes);
#endif
pa_page = rounddown2(pa, PAGE_SIZE);
if (zbpci_config_space[cpu].paddr != pa_page) {
pmap_kremove(va_page);
pmap_kenter_attr(va_page, pa_page, PTE_C_UNCACHED);
zbpci_config_space[cpu].paddr = pa_page;
}
return (va_page + (pa - pa_page));
} else {
return (0);
}
}
示例3: obio_iomem_unmap
void
obio_iomem_unmap(void *v, bus_space_handle_t bsh, bus_size_t size)
{
u_long va, endva;
bus_addr_t bpa;
if (bsh >= SH3_P2SEG_BASE && bsh <= SH3_P2SEG_END) {
/* maybe CS0,1,2,3,4,7 */
return;
}
/* CS5,6 */
va = trunc_page(bsh);
endva = round_page(bsh + size);
#ifdef DIAGNOSTIC
if (endva <= va)
panic("obio_io_unmap: overflow");
#endif
pmap_extract(pmap_kernel(), va, &bpa);
bpa += bsh & PGOFSET;
pmap_kremove(va, endva - va);
/*
* Free the kernel virtual mapping.
*/
uvm_km_free(kernel_map, va, endva - va);
}
示例4: codepatch_unmaprw
void codepatch_unmaprw(vaddr_t nva)
{
if (nva == 0)
return;
pmap_kremove(nva, 2 * PAGE_SIZE);
km_free((void *)nva, 2 * PAGE_SIZE, &kv_any, &kp_none);
}
示例5: mpbios_unmap
inline static void
mpbios_unmap(struct mp_map *handle)
{
pmap_kremove(handle->baseva, handle->vsize);
pmap_update(pmap_kernel());
uvm_km_free(kernel_map, handle->baseva, handle->vsize, UVM_KMF_VAONLY);
}
示例6: iounaccess
/*
* Opposite to the above: just forget the mapping.
*/
int
iounaccess(vaddr_t vaddr, vsize_t len)
{
pmap_kremove(vaddr, len);
return 0;
}
示例7: uvm_emap_remove
void
uvm_emap_remove(vaddr_t sva, vsize_t len)
{
pmap_kremove(sva, len);
pmap_update(pmap_kernel());
}
示例8: dev_mem_readwrite
/*
* dev_kmem_readwrite: helper for DEV_MEM (/dev/mem) case of R/W.
*/
static int
dev_mem_readwrite(struct uio *uio, struct iovec *iov)
{
paddr_t paddr;
vaddr_t vaddr;
vm_prot_t prot;
size_t len, offset;
bool have_direct;
int error;
/* Check for wrap around. */
if ((intptr_t)uio->uio_offset != uio->uio_offset) {
return EFAULT;
}
paddr = uio->uio_offset & ~PAGE_MASK;
prot = (uio->uio_rw == UIO_WRITE) ? VM_PROT_WRITE : VM_PROT_READ;
error = mm_md_physacc(paddr, prot);
if (error) {
return error;
}
offset = uio->uio_offset & PAGE_MASK;
len = MIN(uio->uio_resid, PAGE_SIZE - offset);
#ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS
/* Is physical address directly mapped? Return VA. */
have_direct = mm_md_direct_mapped_phys(paddr, &vaddr);
#else
vaddr = 0;
have_direct = false;
#endif
if (!have_direct) {
/* Get a special virtual address. */
const vaddr_t va = dev_mem_getva(paddr);
/* Map selected KVA to physical address. */
mutex_enter(&dev_mem_lock);
pmap_kenter_pa(va, paddr, prot, 0);
pmap_update(pmap_kernel());
/* Perform I/O. */
vaddr = va + offset;
error = uiomove((void *)vaddr, len, uio);
/* Unmap, flush before unlock. */
pmap_kremove(va, PAGE_SIZE);
pmap_update(pmap_kernel());
mutex_exit(&dev_mem_lock);
/* "Release" the virtual address. */
dev_mem_relva(paddr, va);
} else {
/* Direct map, just perform I/O. */
vaddr += offset;
error = uiomove((void *)vaddr, len, uio);
}
return error;
}
示例9: gnttab_suspend
int
gnttab_suspend(void)
{
int i;
for (i = 0; i < nr_grant_frames; i++)
pmap_kremove((vm_offset_t) shared + i * PAGE_SIZE);
return (0);
}
示例10: dpt_unphysmap
static void
dpt_unphysmap(u_int8_t * vaddr, vm_size_t size)
{
int ndx;
for (ndx = 0; ndx < size; ndx += PAGE_SIZE) {
pmap_kremove((vm_offset_t) vaddr + ndx);
}
kmem_free(kernel_map, (vm_offset_t) vaddr, size);
}
示例11: vunmaprange
/*
* Undo vmaprange.
*/
void
vunmaprange(vaddr_t kaddr, vsize_t len)
{
vaddr_t addr;
vsize_t off;
addr = trunc_page(kaddr);
off = kaddr - addr;
len = round_page(off + len);
pmap_kremove(addr, len);
uvm_km_free(phys_map, addr, len, UVM_KMF_VAONLY);
}
示例12: mp_cpu_start
int
mp_cpu_start(struct cpu_info *ci)
{
unsigned short dwordptr[2];
/*
* "The BSP must initialize CMOS shutdown code to 0Ah ..."
*/
outb(IO_RTC, NVRAM_RESET);
outb(IO_RTC+1, NVRAM_RESET_JUMP);
/*
* "and the warm reset vector (DWORD based at 40:67) to point
* to the AP startup code ..."
*/
dwordptr[0] = 0;
dwordptr[1] = MP_TRAMPOLINE >> 4;
pmap_activate(curproc);
pmap_kenter_pa(0, 0, PROT_READ | PROT_WRITE);
memcpy((u_int8_t *)0x467, dwordptr, 4);
pmap_kremove(0, PAGE_SIZE);
#if NLAPIC > 0
/*
* ... prior to executing the following sequence:"
*/
if (ci->ci_flags & CPUF_AP) {
i386_ipi_init(ci->ci_apicid);
delay(10000);
if (cpu_feature & CPUID_APIC) {
i386_ipi(MP_TRAMPOLINE / PAGE_SIZE, ci->ci_apicid,
LAPIC_DLMODE_STARTUP);
delay(200);
i386_ipi(MP_TRAMPOLINE / PAGE_SIZE, ci->ci_apicid,
LAPIC_DLMODE_STARTUP);
delay(200);
}
}
#endif
return (0);
}
示例13: bus_space_unmap
void
bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t size)
{
struct extent *ex;
u_long va, endva;
bus_addr_t bpa;
/*
* Find the correct extent and bus physical address.
*/
if (t == X86_BUS_SPACE_IO) {
ex = ioport_ex;
bpa = bsh;
} else if (t == X86_BUS_SPACE_MEM) {
ex = iomem_ex;
bpa = (bus_addr_t)ISA_PHYSADDR(bsh);
if (IOM_BEGIN <= bpa && bpa <= IOM_END)
goto ok;
va = trunc_page(bsh);
endva = round_page(bsh + size);
#ifdef DIAGNOSTIC
if (endva <= va)
panic("bus_space_unmap: overflow");
#endif
(void)pmap_extract(pmap_kernel(), va, &bpa);
bpa += (bsh & PGOFSET);
pmap_kremove(va, endva - va);
pmap_update(pmap_kernel());
/*
* Free the kernel virtual mapping.
*/
uvm_km_free(kernel_map, va, endva - va);
} else
panic("bus_space_unmap: bad bus space tag");
ok:
if (extent_free(ex, bpa, size,
EX_NOWAIT | (ioport_malloc_safe ? EX_MALLOCOK : 0))) {
printf("bus_space_unmap: %s 0x%lx, size 0x%lx\n",
(t == X86_BUS_SPACE_IO) ? "port" : "pa", bpa, size);
printf("bus_space_unmap: can't free region\n");
}
}
示例14: vunmapbuf
/*
* Unmap a previously-mapped user I/O request.
*/
void
vunmapbuf(struct buf *bp, vsize_t len)
{
vaddr_t addr, off;
KASSERT((bp->b_flags & B_PHYS) != 0);
addr = trunc_page((vaddr_t)bp->b_data);
off = (vaddr_t)bp->b_data - addr;
len = round_page(off + len);
pmap_kremove(addr, len);
pmap_update(pmap_kernel());
uvm_km_free(phys_map, addr, len, UVM_KMF_VAONLY);
bp->b_data = bp->b_saveaddr;
bp->b_saveaddr = 0;
}
示例15: table_unmap
/* Unmap memory previously mapped with table_map(). */
static void
table_unmap(void *data, vm_offset_t length)
{
vm_offset_t va, off;
va = (vm_offset_t)data;
off = va & PAGE_MASK;
length = roundup(length + off, PAGE_SIZE);
va &= ~PAGE_MASK;
while (length > 0) {
pmap_kremove(va);
invlpg(va);
va += PAGE_SIZE;
length -= PAGE_SIZE;
}
}