Page MenuHomeFreeBSD

aarch64: enable tagged pointers (TBI — Top Byte Ignored)
Needs ReviewPublic

Authored by greg_unrelenting.technology on Jul 2 2019, 1:19 PM.

Details

Reviewers
manu
andrew
Group Reviewers
arm64
Contributor Reviews (base)
Summary

TBI is a very useful feature of ARMv8 that allows the top byte of pointers to be used as a tag. This is useful for various JIT compilers, HWASAN etc. This has been enabled on Linux since 2013, but not on FreeBSD yet.

Linux clears the bits on EL0 data abort, so I've done the same (??) here — not sure about that actually.

Test Plan

This example

#include <stdio.h>
#include <stdint.h>

static inline char *tag(char *ptr) {
        return (char*)(((uintptr_t)ptr & 0xffffffffffff) | (69L << 56));
}

int main() {
        char v = 'x';
        printf("ptr %p val %c\n", &v, *(&v));
        printf("ptr %p\n", tag(&v));
        printf("val %c\n", *tag(&v));
        return 0;
}

no longer segfaults on the last dereference.

UPD: also, I got HWASAN working :) my current llvm80 patches are here (I'll try to keep the link here up to date)

Diff Detail

Repository
rS FreeBSD src repository
Lint
Lint Skipped
Unit
Unit Tests Skipped

Event Timeline

greg_unrelenting.technology edited the test plan for this revision. (Show Details)Jul 2 2019, 11:41 PM

Rebased on top of the ASID changes