From 0664f0bad653ca750d320e513f685ab0c852f359 Mon Sep 17 00:00:00 2001 From: Miquel Sabaté Solà Date: Wed, 8 Jul 2026 21:13:00 +0200 Subject: Add a warning for unknown cross-mapping references MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some segments, like the 'vectors' one, will reference code that is outside of its mapping. But in some other configurations, segments cannot make these cross-mapping references so happily. Imagine: .segment "SWAPPABLE" .proc foo rts .endproc .segment "FIXED" jsr foo Here the assembler will properly detect the address of 'foo' in the context of the 'SWAPPABLE' segment. But what this assembler doesn't know is that this segment is swappable (e.g. UNROM chip). Hence, if the bank being mapped right now is not the one containing the 'SWAPPABLE' segment, then the address computed for 'foo' and used in that 'jsr' instruction will point to something else entirely. This would be similar to a use-after-free bug. This is something that can only be inspected at runtime, and so the assembler cannot be of much help here. Hence, this commit adds a warning so the programmer can understand the potentially dangerous operation. All of that being said, this commit also adds support for "asan:safe" or "check:safe", which is a magic comment that the programmer can write to re-assure the assembler that this operation is fine (e.g. there is a guarantee that the mapped bank is that one we are expecting). Hence, the code above could now be written like so: jsr foo ; check:safe Signed-off-by: Miquel Sabaté Solà --- lib/xixanta/src/object.rs | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'lib/xixanta/src/object.rs') diff --git a/lib/xixanta/src/object.rs b/lib/xixanta/src/object.rs index 64d4298..b263469 100644 --- a/lib/xixanta/src/object.rs +++ b/lib/xixanta/src/object.rs @@ -32,6 +32,10 @@ pub struct Bundle { /// used for internal purposes only. pub resolved: bool, + /// Whether the programmer assured that the line that resulted into this + /// Bundle was safe to perform cross-mapping references. + pub safe: bool, + /// Whether we have to consider the bundle to contain a negative number. /// This comes from the fact that we just have a bunch of signednessless /// bytes, but using the negative unary operator will give us a hint on how @@ -67,6 +71,7 @@ impl Bundle { cycles: 0, affected_on_page: false, resolved: true, + safe: false, negative: false, } } -- cgit v1.2.3