Skip to content

Commit b6c469f

Browse files
authored
Fix several page number bugs. (#4)
* fixed page number bug in sv39 and sv48 * fix gpax4 page numbers
1 parent 94a7329 commit b6c469f

File tree

3 files changed

+21
-15
lines changed

3 files changed

+21
-15
lines changed

src/addr/gpax4.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ impl AddressL3 for GPAddrSv39X4 {
107107
let p2_index = p2_index as u64;
108108
let p1_index = p1_index as u64;
109109
let offset = offset as u64;
110-
assert!(p3_index.get_bits(12..) == 0, "p3_index exceeding 12 bits");
110+
assert!(p3_index.get_bits(11..) == 0, "p3_index exceeding 11 bits");
111111
assert!(p2_index.get_bits(9..) == 0, "p2_index exceeding 9 bits");
112112
assert!(p1_index.get_bits(9..) == 0, "p1_index exceeding 9 bits");
113113
assert!(offset.get_bits(12..) == 0, "offset exceeding 12 bits");
@@ -182,7 +182,7 @@ impl AddressL4 for GPAddrSv48X4 {
182182
let p2_index = p2_index as u64;
183183
let p1_index = p1_index as u64;
184184
let offset = offset as u64;
185-
assert!(p4_index.get_bits(12..) == 0, "p4_index exceeding 12 bits");
185+
assert!(p4_index.get_bits(11..) == 0, "p4_index exceeding 11 bits");
186186
assert!(p3_index.get_bits(9..) == 0, "p3_index exceeding 9 bits");
187187
assert!(p2_index.get_bits(9..) == 0, "p2_index exceeding 9 bits");
188188
assert!(p1_index.get_bits(9..) == 0, "p1_index exceeding 9 bits");

src/addr/sv39.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ impl Address for VirtAddrSv39 {
1717
self.0.try_into().unwrap()
1818
}
1919
fn page_number(&self) -> usize {
20-
self.0.get_bits(12..64).try_into().unwrap()
20+
self.0.get_bits(12..39).try_into().unwrap()
2121
}
2222
fn page_offset(&self) -> usize {
2323
self.0.get_bits(0..12) as usize
@@ -48,14 +48,14 @@ impl AddressL3 for VirtAddrSv39 {
4848
let p2_index = p2_index as u64;
4949
let p1_index = p1_index as u64;
5050
let offset = offset as u64;
51-
assert!(p3_index.get_bits(12..) == 0, "p3_index exceeding 11 bits");
52-
assert!(p2_index.get_bits(10..) == 0, "p2_index exceeding 9 bits");
53-
assert!(p1_index.get_bits(10..) == 0, "p1_index exceeding 9 bits");
51+
assert!(p3_index.get_bits(11..) == 0, "p3_index exceeding 11 bits");
52+
assert!(p2_index.get_bits(9..) == 0, "p2_index exceeding 9 bits");
53+
assert!(p1_index.get_bits(9..) == 0, "p1_index exceeding 9 bits");
5454
assert!(offset.get_bits(12..) == 0, "offset exceeding 12 bits");
5555
let mut addr =
5656
(p3_index << 12 << 9 << 9) | (p2_index << 12 << 9) | (p1_index << 12) | offset;
5757
if addr.get_bit(38) {
58-
addr.set_bits(39..64, 0xFFFF);
58+
addr.set_bits(39..64, (1 << (64 - 39)) - 1);
5959
} else {
6060
addr.set_bits(39..64, 0x0000);
6161
}
@@ -86,7 +86,10 @@ impl Address for PhysAddrSv39 {
8686
impl AddressX64 for VirtAddrSv39 {
8787
fn new_u64(addr: u64) -> Self {
8888
if addr.get_bit(38) {
89-
assert!(addr.get_bits(39..64) == 0xFFFF, "va 39..64 is not sext");
89+
assert!(
90+
addr.get_bits(39..64) == (1 << (64 - 39)) - 1,
91+
"va 39..64 is not sext"
92+
);
9093
} else {
9194
assert!(addr.get_bits(39..64) == 0x0000, "va 39..64 is not sext");
9295
}

src/addr/sv48.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ impl Address for VirtAddrSv48 {
1717
self.0.try_into().unwrap()
1818
}
1919
fn page_number(&self) -> usize {
20-
self.0.get_bits(12..64).try_into().unwrap()
20+
self.0.get_bits(12..48).try_into().unwrap()
2121
}
2222
fn page_offset(&self) -> usize {
2323
self.0.get_bits(0..12) as usize
@@ -54,18 +54,18 @@ impl AddressL4 for VirtAddrSv48 {
5454
let p2_index = p2_index as u64;
5555
let p1_index = p1_index as u64;
5656
let offset = offset as u64;
57-
assert!(p4_index.get_bits(10..) == 0, "p4_index exceeding 9 bits");
58-
assert!(p3_index.get_bits(10..) == 0, "p3_index exceeding 9 bits");
59-
assert!(p2_index.get_bits(10..) == 0, "p2_index exceeding 9 bits");
60-
assert!(p1_index.get_bits(10..) == 0, "p1_index exceeding 9 bits");
57+
assert!(p4_index.get_bits(9..) == 0, "p4_index exceeding 9 bits");
58+
assert!(p3_index.get_bits(9..) == 0, "p3_index exceeding 9 bits");
59+
assert!(p2_index.get_bits(9..) == 0, "p2_index exceeding 9 bits");
60+
assert!(p1_index.get_bits(9..) == 0, "p1_index exceeding 9 bits");
6161
assert!(offset.get_bits(12..) == 0, "offset exceeding 12 bits");
6262
let mut addr = (p4_index << 12 << 9 << 9 << 9)
6363
| (p3_index << 12 << 9 << 9)
6464
| (p2_index << 12 << 9)
6565
| (p1_index << 12)
6666
| offset;
6767
if addr.get_bit(47) {
68-
addr.set_bits(48..64, 0xFFFF);
68+
addr.set_bits(48..64, (1 << (64 - 48)) - 1);
6969
} else {
7070
addr.set_bits(48..64, 0x0000);
7171
}
@@ -96,7 +96,10 @@ impl Address for PhysAddrSv48 {
9696
impl AddressX64 for VirtAddrSv48 {
9797
fn new_u64(addr: u64) -> Self {
9898
if addr.get_bit(47) {
99-
assert!(addr.get_bits(48..64) == 0xFFFF, "va 48..64 is not sext");
99+
assert!(
100+
addr.get_bits(48..64) == (1 << (64 - 48)) - 1,
101+
"va 48..64 is not sext"
102+
);
100103
} else {
101104
assert!(addr.get_bits(48..64) == 0x0000, "va 48..64 is not sext");
102105
}

0 commit comments

Comments
 (0)