On Mon, Jan 4, 2016 at 1:02 PM, Borislav Petkov <bp@xxxxxxxxx> wrote: > On Mon, Jan 04, 2016 at 10:08:43AM -0800, Andy Lutomirski wrote: >> All of that's correct, including the part where it's confusing. The >> comments aren't the best. >> >> How about adding a comment like: >> >> ----- begin comment ----- >> >> The offset to the fixup is signed, and we're trying to use the high >> bits for a different purpose. In C, we could just do: >> >> u32 class_and_offset = ((target - here) & 0x3fffffff) | class; >> >> Then, to decode it, we'd mask off the class and sign-extend to recover >> the offset. >> >> In asm, we can't do that, because this all gets laundered through the >> linker, and there's no relocation type that supports this chicanery. >> Instead we cheat a bit. We first add a large number to the offset >> (0x20000000). The result is still nominally signed, but now it's >> always positive, and the two high bits are always clear. We can then >> set high bits by ordinary addition or subtraction instead of using >> bitwise operations. As far as the linker is concerned, all we're >> doing is adding a large constant to the difference between here (".") >> and the target, and that's a valid relocation type. >> >> In the C code, we just mask off the class bits and subtract 0x20000000 >> to get the offset. >> >> ----- end comment ----- > > Yeah, that makes more sense, thanks. > > That nasty "." current position thing stays in the way to do it cleanly. :-) > > Anyway, ok, I see it now. It still feels a bit hacky to me. I probably > would've added the third int to the exception table instead. It would've > been much more straightforward and clean this way and I'd gladly pay the > additional 6K growth. Josh will argue with you if he sees that :) We could maybe come up with a way to compress the table and get that space and more back, but maybe that should be a follow-up that someone else can do if they're inspired. --Andy -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>