mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
Have the processor defer all faults and exceptions for control
speculative loads. This at least makes control speculative loads work. In the future we should analyze which faults/exceptions we want to handle rather than defer to avoid having to call the recovery code when it's not strictly necessary.
This commit is contained in:
parent
d53c5a8872
commit
9beb1d0779
5 changed files with 53 additions and 16 deletions
|
|
@ -105,7 +105,7 @@ elf64_exec(struct preloaded_file *fp)
|
|||
ia64_set_rr(IA64_RR_BASE(7), (7 << 8) | (28 << 2));
|
||||
|
||||
pte = PTE_PRESENT | PTE_MA_WB | PTE_ACCESSED | PTE_DIRTY |
|
||||
PTE_PL_KERN | PTE_AR_RWX;
|
||||
PTE_PL_KERN | PTE_AR_RWX | PTE_ED;
|
||||
|
||||
__asm __volatile("mov cr.ifa=%0" :: "r"(IA64_RR_BASE(7)));
|
||||
__asm __volatile("mov cr.itir=%0" :: "r"(28 << 2));
|
||||
|
|
|
|||
|
|
@ -802,7 +802,7 @@ IVT_ENTRY(Alternate_Instruction_TLB, 0x0c00)
|
|||
(p13) br.spnt 9f
|
||||
;;
|
||||
(p15) movl r17=PTE_PRESENT+PTE_MA_WB+PTE_ACCESSED+PTE_DIRTY+PTE_PL_KERN+ \
|
||||
PTE_AR_RX
|
||||
PTE_AR_RX+PTE_ED
|
||||
(p14) movl r17=PTE_PRESENT+PTE_MA_UC+PTE_ACCESSED+PTE_DIRTY+PTE_PL_KERN+ \
|
||||
PTE_AR_RX
|
||||
;;
|
||||
|
|
@ -829,7 +829,7 @@ IVT_ENTRY(Alternate_Data_TLB, 0x1000)
|
|||
(p13) br.spnt 9f
|
||||
;;
|
||||
(p15) movl r17=PTE_PRESENT+PTE_MA_WB+PTE_ACCESSED+PTE_DIRTY+PTE_PL_KERN+ \
|
||||
PTE_AR_RW
|
||||
PTE_AR_RW+PTE_ED
|
||||
(p14) movl r17=PTE_PRESENT+PTE_MA_UC+PTE_ACCESSED+PTE_DIRTY+PTE_PL_KERN+ \
|
||||
PTE_AR_RW
|
||||
;;
|
||||
|
|
|
|||
|
|
@ -80,19 +80,36 @@ ENTRY_NOPROFILE(__start, 1)
|
|||
movl r16=pa_bootinfo
|
||||
;;
|
||||
}
|
||||
{ .mmi
|
||||
st8 [r16]=r8 // save the PA of the bootinfo block
|
||||
loadrs // invalidate regs
|
||||
mov r17=IA64_DCR_DEFAULT
|
||||
;;
|
||||
}
|
||||
{ .mmi
|
||||
mov cr.dcr=r17
|
||||
mov ar.rsc=3 // turn rse back on
|
||||
nop 0
|
||||
;;
|
||||
}
|
||||
{ .mmi
|
||||
srlz.d
|
||||
alloc r16=ar.pfs,0,0,1,0
|
||||
;;
|
||||
movl out0=0 // we are linked at the right address
|
||||
mov out0=r0 // we are linked at the right address
|
||||
;; // we just need to process fptrs
|
||||
}
|
||||
{ .bbb
|
||||
nop 0
|
||||
nop 0
|
||||
br.call.sptk.many rp=_reloc
|
||||
;;
|
||||
}
|
||||
{ .bbb
|
||||
nop 0
|
||||
nop 0
|
||||
br.call.sptk.many rp=ia64_init
|
||||
;;
|
||||
}
|
||||
/* NOTREACHED */
|
||||
1: br.cond.sptk.few 1b
|
||||
END(__start)
|
||||
|
|
@ -181,11 +198,10 @@ ENTRY_NOPROFILE(os_boot_rendez,0)
|
|||
mov rr[r17] = r16
|
||||
;;
|
||||
srlz.d
|
||||
mov r16 = PTE_PRESENT+PTE_MA_WB+PTE_ACCESSED+PTE_DIRTY+ \
|
||||
PTE_PL_KERN+PTE_AR_RWX
|
||||
mov r18 = 28<<2
|
||||
movl r16 = PTE_PRESENT+PTE_MA_WB+PTE_ACCESSED+PTE_DIRTY+ \
|
||||
PTE_PL_KERN+PTE_AR_RWX+PTE_ED
|
||||
;;
|
||||
|
||||
mov cr.ifa = r17
|
||||
mov cr.itir = r18
|
||||
ptr.d r17, r18
|
||||
|
|
@ -194,8 +210,10 @@ ENTRY_NOPROFILE(os_boot_rendez,0)
|
|||
srlz.i
|
||||
;;
|
||||
itr.d dtr[r0] = r16
|
||||
mov r18 = IA64_DCR_DEFAULT
|
||||
;;
|
||||
itr.i itr[r0] = r16
|
||||
mov cr.dcr = r18
|
||||
;;
|
||||
srlz.i
|
||||
;;
|
||||
|
|
|
|||
|
|
@ -1155,14 +1155,14 @@ pmap_free_pte(struct ia64_lpte *pte, vm_offset_t va)
|
|||
static PMAP_INLINE void
|
||||
pmap_pte_prot(pmap_t pm, struct ia64_lpte *pte, vm_prot_t prot)
|
||||
{
|
||||
static int prot2ar[4] = {
|
||||
PTE_AR_R, /* VM_PROT_NONE */
|
||||
PTE_AR_RW, /* VM_PROT_WRITE */
|
||||
PTE_AR_RX, /* VM_PROT_EXECUTE */
|
||||
PTE_AR_RWX /* VM_PROT_WRITE|VM_PROT_EXECUTE */
|
||||
static long prot2ar[4] = {
|
||||
PTE_AR_R, /* VM_PROT_NONE */
|
||||
PTE_AR_RW, /* VM_PROT_WRITE */
|
||||
PTE_AR_RX|PTE_ED, /* VM_PROT_EXECUTE */
|
||||
PTE_AR_RWX|PTE_ED /* VM_PROT_WRITE|VM_PROT_EXECUTE */
|
||||
};
|
||||
|
||||
pte->pte &= ~(PTE_PROT_MASK | PTE_PL_MASK | PTE_AR_MASK);
|
||||
pte->pte &= ~(PTE_PROT_MASK | PTE_PL_MASK | PTE_AR_MASK | PTE_ED);
|
||||
pte->pte |= (uint64_t)(prot & VM_PROT_ALL) << 56;
|
||||
pte->pte |= (prot == VM_PROT_NONE || pm == kernel_pmap)
|
||||
? PTE_PL_KERN : PTE_PL_USER;
|
||||
|
|
@ -1181,7 +1181,7 @@ pmap_set_pte(struct ia64_lpte *pte, vm_offset_t va, vm_offset_t pa,
|
|||
boolean_t wired, boolean_t managed)
|
||||
{
|
||||
|
||||
pte->pte &= PTE_PROT_MASK | PTE_PL_MASK | PTE_AR_MASK;
|
||||
pte->pte &= PTE_PROT_MASK | PTE_PL_MASK | PTE_AR_MASK | PTE_ED;
|
||||
pte->pte |= PTE_PRESENT | PTE_MA_WB;
|
||||
pte->pte |= (managed) ? PTE_MANAGED : (PTE_DIRTY | PTE_ACCESSED);
|
||||
pte->pte |= (wired) ? PTE_WIRED : 0;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
/*-
|
||||
* Copyright (c) 2007 Marcel Moolenaar
|
||||
* Copyright (c) 2000 Doug Rabson
|
||||
* All rights reserved.
|
||||
*
|
||||
|
|
@ -23,12 +24,30 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _MACHINE_IA64_CPU_H_
|
||||
#define _MACHINE_IA64_CPU_H_
|
||||
|
||||
/*
|
||||
* Definition of DCR bits.
|
||||
*/
|
||||
#define IA64_DCR_PP 0x0000000000000001
|
||||
#define IA64_DCR_BE 0x0000000000000002
|
||||
#define IA64_DCR_LC 0x0000000000000004
|
||||
#define IA64_DCR_DM 0x0000000000000100
|
||||
#define IA64_DCR_DP 0x0000000000000200
|
||||
#define IA64_DCR_DK 0x0000000000000400
|
||||
#define IA64_DCR_DX 0x0000000000000800
|
||||
#define IA64_DCR_DR 0x0000000000001000
|
||||
#define IA64_DCR_DA 0x0000000000002000
|
||||
#define IA64_DCR_DD 0x0000000000004000
|
||||
|
||||
#define IA64_DCR_DEFAULT \
|
||||
(IA64_DCR_DM | IA64_DCR_DP | IA64_DCR_DK | IA64_DCR_DX | \
|
||||
IA64_DCR_DR | IA64_DCR_DA | IA64_DCR_DD)
|
||||
|
||||
/*
|
||||
* Definition of PSR and IPSR bits.
|
||||
*/
|
||||
|
|
|
|||
Loading…
Reference in a new issue