Skip to content
This repository was archived by the owner on Jul 6, 2019. It is now read-only.

Commit e9d9631

Browse files
committed
Merge pull request #145 from bgamari/ioreg-write-only
ioreg: write-only register fixes
2 parents 2af9fe6 + 296d34a commit e9d9631

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

ioreg/builder/accessors.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,10 @@ pub struct BuildAccessors<'a, 'b, 'c> {
3434
impl<'a, 'b, 'c> node::RegVisitor for BuildAccessors<'a, 'b, 'c> {
3535
fn visit_prim_reg(&mut self, path: &Vec<String>, reg: &node::Reg,
3636
_width: node::RegWidth, fields: &Vec<node::Field>) {
37-
let item = build_get_fn(self.cx, path, reg);
38-
self.builder.push_item(item);
37+
if fields.iter().any(|f| f.access != node::WriteOnly) {
38+
let item = build_get_fn(self.cx, path, reg);
39+
self.builder.push_item(item);
40+
}
3941

4042
for field in fields.iter() {
4143
match build_field_accessors(self.cx, path, reg, field) {

ioreg/builder/setter.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,14 +122,23 @@ fn build_drop<'a>(cx: &'a ExtCtxt, path: &Vec<String>,
122122
}
123123
}
124124

125+
// no need to read write-only registers
126+
let wo_reg: bool = fields.iter().all(|f| f.access == node::WriteOnly);
127+
let initial_value =
128+
if wo_reg {
129+
quote_expr!(cx, 0)
130+
} else {
131+
quote_expr!(cx, self.reg.value.get())
132+
};
133+
125134
let item = quote_item!(cx,
126135
#[unsafe_destructor]
127136
#[doc = "This performs the register update"]
128137
impl Drop for $setter_ty {
129138
fn drop(&mut self) {
130139
let clear_mask: $unpacked_ty = $clear as $unpacked_ty;
131140
if self.mask != 0 {
132-
let v: $unpacked_ty = self.reg.value.get() & ! clear_mask & ! self.mask;
141+
let v: $unpacked_ty = $initial_value & ! clear_mask & ! self.mask;
133142
self.reg.value.set(self.value | v);
134143
}
135144
}

0 commit comments

Comments
 (0)