diff --git a/src/obj/relocations.rs b/src/obj/relocations.rs index 1bc38389..0ce3b7b4 100644 --- a/src/obj/relocations.rs +++ b/src/obj/relocations.rs @@ -22,6 +22,22 @@ pub enum ObjRelocKind { PpcEmbSda21, } +impl ObjRelocKind { + /// Bits of the target word that the linker overwrites when applying this + /// relocation. + pub fn value_mask(self) -> u32 { + match self { + ObjRelocKind::Absolute => !0, + ObjRelocKind::PpcAddr16Hi | ObjRelocKind::PpcAddr16Ha | ObjRelocKind::PpcAddr16Lo => { + 0xFFFF + } + ObjRelocKind::PpcRel24 => 0x3FFFFFC, + ObjRelocKind::PpcRel14 => 0xFFFC, + ObjRelocKind::PpcEmbSda21 => 0x1FFFFF, + } + } +} + impl Serialize for ObjRelocKind { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { diff --git a/src/util/signatures.rs b/src/util/signatures.rs index 51c628e7..0e4e75db 100644 --- a/src/util/signatures.rs +++ b/src/util/signatures.rs @@ -332,30 +332,9 @@ pub fn generate_signature( } btree_map::Entry::Occupied(e) => *e.get(), }; - match reloc.kind { - ObjRelocKind::Absolute => { - *ins = 0; - *pat = 0; - } - ObjRelocKind::PpcAddr16Hi - | ObjRelocKind::PpcAddr16Ha - | ObjRelocKind::PpcAddr16Lo => { - *ins &= !0xFFFF; - *pat = !0xFFFF; - } - ObjRelocKind::PpcRel24 => { - *ins &= !0x3FFFFFC; - *pat = !0x3FFFFFC; - } - ObjRelocKind::PpcRel14 => { - *ins &= !0xFFFC; - *pat = !0xFFFC; - } - ObjRelocKind::PpcEmbSda21 => { - *ins &= !0x1FFFFF; - *pat = !0x1FFFFF; - } - } + let mask = !reloc.kind.value_mask(); + *ins &= mask; + *pat = mask; out_relocs.push(OutReloc { offset: addr - (symbol.address as u32), kind: reloc.kind,