/* * unmap virt, then map virt to new phys; * see remap definition below */ int prom_remap(size_t size, caddr_t virt, physaddr_t phys) { ihandle_t immu; cell_t ci[8]; int rv; immu = prom_mmu_ihandle(); if (immu == (ihandle_t)-1) return (ERR); ci[0] = p1275_ptr2cell("call-method"); /* Service name */ ci[1] = (cell_t)5; /* #argument cells */ ci[2] = (cell_t)0; /* #result cells */ ci[3] = p1275_ptr2cell("remap"); /* Arg1: Method name */ ci[4] = p1275_ihandle2cell(immu); /* Arg2: memory ihandle */ ci[5] = p1275_size2cell(size); /* remap arg0 */ ci[6] = p1275_ptr2cell(virt); /* remap arg1 */ ci[7] = p1275_ull2cell_low(phys); /* remap arg2 */ promif_preprom(); rv = p1275_cif_handler(ci); promif_postprom(); if (rv) return (rv); /* Service "call-method" failed */ return (0); }
void kmdb_prom_preserve_kctx_init(void) { pnode_t pnode; int val; pnode = (pnode_t)prom_getphandle(prom_mmu_ihandle()); if (prom_getprop(pnode, PROM_KCTX_PRESERVED_PROPNAME, (caddr_t)&val) == 0) { kmdb_prom_preserve_kctx = 1; } }