On 2020/12/9 4:16, Richard Henderson wrote:
On 12/6/20 10:46 PM, LIU Zhiwei wrote:
First-fault or no-fault doesn't mean only access one page.
But the implementation is *allowed* to access only one page.
Thus the comment:
- /*
- * MemSingleNF is allowed to fail for any reason. We have special
- * code above to handle the first element crossing a page boundary.
- * As an implementation choice, decline to handle a cross-page element
- * in any other position.
- */
From the pseudo code, I see that we should handle the first element
in first-fault follow Mem. And the other elements in this function
should follow MemNF.
I have some questions here:
1. Why do special process to the first element if it crosses pages in
no-fault? Because it's not aligned?
// MemNF[] - non-assignment form
// =============================
(bits(8*size), boolean) MemNF[bits(64) address, integer size, AccType
acctype]
assert size IN {1, 2, 4, 8, 16};
bits(8*size) value;
aligned = (address == Align(address, size));
A = SCTLR[].A;
if !aligned && (A == '1') then
return (bits(8*size) UNKNOWN, TRUE);
atomic = aligned || size == 1;
if !atomic then
(value<7:0>, bad) = MemSingleNF[address, 1, acctype, aligned];
if bad then
return (bits(8*size) UNKNOWN, TRUE);
// For subsequent bytes it is CONSTRAINED UNPREDICTABLE whether
an unaligned Device memory
// access will generate an Alignment Fault, as to get this far
means the first byte did
// not, so we must be changing to a new translation page.
if !aligned then
c = ConstrainUnpredictable(Unpredictable_DEVPAGE2);
assert c IN {Constraint_FAULT, Constraint_NONE};
if c == Constraint_NONE then aligned = TRUE;
for i = 1 to size-1
(value<8*i+7:8*i>, bad) = MemSingleNF[address+i, 1,
acctype, aligned];
if bad then
return (bits(8*size) UNKNOWN, TRUE);
else
(value, bad) = MemSingleNF[address, size, acctype, aligned];
if bad then
return (bits(8*size) UNKNOWN, TRUE);
return (value, FALSE);
2. Why it doesn't access the second page like the first page? I think
they should obey the same MemSingleNF implementation.
r~