mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-24 11:29:10 +00:00
Implement dirty and access bit exceptions.
This commit is contained in:
parent
3e90246a82
commit
254d92cca6
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=66463
@ -257,16 +257,211 @@ ia64_vector_table:
|
|||||||
|
|
||||||
/* 0x2000: Dirty-Bit vector */
|
/* 0x2000: Dirty-Bit vector */
|
||||||
|
|
||||||
TRAP(8)
|
mov r16=cr.ifa
|
||||||
|
mov r17=pr
|
||||||
|
mov r20=12<<2 // XXX get page size from VHPT
|
||||||
|
;;
|
||||||
|
ptc.l r16,r20 // purge TLB
|
||||||
|
thash r18=r16
|
||||||
|
ttag r19=r16
|
||||||
|
;;
|
||||||
|
srlz.d
|
||||||
|
add r20=24,r18 // collision chain
|
||||||
|
;;
|
||||||
|
ld8 r20=[r20] // first entry
|
||||||
|
;;
|
||||||
|
rsm psr.dt // turn off data translations
|
||||||
|
;;
|
||||||
|
srlz.d // serialize
|
||||||
|
;;
|
||||||
|
1: cmp.eq p1,p2=r0,r20 // done?
|
||||||
|
(p1) br.cond.spnt.few 9f // bail if done
|
||||||
|
;;
|
||||||
|
add r21=16,r20 // tag location
|
||||||
|
;;
|
||||||
|
ld8 r21=[r21] // read tag
|
||||||
|
;;
|
||||||
|
cmp.eq p1,p2=r21,r19 // compare tags
|
||||||
|
(p2) br.cond.sptk.few 2f // if not, read next in chain
|
||||||
|
;;
|
||||||
|
ld8 r21=[r20] // read pte
|
||||||
|
mov r22=PTE_D
|
||||||
|
;;
|
||||||
|
or r21=r22,r21 // set dirty bit
|
||||||
|
;;
|
||||||
|
st8 [r20]=r21 // store back
|
||||||
|
;;
|
||||||
|
ld8 r22=[r20] // read rest of pte
|
||||||
|
;;
|
||||||
|
dep r18=0,r18,61,3 // convert vhpt ptr to physical
|
||||||
|
;;
|
||||||
|
add r20=16,r18 // address of tag
|
||||||
|
;;
|
||||||
|
ld8.acq r23=[r20] // read old tag
|
||||||
|
movl r24=(1<<63) // ti bit
|
||||||
|
;;
|
||||||
|
or r23=r23,r24 // set ti bit
|
||||||
|
;;
|
||||||
|
st8.rel [r20]=r23 // store old tag + ti
|
||||||
|
;;
|
||||||
|
mf // make sure everyone sees
|
||||||
|
;;
|
||||||
|
st8 [r18]=r21,8 // store pte
|
||||||
|
;;
|
||||||
|
st8 [r18]=r22,8
|
||||||
|
;;
|
||||||
|
st8.rel [r18]=r19 // store new tag
|
||||||
|
;;
|
||||||
|
mov pr=r17,0x1ffff // restore predicates
|
||||||
|
;;
|
||||||
|
rfi // walker will retry the access
|
||||||
|
|
||||||
|
2: add r20=24,r20 // next in chain
|
||||||
|
;;
|
||||||
|
ld8 r20=[r20] // read chain
|
||||||
|
br.cond.sptk.few 1b // loop
|
||||||
|
|
||||||
|
9: mov pr=r17,0x1ffff // restore predicates
|
||||||
|
TRAP(8) // die horribly
|
||||||
.align 1024
|
.align 1024
|
||||||
|
|
||||||
/* 0x2400: Instruction Access-Bit vector */
|
/* 0x2400: Instruction Access-Bit vector */
|
||||||
|
|
||||||
|
mov r16=cr.ifa
|
||||||
|
mov r17=pr
|
||||||
|
mov r20=12<<2 // XXX get page size from VHPT
|
||||||
|
;;
|
||||||
|
ptc.l r16,r20 // purge TLB
|
||||||
|
thash r18=r16
|
||||||
|
ttag r19=r16
|
||||||
|
;;
|
||||||
|
srlz.d
|
||||||
|
add r20=24,r18 // collision chain
|
||||||
|
;;
|
||||||
|
ld8 r20=[r20] // first entry
|
||||||
|
;;
|
||||||
|
rsm psr.dt // turn off data translations
|
||||||
|
;;
|
||||||
|
srlz.d // serialize
|
||||||
|
;;
|
||||||
|
1: cmp.eq p1,p2=r0,r20 // done?
|
||||||
|
(p1) br.cond.spnt.few 9f // bail if done
|
||||||
|
;;
|
||||||
|
add r21=16,r20 // tag location
|
||||||
|
;;
|
||||||
|
ld8 r21=[r21] // read tag
|
||||||
|
;;
|
||||||
|
cmp.eq p1,p2=r21,r19 // compare tags
|
||||||
|
(p2) br.cond.sptk.few 2f // if not, read next in chain
|
||||||
|
;;
|
||||||
|
ld8 r21=[r20] // read pte
|
||||||
|
mov r22=PTE_A
|
||||||
|
;;
|
||||||
|
or r21=r22,r21 // set accessed bit
|
||||||
|
;;
|
||||||
|
st8 [r20]=r21 // store back
|
||||||
|
;;
|
||||||
|
ld8 r22=[r20] // read rest of pte
|
||||||
|
;;
|
||||||
|
dep r18=0,r18,61,3 // convert vhpt ptr to physical
|
||||||
|
;;
|
||||||
|
add r20=16,r18 // address of tag
|
||||||
|
;;
|
||||||
|
ld8.acq r23=[r20] // read old tag
|
||||||
|
movl r24=(1<<63) // ti bit
|
||||||
|
;;
|
||||||
|
or r23=r23,r24 // set ti bit
|
||||||
|
;;
|
||||||
|
st8.rel [r20]=r23 // store old tag + ti
|
||||||
|
;;
|
||||||
|
mf // make sure everyone sees
|
||||||
|
;;
|
||||||
|
st8 [r18]=r21,8 // store pte
|
||||||
|
;;
|
||||||
|
st8 [r18]=r22,8
|
||||||
|
;;
|
||||||
|
st8.rel [r18]=r19 // store new tag
|
||||||
|
;;
|
||||||
|
mov pr=r17,0x1ffff // restore predicates
|
||||||
|
;;
|
||||||
|
rfi // walker will retry the access
|
||||||
|
|
||||||
|
2: add r20=24,r20 // next in chain
|
||||||
|
;;
|
||||||
|
ld8 r20=[r20] // read chain
|
||||||
|
br.cond.sptk.few 1b // loop
|
||||||
|
|
||||||
|
9: mov pr=r17,0x1ffff // restore predicates
|
||||||
TRAP(9)
|
TRAP(9)
|
||||||
.align 1024
|
.align 1024
|
||||||
|
|
||||||
/* 0x2800: Data Access-Bit vector */
|
/* 0x2800: Data Access-Bit vector */
|
||||||
|
|
||||||
|
mov r16=cr.ifa
|
||||||
|
mov r17=pr
|
||||||
|
mov r20=12<<2 // XXX get page size from VHPT
|
||||||
|
;;
|
||||||
|
ptc.l r16,r20 // purge TLB
|
||||||
|
thash r18=r16
|
||||||
|
ttag r19=r16
|
||||||
|
;;
|
||||||
|
srlz.d
|
||||||
|
add r20=24,r18 // collision chain
|
||||||
|
;;
|
||||||
|
ld8 r20=[r20] // first entry
|
||||||
|
;;
|
||||||
|
rsm psr.dt // turn off data translations
|
||||||
|
;;
|
||||||
|
srlz.d // serialize
|
||||||
|
;;
|
||||||
|
1: cmp.eq p1,p2=r0,r20 // done?
|
||||||
|
(p1) br.cond.spnt.few 9f // bail if done
|
||||||
|
;;
|
||||||
|
add r21=16,r20 // tag location
|
||||||
|
;;
|
||||||
|
ld8 r21=[r21] // read tag
|
||||||
|
;;
|
||||||
|
cmp.eq p1,p2=r21,r19 // compare tags
|
||||||
|
(p2) br.cond.sptk.few 2f // if not, read next in chain
|
||||||
|
;;
|
||||||
|
ld8 r21=[r20] // read pte
|
||||||
|
mov r22=PTE_A
|
||||||
|
;;
|
||||||
|
or r21=r22,r21 // set accessed bit
|
||||||
|
;;
|
||||||
|
st8 [r20]=r21 // store back
|
||||||
|
;;
|
||||||
|
ld8 r22=[r20] // read rest of pte
|
||||||
|
;;
|
||||||
|
dep r18=0,r18,61,3 // convert vhpt ptr to physical
|
||||||
|
;;
|
||||||
|
add r20=16,r18 // address of tag
|
||||||
|
;;
|
||||||
|
ld8.acq r23=[r20] // read old tag
|
||||||
|
movl r24=(1<<63) // ti bit
|
||||||
|
;;
|
||||||
|
or r23=r23,r24 // set ti bit
|
||||||
|
;;
|
||||||
|
st8.rel [r20]=r23 // store old tag + ti
|
||||||
|
;;
|
||||||
|
mf // make sure everyone sees
|
||||||
|
;;
|
||||||
|
st8 [r18]=r21,8 // store pte
|
||||||
|
;;
|
||||||
|
st8 [r18]=r22,8
|
||||||
|
;;
|
||||||
|
st8.rel [r18]=r19 // store new tag
|
||||||
|
;;
|
||||||
|
mov pr=r17,0x1ffff // restore predicates
|
||||||
|
;;
|
||||||
|
rfi // walker will retry the access
|
||||||
|
|
||||||
|
2: add r20=24,r20 // next in chain
|
||||||
|
;;
|
||||||
|
ld8 r20=[r20] // read chain
|
||||||
|
br.cond.sptk.few 1b // loop
|
||||||
|
|
||||||
|
9: mov pr=r17,0x1ffff // restore predicates
|
||||||
TRAP(10)
|
TRAP(10)
|
||||||
.align 1024
|
.align 1024
|
||||||
|
|
||||||
|
@ -257,16 +257,211 @@ ia64_vector_table:
|
|||||||
|
|
||||||
/* 0x2000: Dirty-Bit vector */
|
/* 0x2000: Dirty-Bit vector */
|
||||||
|
|
||||||
TRAP(8)
|
mov r16=cr.ifa
|
||||||
|
mov r17=pr
|
||||||
|
mov r20=12<<2 // XXX get page size from VHPT
|
||||||
|
;;
|
||||||
|
ptc.l r16,r20 // purge TLB
|
||||||
|
thash r18=r16
|
||||||
|
ttag r19=r16
|
||||||
|
;;
|
||||||
|
srlz.d
|
||||||
|
add r20=24,r18 // collision chain
|
||||||
|
;;
|
||||||
|
ld8 r20=[r20] // first entry
|
||||||
|
;;
|
||||||
|
rsm psr.dt // turn off data translations
|
||||||
|
;;
|
||||||
|
srlz.d // serialize
|
||||||
|
;;
|
||||||
|
1: cmp.eq p1,p2=r0,r20 // done?
|
||||||
|
(p1) br.cond.spnt.few 9f // bail if done
|
||||||
|
;;
|
||||||
|
add r21=16,r20 // tag location
|
||||||
|
;;
|
||||||
|
ld8 r21=[r21] // read tag
|
||||||
|
;;
|
||||||
|
cmp.eq p1,p2=r21,r19 // compare tags
|
||||||
|
(p2) br.cond.sptk.few 2f // if not, read next in chain
|
||||||
|
;;
|
||||||
|
ld8 r21=[r20] // read pte
|
||||||
|
mov r22=PTE_D
|
||||||
|
;;
|
||||||
|
or r21=r22,r21 // set dirty bit
|
||||||
|
;;
|
||||||
|
st8 [r20]=r21 // store back
|
||||||
|
;;
|
||||||
|
ld8 r22=[r20] // read rest of pte
|
||||||
|
;;
|
||||||
|
dep r18=0,r18,61,3 // convert vhpt ptr to physical
|
||||||
|
;;
|
||||||
|
add r20=16,r18 // address of tag
|
||||||
|
;;
|
||||||
|
ld8.acq r23=[r20] // read old tag
|
||||||
|
movl r24=(1<<63) // ti bit
|
||||||
|
;;
|
||||||
|
or r23=r23,r24 // set ti bit
|
||||||
|
;;
|
||||||
|
st8.rel [r20]=r23 // store old tag + ti
|
||||||
|
;;
|
||||||
|
mf // make sure everyone sees
|
||||||
|
;;
|
||||||
|
st8 [r18]=r21,8 // store pte
|
||||||
|
;;
|
||||||
|
st8 [r18]=r22,8
|
||||||
|
;;
|
||||||
|
st8.rel [r18]=r19 // store new tag
|
||||||
|
;;
|
||||||
|
mov pr=r17,0x1ffff // restore predicates
|
||||||
|
;;
|
||||||
|
rfi // walker will retry the access
|
||||||
|
|
||||||
|
2: add r20=24,r20 // next in chain
|
||||||
|
;;
|
||||||
|
ld8 r20=[r20] // read chain
|
||||||
|
br.cond.sptk.few 1b // loop
|
||||||
|
|
||||||
|
9: mov pr=r17,0x1ffff // restore predicates
|
||||||
|
TRAP(8) // die horribly
|
||||||
.align 1024
|
.align 1024
|
||||||
|
|
||||||
/* 0x2400: Instruction Access-Bit vector */
|
/* 0x2400: Instruction Access-Bit vector */
|
||||||
|
|
||||||
|
mov r16=cr.ifa
|
||||||
|
mov r17=pr
|
||||||
|
mov r20=12<<2 // XXX get page size from VHPT
|
||||||
|
;;
|
||||||
|
ptc.l r16,r20 // purge TLB
|
||||||
|
thash r18=r16
|
||||||
|
ttag r19=r16
|
||||||
|
;;
|
||||||
|
srlz.d
|
||||||
|
add r20=24,r18 // collision chain
|
||||||
|
;;
|
||||||
|
ld8 r20=[r20] // first entry
|
||||||
|
;;
|
||||||
|
rsm psr.dt // turn off data translations
|
||||||
|
;;
|
||||||
|
srlz.d // serialize
|
||||||
|
;;
|
||||||
|
1: cmp.eq p1,p2=r0,r20 // done?
|
||||||
|
(p1) br.cond.spnt.few 9f // bail if done
|
||||||
|
;;
|
||||||
|
add r21=16,r20 // tag location
|
||||||
|
;;
|
||||||
|
ld8 r21=[r21] // read tag
|
||||||
|
;;
|
||||||
|
cmp.eq p1,p2=r21,r19 // compare tags
|
||||||
|
(p2) br.cond.sptk.few 2f // if not, read next in chain
|
||||||
|
;;
|
||||||
|
ld8 r21=[r20] // read pte
|
||||||
|
mov r22=PTE_A
|
||||||
|
;;
|
||||||
|
or r21=r22,r21 // set accessed bit
|
||||||
|
;;
|
||||||
|
st8 [r20]=r21 // store back
|
||||||
|
;;
|
||||||
|
ld8 r22=[r20] // read rest of pte
|
||||||
|
;;
|
||||||
|
dep r18=0,r18,61,3 // convert vhpt ptr to physical
|
||||||
|
;;
|
||||||
|
add r20=16,r18 // address of tag
|
||||||
|
;;
|
||||||
|
ld8.acq r23=[r20] // read old tag
|
||||||
|
movl r24=(1<<63) // ti bit
|
||||||
|
;;
|
||||||
|
or r23=r23,r24 // set ti bit
|
||||||
|
;;
|
||||||
|
st8.rel [r20]=r23 // store old tag + ti
|
||||||
|
;;
|
||||||
|
mf // make sure everyone sees
|
||||||
|
;;
|
||||||
|
st8 [r18]=r21,8 // store pte
|
||||||
|
;;
|
||||||
|
st8 [r18]=r22,8
|
||||||
|
;;
|
||||||
|
st8.rel [r18]=r19 // store new tag
|
||||||
|
;;
|
||||||
|
mov pr=r17,0x1ffff // restore predicates
|
||||||
|
;;
|
||||||
|
rfi // walker will retry the access
|
||||||
|
|
||||||
|
2: add r20=24,r20 // next in chain
|
||||||
|
;;
|
||||||
|
ld8 r20=[r20] // read chain
|
||||||
|
br.cond.sptk.few 1b // loop
|
||||||
|
|
||||||
|
9: mov pr=r17,0x1ffff // restore predicates
|
||||||
TRAP(9)
|
TRAP(9)
|
||||||
.align 1024
|
.align 1024
|
||||||
|
|
||||||
/* 0x2800: Data Access-Bit vector */
|
/* 0x2800: Data Access-Bit vector */
|
||||||
|
|
||||||
|
mov r16=cr.ifa
|
||||||
|
mov r17=pr
|
||||||
|
mov r20=12<<2 // XXX get page size from VHPT
|
||||||
|
;;
|
||||||
|
ptc.l r16,r20 // purge TLB
|
||||||
|
thash r18=r16
|
||||||
|
ttag r19=r16
|
||||||
|
;;
|
||||||
|
srlz.d
|
||||||
|
add r20=24,r18 // collision chain
|
||||||
|
;;
|
||||||
|
ld8 r20=[r20] // first entry
|
||||||
|
;;
|
||||||
|
rsm psr.dt // turn off data translations
|
||||||
|
;;
|
||||||
|
srlz.d // serialize
|
||||||
|
;;
|
||||||
|
1: cmp.eq p1,p2=r0,r20 // done?
|
||||||
|
(p1) br.cond.spnt.few 9f // bail if done
|
||||||
|
;;
|
||||||
|
add r21=16,r20 // tag location
|
||||||
|
;;
|
||||||
|
ld8 r21=[r21] // read tag
|
||||||
|
;;
|
||||||
|
cmp.eq p1,p2=r21,r19 // compare tags
|
||||||
|
(p2) br.cond.sptk.few 2f // if not, read next in chain
|
||||||
|
;;
|
||||||
|
ld8 r21=[r20] // read pte
|
||||||
|
mov r22=PTE_A
|
||||||
|
;;
|
||||||
|
or r21=r22,r21 // set accessed bit
|
||||||
|
;;
|
||||||
|
st8 [r20]=r21 // store back
|
||||||
|
;;
|
||||||
|
ld8 r22=[r20] // read rest of pte
|
||||||
|
;;
|
||||||
|
dep r18=0,r18,61,3 // convert vhpt ptr to physical
|
||||||
|
;;
|
||||||
|
add r20=16,r18 // address of tag
|
||||||
|
;;
|
||||||
|
ld8.acq r23=[r20] // read old tag
|
||||||
|
movl r24=(1<<63) // ti bit
|
||||||
|
;;
|
||||||
|
or r23=r23,r24 // set ti bit
|
||||||
|
;;
|
||||||
|
st8.rel [r20]=r23 // store old tag + ti
|
||||||
|
;;
|
||||||
|
mf // make sure everyone sees
|
||||||
|
;;
|
||||||
|
st8 [r18]=r21,8 // store pte
|
||||||
|
;;
|
||||||
|
st8 [r18]=r22,8
|
||||||
|
;;
|
||||||
|
st8.rel [r18]=r19 // store new tag
|
||||||
|
;;
|
||||||
|
mov pr=r17,0x1ffff // restore predicates
|
||||||
|
;;
|
||||||
|
rfi // walker will retry the access
|
||||||
|
|
||||||
|
2: add r20=24,r20 // next in chain
|
||||||
|
;;
|
||||||
|
ld8 r20=[r20] // read chain
|
||||||
|
br.cond.sptk.few 1b // loop
|
||||||
|
|
||||||
|
9: mov pr=r17,0x1ffff // restore predicates
|
||||||
TRAP(10)
|
TRAP(10)
|
||||||
.align 1024
|
.align 1024
|
||||||
|
|
||||||
|
@ -969,6 +969,10 @@ pmap_set_pv(pmap_t pmap, pv_entry_t pv, vm_offset_t pa,
|
|||||||
}
|
}
|
||||||
|
|
||||||
pv->pv_pte.pte_p = 1; /* set to valid */
|
pv->pv_pte.pte_p = 1; /* set to valid */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Only track access/modify for managed pages.
|
||||||
|
*/
|
||||||
if (m) {
|
if (m) {
|
||||||
pv->pv_pte.pte_a = 0;
|
pv->pv_pte.pte_a = 0;
|
||||||
pv->pv_pte.pte_d = 0;
|
pv->pv_pte.pte_d = 0;
|
||||||
@ -976,10 +980,9 @@ pmap_set_pv(pmap_t pmap, pv_entry_t pv, vm_offset_t pa,
|
|||||||
pv->pv_pte.pte_a = 1;
|
pv->pv_pte.pte_a = 1;
|
||||||
pv->pv_pte.pte_d = 1;
|
pv->pv_pte.pte_d = 1;
|
||||||
}
|
}
|
||||||
pv->pv_pte.pte_a = 1; /* XXX remove this after implementing trap */
|
|
||||||
pv->pv_pte.pte_d = 1;
|
pv->pv_pte.pte_pl = prot & 3; /* privilege level */
|
||||||
pv->pv_pte.pte_pl = prot & 3; /* privilege level 0 */
|
pv->pv_pte.pte_ar = prot >> 2; /* access rights */
|
||||||
pv->pv_pte.pte_ar = prot >> 2; /* read/write/execute */
|
|
||||||
pv->pv_pte.pte_ppn = pa >> 12; /* physical address */
|
pv->pv_pte.pte_ppn = pa >> 12; /* physical address */
|
||||||
|
|
||||||
if (m) {
|
if (m) {
|
||||||
|
Loading…
Reference in New Issue
Block a user