diff options
author | 2008-03-19 20:21:01 +0000 | |
---|---|---|
committer | 2008-03-19 20:21:01 +0000 | |
commit | 333a46562146bb23c8b5b690d2b28630601ef7ce (patch) | |
tree | 3fb85365c7a7cb38855973ad69eb6e4f681ad409 | |
parent | CMSG_LEN and CMSG_SPACE are not neccessarily the same size. So if you (diff) | |
download | wireguard-openbsd-333a46562146bb23c8b5b690d2b28630601ef7ce.tar.xz wireguard-openbsd-333a46562146bb23c8b5b690d2b28630601ef7ce.zip |
Add prom_itlb_load() and prom_dtlb_load().
-rw-r--r-- | sys/arch/sparc64/include/sparc64.h | 4 | ||||
-rw-r--r-- | sys/arch/sparc64/sparc64/ofw_machdep.c | 70 |
2 files changed, 72 insertions, 2 deletions
diff --git a/sys/arch/sparc64/include/sparc64.h b/sys/arch/sparc64/include/sparc64.h index 701110e9677..021de61cfee 100644 --- a/sys/arch/sparc64/include/sparc64.h +++ b/sys/arch/sparc64/include/sparc64.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sparc64.h,v 1.8 2008/03/08 15:42:26 kettenis Exp $ */ +/* $OpenBSD: sparc64.h,v 1.9 2008/03/19 20:21:01 kettenis Exp $ */ /* $NetBSD: sparc64.h,v 1.3 2000/10/20 05:47:03 mrg Exp $ */ /* @@ -50,6 +50,8 @@ paddr_t prom_alloc_phys(int len, int align); paddr_t prom_claim_phys(paddr_t phys, int len); int prom_free_phys(paddr_t paddr, int len); paddr_t prom_get_msgbuf(int len, int align); +int prom_itlb_load(int index, u_int64_t data, vaddr_t vaddr); +int prom_dtlb_load(int index, u_int64_t data, vaddr_t vaddr); void prom_start_cpu(int cpu, void *func, long arg); void prom_start_cpu_by_cpuid(int cpu, void *func, long arg); diff --git a/sys/arch/sparc64/sparc64/ofw_machdep.c b/sys/arch/sparc64/sparc64/ofw_machdep.c index 4e3f0e1b62d..60482f2fdb9 100644 --- a/sys/arch/sparc64/sparc64/ofw_machdep.c +++ b/sys/arch/sparc64/sparc64/ofw_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ofw_machdep.c,v 1.24 2008/03/08 15:42:26 kettenis Exp $ */ +/* $OpenBSD: ofw_machdep.c,v 1.25 2008/03/19 20:21:01 kettenis Exp $ */ /* $NetBSD: ofw_machdep.c,v 1.16 2001/07/20 00:07:14 eeh Exp $ */ /* @@ -563,6 +563,74 @@ prom_get_msgbuf(len, align) return addr; /* Kluge till we go 64-bit */ } +int +prom_itlb_load(int index, u_int64_t data, vaddr_t vaddr) +{ + static struct { + cell_t name; + cell_t nargs; + cell_t nreturns; + cell_t method; + cell_t ihandle; + cell_t vaddr; + cell_t data; + cell_t index; + cell_t status; + } args; + + if (mmuh == -1 && ((mmuh = get_mmu_handle()) == -1)) { + prom_printf("prom_itlb_load: cannot get mmuh\r\n"); + return 0; + } + args.name = ADR2CELL("call-method"); + args.nargs = 5; + args.nreturns = 1; + args.method = ADR2CELL("SUNW,itlb-load"); + args.ihandle = HDL2CELL(mmuh); + args.vaddr = ADR2CELL(vaddr); + args.data = data; + args.index = index; + if(openfirmware(&args) == -1) + return -1; + if (args.status) + return -1; + return 0; +} + +int +prom_dtlb_load(int index, u_int64_t data, vaddr_t vaddr) +{ + static struct { + cell_t name; + cell_t nargs; + cell_t nreturns; + cell_t method; + cell_t ihandle; + cell_t vaddr; + cell_t data; + cell_t index; + cell_t status; + } args; + + if (mmuh == -1 && ((mmuh = get_mmu_handle()) == -1)) { + prom_printf("prom_itlb_load: cannot get mmuh\r\n"); + return 0; + } + args.name = ADR2CELL("call-method"); + args.nargs = 5; + args.nreturns = 1; + args.method = ADR2CELL("SUNW,dtlb-load"); + args.ihandle = HDL2CELL(mmuh); + args.vaddr = ADR2CELL(vaddr); + args.data = data; + args.index = index; + if(openfirmware(&args) == -1) + return -1; + if (args.status) + return -1; + return 0; +} + #ifdef MULTIPROCESSOR /* * Start secondary cpu, arrange 'func' as the entry. |