/* * Initial implementation: * Copyright (c) 2001 Robert Drehmel * All rights reserved. * * As long as the above copyright statement and this notice remain * unchanged, you can do what ever you want with this file. * * $FreeBSD: head/sys/boot/sparc64/loader/locore.S 85718 2001-10-30 06:27:34Z jake $ */ #include #include #include #include #define SPOFF 2047 #define STACK_SIZE (2 * PAGE_SIZE) ENTRY(_start) /* limit interrupts */ wrpr %g0, 13, %pil /* * PSTATE: privileged, interrupts enabled, floating point * unit enabled */ wrpr %g0, PSTATE_PRIV|PSTATE_IE|PSTATE_PEF, %pstate wr %g0, 0x4, %fprs setx stack + STACK_SIZE - SPOFF, %l7, %l6 mov %l6, %sp call main mov %o4, %o0 illtrap /* * %o0 input VA constant * %o1 current iTLB offset * %o2 current iTLB TTE tag */ ENTRY(itlb_va_to_pa) clr %o1 0: ldxa [%o1] ASI_ITLB_TAG_READ_REG, %o2 cmp %o2, %o0 bne,a %xcc, 1f nop /* return PA of matching entry */ ldxa [%o1] ASI_ITLB_DATA_ACCESS_REG, %o0 sllx %o0, 23, %o0 srlx %o0, PAGE_SHIFT+23, %o0 sllx %o0, PAGE_SHIFT, %o0 retl mov %o0, %o1 1: cmp %o1, 63<<3 blu %xcc, 0b add %o1, 8, %o1 clr %o0 retl not %o0 ENTRY(dtlb_va_to_pa) clr %o1 0: ldxa [%o1] ASI_DTLB_TAG_READ_REG, %o2 cmp %o2, %o0 bne,a %xcc, 1f nop /* return PA of matching entry */ ldxa [%o1] ASI_DTLB_DATA_ACCESS_REG, %o0 sllx %o0, 23, %o0 srlx %o0, PAGE_SHIFT+23, %o0 sllx %o0, PAGE_SHIFT, %o0 retl mov %o0, %o1 1: cmp %o1, 63<<3 blu %xcc, 0b add %o1, 8, %o1 clr %o0 retl not %o0 /* * %o0 = slot number * %o1 = pa * %o2 = va * %o3 = flags */ ENTRY(itlb_enter) sllx %o0, 3, %o0 or %o1, %o3, %o1 mov AA_IMMU_TAR, %o3 stxa %o2, [%o3] ASI_IMMU membar #Sync stxa %o1, [%o0] ASI_ITLB_DATA_ACCESS_REG retl nop ENTRY(dtlb_enter) sllx %o0, 3, %o0 or %o1, %o3, %o1 mov AA_DMMU_TAR, %o3 stxa %o2, [%o3] ASI_DMMU membar #Sync stxa %o1, [%o0] ASI_DTLB_DATA_ACCESS_REG retl nop .comm stack, STACK_SIZE, 32