本文整理汇总了C++中KADDR函数的典型用法代码示例。如果您正苦于以下问题:C++ KADDR函数的具体用法?C++ KADDR怎么用?C++ KADDR使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了KADDR函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: checkpte
static void
checkpte(uintmem ppn, void *a)
{
Proc *up = externup();
int l;
PTE *pte, *pml4;
uint64_t addr;
char buf[240], *s;
addr = PTR2UINT(a);
pml4 = UINT2PTR(machp()->pml4->va);
pte = 0;
s = buf;
*s = 0;
if((l = mmuwalk(pml4, addr, 3, &pte, nil)) < 0 || (*pte&PteP) == 0)
goto Panic;
s = seprint(buf, buf+sizeof buf,
"check3: l%d pte %#p = %llux\n",
l, pte, pte?*pte:~0);
if((l = mmuwalk(pml4, addr, 2, &pte, nil)) < 0 || (*pte&PteP) == 0)
goto Panic;
s = seprint(s, buf+sizeof buf,
"check2: l%d pte %#p = %llux\n",
l, pte, pte?*pte:~0);
if(*pte&PtePS)
return;
if((l = mmuwalk(pml4, addr, 1, &pte, nil)) < 0 || (*pte&PteP) == 0)
goto Panic;
seprint(s, buf+sizeof buf,
"check1: l%d pte %#p = %llux\n",
l, pte, pte?*pte:~0);
return;
Panic:
seprint(s, buf+sizeof buf,
"checkpte: l%d addr %#p ppn %#ullx kaddr %#p pte %#p = %llux",
l, a, ppn, KADDR(ppn), pte, pte?*pte:~0);
print("%s\n", buf);
seprint(buf, buf+sizeof buf, "start %#ullx unused %#ullx"
" unmap %#ullx end %#ullx\n",
sys->vmstart, sys->vmunused, sys->vmunmapped, sys->vmend);
panic("%s", buf);
}
示例2: sanity
static void
sanity(void)
{
uintptr cr3;
cr3 = (uintptr)KADDR(getcr3());
if (cr3 == 0)
panic("zero cr3");
if ((uintptr)m->pdb != cr3 || (uintptr)mach0pdb != cr3)
panic("not all same: cr3 %#p m->pdb %#p mach0pdb %#p",
cr3, m->pdb, mach0pdb);
if (m != mach0m)
panic("m %#p != mach0m %#p", m, mach0m);
if (m->gdt != mach0gdt)
panic("m->gdt %#p != mach0gdt %#p", m->gdt, mach0gdt);
if (0)
iprint("m->pdb %#p m %#p sp %#p m->gdt %#p\n",
m->pdb, m, &cr3, m->gdt);
}
示例3: env_free
//
// Frees env e and all memory it uses.
//
void
env_free(struct Env *e)
{
pte_t *pt;
uint32_t pdeno, pteno;
physaddr_t pa;
// Note the environment's demise.
cprintf("[%08x] free env %08x\n", curenv ? curenv->env_id : 0, e->env_id);
// Flush all mapped pages in the user portion of the address space
static_assert(UTOP % PTSIZE == 0);
for (pdeno = 0; pdeno < PDX(UTOP); pdeno++) {
// only look at mapped page tables
if (!(e->env_pgdir[pdeno] & PTE_P))
continue;
// find the pa and va of the page table
pa = PTE_ADDR(e->env_pgdir[pdeno]);
pt = (pte_t*) KADDR(pa);
// unmap all PTEs in this page table
for (pteno = 0; pteno <= PTX(~0); pteno++) {
if (pt[pteno] & PTE_P)
page_remove(e->env_pgdir, PGADDR(pdeno, pteno, 0));
}
// free the page table itself
e->env_pgdir[pdeno] = 0;
page_decref(pa2page(pa));
}
// free the page directory
pa = e->env_cr3;
e->env_pgdir = 0;
e->env_cr3 = 0;
page_decref(pa2page(pa));
// return the environment to the free list
e->env_status = ENV_FREE;
LIST_INSERT_HEAD(&env_free_list, e, env_link);
}
示例4: check_va2pa
static physaddr_t
check_va2pa(pde_t *pgdir, uintptr_t va)
{
pte_t *p;
pgdir = &pgdir[PDX(va)];
if (!(*pgdir & PTE_P)){
//cprintf("!(*pgdir & PTE_P)\n");
return ~0;
}
p = (pte_t*) KADDR(PTE_ADDR(*pgdir));
if (!(p[PTX(va)] & PTE_P)){
// cprintf("!(p[PTX(va)] & PTE_P)\n");
return ~0;
}
return PTE_ADDR(p[PTX(va)]);
}
示例5: pml4e_walk
pte_t *
pml4e_walk(pml4e_t *pml4e, const void *va, int create)
{
struct Page *newPage = NULL;
//if(!create) cprintf("va = %0x, pml4e[PML4(va)] = %0x\n", va, pml4e[PML4(va)]);
if (!pml4e[PML4(va)]) {
if (!create)
return NULL;
else {
newPage = page_alloc(0);
if (newPage == 0) {
return NULL;
} else {
newPage->pp_ref++;
pml4e[PML4(va)] = page2pa(newPage) | PTE_U | PTE_W | PTE_P;
memset(page2kva(newPage), 0x00, PGSIZE);
}
}
}
pdpe_t* pdpe = (pdpe_t*)(KADDR((PTE_ADDR(pml4e[PML4(va)]))));
pte_t *result = pdpe_walk(pdpe, va, create);
if (!result && newPage) {
pml4e[PML4(va)] = 0;
newPage->pp_ref = 0;
page_free(newPage);
}
//return result + PTX(va);
if (result) {
return result + PTX(va);
}
else {
return result;
}
}
示例6: vmap
void *
vmap(ulong phys, ulong length)
{
ulong virt, off, *l2;
off = phys % BY2PG;
length = (ROUNDUP(phys + length, BY2PG) - ROUNDDN(phys, BY2PG)) / BY2PG;
if(length == 0)
return nil;
phys = ROUNDDN(phys, BY2PG);
virt = getiopages(length);
l2 = KADDR(IOPT);
l2 += virt;
while(length--){
*l2++ = phys | L2AP(Krw) | Small | PTEIO;
phys += BY2PG;
}
flushtlb();
return (void *) (IZERO + BY2PG * virt + off);
}
示例7: mon_si
int
mon_si(int argc, char **argv, struct Trapframe *tf)
{
if (tf == NULL) {
cprintf("Cannot invoke si, no breakpoint exception or debug exception invoked\n");
return 1;
}
if (tf->tf_trapno != T_BRKPT && tf->tf_trapno != T_DEBUG) {
cprintf("Cannot invoke si, no breakpoint exception or debug exception invoked\n");
return 1;
}
uint32_t opcode;
pte_t *entry;
uint32_t address;
// Get the page table entry of tf_eip,
// because we in kernel mode
address = tf->tf_eip;
entry = pgdir_walk(curenv->env_pgdir, (void *)address, 0);
// Debug
if (entry == NULL) {
panic("Bad address in gdb");
}
// Debug info
address = (uint32_t)KADDR(PTE_ADDR(*entry)) | (address & 0xfff);
// Debug info
// print the instruction name
opcode = *((uint32_t *)address);
opcode &= 0xff;
cprintf("Instruction: %s\n", opcnames[(int)opcode]);
// Debug info
if (tf->tf_eflags & FL_TF) {
cprintf("Trap Flag set in EFLAGS\n");
}
tf->tf_eflags |= FL_TF | FL_RF;
return -1;
}
示例8: mmuinit
void
mmuinit(void)
{
ulong *pte, npgs, pa;
if(paemode){
int i;
xenpdpt = (uvlong*)m->pdb;
m->pdb = xspanalloc(32, 32, 0);
/* clear "reserved" bits in initial page directory pointers -- Xen bug? */
for(i = 0; i < 4; i++)
((uvlong*)m->pdb)[i] = xenpdpt[i] & ~0x1E6LL;
}
/*
* So far only memory up to xentop is mapped, map the rest.
* We cant use large pages because our contiguous PA space
* is not necessarily contiguous in MA.
*/
npgs = conf.mem[0].npage;
for(pa=conf.mem[0].base; npgs; npgs--, pa+=BY2PG) {
pte = mmuwalk(m->pdb, (ulong)KADDR(pa), 2, 1);
if(!pte)
panic("mmuinit");
xenupdate(pte, pa|PTEVALID|PTEWRITE);
}
memglobal();
#ifdef we_may_eventually_want_this
/* make kernel text unwritable */
for(x = KTZERO; x < (ulong)etext; x += BY2PG){
p = mmuwalk(m->pdb, x, 2, 0);
if(p == nil)
panic("mmuinit");
*p &= ~PTEWRITE;
}
#endif
taskswitch(0, (ulong)m + BY2PG);
}
示例9: check_boot_pgdir
/**
* Check whether page directory for boot lives well.
* NOTE: we don't have mm_struct at present.
* as write to a clean page also raises SIGSEGV, we're not able to deal with it now.
* so just mark all page inserted to be accessed and dirty.
*/
void
check_boot_pgdir(void) {
pte_t *ptep;
int i;
for (i = 0; i < npage; i += PGSIZE) {
assert((ptep = get_pte(boot_pgdir, (uintptr_t)KADDR(i), 0)) != NULL);
assert(PTE_ADDR(*ptep) == i);
}
//assert(PDE_ADDR(boot_pgdir[PDX(VPT)]) == PADDR(boot_pgdir));
assert(boot_pgdir[PDX(TEST_PAGE)] == 0);
struct Page *p;
p = alloc_page();
assert(page_insert(boot_pgdir, p, TEST_PAGE, PTE_W | PTE_D | PTE_A) == 0);
assert(page_ref(p) == 1);
assert(page_insert(boot_pgdir, p, TEST_PAGE + PGSIZE, PTE_W | PTE_D | PTE_A) == 0);
assert(page_ref(p) == 2);
const char *str = "ucore: Hello world!!";
strcpy((void *)TEST_PAGE, str);
assert(strcmp((void *)TEST_PAGE, (void *)(TEST_PAGE + PGSIZE)) == 0);
*(char *)(page2kva(p)) = '\0';
assert(strlen((const char *)TEST_PAGE) == 0);
/*
* in um architecture clear page table doesn't mean
* the linear address is invalid
* so remove them by hand
*/
tlb_invalidate (boot_pgdir, TEST_PAGE);
tlb_invalidate (boot_pgdir, TEST_PAGE + PGSIZE);
free_page(p);
free_page(pa2page(PDE_ADDR(boot_pgdir[PDX(TEST_PAGE)])));
boot_pgdir[PDX(TEST_PAGE)] = 0;
kprintf("check_boot_pgdir() succeeded.\n");
}
示例10: mpshutdown
void
mpshutdown(void)
{
/*
* To be done...
*/
if(!canlock(&mpshutdownlock)){
/*
* If this processor received the CTRL-ALT-DEL from
* the keyboard, acknowledge it. Send an INIT to self.
*/
#ifdef FIXTHIS
if(lapicisr(VectorKBD))
lapiceoi(VectorKBD);
#endif /* FIX THIS */
idle();
}
print("apshutdown: active = 0x%2.2uX\n", active.machs);
delay(1000);
splhi();
/*
* INIT all excluding self.
*/
lapicicrw(0, 0x000C0000|ApicINIT);
#ifdef notdef
/*
* Often the BIOS hangs during restart if a conventional 8042
* warm-boot sequence is tried. The following is Intel specific and
* seems to perform a cold-boot, but at least it comes back.
*/
*(ushort*)KADDR(0x472) = 0x1234; /* BIOS warm-boot flag */
outb(0xCF9, 0x02);
outb(0xCF9, 0x06);
#else
pcireset();
i8042reset();
#endif /* notdef */
}
示例11: MmInitManager
ZVMSTATUS MmInitManager(uint32_t *pgdir,uint32_t *hostcr3)
{
void *va;
uint32_t pa,tmp;
memcpy(hostcr3,pgdir,PGSIZE);
for(uint32_t i=0; i<1024; i++)
{
if(hostcr3[i]!=0)
{
va = MmAllocPages(1,&pa);
tmp = hostcr3[i];
tmp = tmp & 0xfffff000;
memcpy(va,KADDR(tmp),PGSIZE); // 从物理地址找虚拟地址
hostcr3[i] = hostcr3[i] & 0xfff;
hostcr3[i] = hostcr3[i] | pa ;
}
}
return ZVMSUCCESS;
}
示例12: i2csetup
/*
* called by the reset routine of any driver using the IIC
*/
void
i2csetup(int polling)
{
I2Cregs *i2c;
Ctlr *ctlr;
ctlr = i2cctlr;
ctlr->polling = polling;
i2c = KADDR(PHYSI2C);
ctlr->regs = i2c;
if(!polling){
if(ctlr->init == 0){
initialise(i2c, 1);
ctlr->init = 1;
intrenable(IRQ, IRQi2c, interrupt, i2cctlr, "i2c");
if(Chatty)
i2cdump("init", i2c);
}
}else
initialise(i2c, 0);
}
示例13: vunmap
void
vunmap(void *virt, ulong length)
{
ulong v, *l2;
if((ulong)virt < IZERO || (ulong)virt >= IZERO + NIOPAGES * BY2PG)
panic("vunmap: virt=%p", virt);
v = (ROUNDDN((ulong) virt, BY2PG) - IZERO) / BY2PG;
length = (ROUNDUP(((ulong) virt) + length, BY2PG) - ROUNDDN((ulong) virt, BY2PG)) / BY2PG;
if(length == 0)
return;
l2 = KADDR(IOPT);
l2 += v;
lock(&iopagelock);
while(length--){
*l2++ = 0;
freeio(v++);
}
unlock(&iopagelock);
flushtlb();
}
示例14: unmap_range_pud
static void
unmap_range_pud(pgd_t *pgdir, pud_t *pud, uintptr_t base, uintptr_t start, uintptr_t end) {
#if PUXSHIFT == PGXSHIFT
unmap_range_pmd (pgdir, pud, base, start, end);
#else
assert(start >= 0 && start < end && end <= PUSIZE);
size_t off, size;
uintptr_t la = ROUNDDOWN(start, PMSIZE);
do {
off = start - la, size = PMSIZE - off;
if (size > end - start) {
size = end - start;
}
pud_t *pudp = &pud[PUX(la)];
if (ptep_present(pudp)) {
unmap_range_pmd(pgdir, KADDR(PUD_ADDR(*pudp)), base + la, off, off + size);
}
start += size, la += PMSIZE;
} while (start != 0 && start < end);
#endif
}
示例15: pcmwrite
static long
pcmwrite(int dev, int attr, void *a, long n, vlong off)
{
int i, len;
PCMmap *m;
uchar *ac;
PCMslot *pp;
ulong offset = off;
pp = slot + dev;
if(pp->memlen < offset)
return 0;
if(pp->memlen < offset + n)
n = pp->memlen - offset;
m = 0;
if(waserror()){
if(m)
pcmunmap(pp->slotno, m);
nexterror();
}
ac = a;
for(len = n; len > 0; len -= i){
m = pcmmap(pp->slotno, offset, 0, attr);
if(m == 0)
error("cannot map PCMCIA card");
if(offset + len > m->cea)
i = m->cea - offset;
else
i = len;
memmoveb(KADDR(m->isa + offset - m->ca), ac, i);
pcmunmap(pp->slotno, m);
offset += i;
ac += i;
}
poperror();
return n;
}