Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PAC][AArch64][ELF] Support signed GOT #77

Open
wants to merge 9 commits into
base: dkovalev/main
Choose a base branch
from

Conversation

kovdan01
Copy link
Contributor

No description provided.

Treat 7th bit of version value for llvm_linux platform as signed GOT flag.

- llvm-readobj: print `PointerAuthELFGOT` or `!PointerAuthELFGOT` in version
  description of llvm_linux platform depending on whether the flag is set.

- clang: define `PointerAuthELFGOT` LangOption and set 7th bit of
  `aarch64-elf-pauthabi-version` LLVM module flag correspondingly;
Add `-fptrauth-elf-got` clang driver flag and set `ptrauth_elf_got`
preprocessor feature and `PointerAuthELFGOT` LangOption correspondingly.
For non-ELF triples, the driver flag is ignored and a warning is emitted.
Support the following relocations and assembly operators:

- `R_AARCH64_AUTH_ADR_GOT_PAGE` (`:got_auth:` for `adrp`)
- `R_AARCH64_AUTH_GOT_LO12_NC` (`:got_auth_lo12:` for `ldr`)
- `R_AARCH64_AUTH_GOT_ADD_LO12_NC` (`:got_auth_lo12:` for `add`)

`LOADgotAUTH` pseudo-instruction is introduced which is later expanded
to actual instruction sequence like the following.

```
adrp x16, :got_auth:sym
add x16, x16, :got_auth_lo12:sym
ldr x0, [x16]
autia x0, x16
```

Both SelectionDAG and GlobalISel are suppported. For FastISel, we fall
back to SelectionDAG.

Tests with 'auth' in name have corresponding variants w/o it.
Support `R_AARCH64_AUTH_ADR_GOT_PAGE`, `R_AARCH64_AUTH_GOT_LO12_NC` and
`R_AARCH64_AUTH_GOT_ADD_LO12_NC` GOT-generating relocations. For
preemptible symbols, dynamic relocation `R_AARCH64_AUTH_GLOB_DAT` is emitted.
Otherwise, we unconditionally emit `R_AARCH64_AUTH_RELATIVE` dynamic
relocation since pointers in signed GOT needs to be signed during dynamic
link time.
Support the following relocations and assembly operators:

- `R_AARCH64_AUTH_GOT_ADR_PREL21` (`:got_auth:` for `adr`)
- `R_AARCH64_AUTH_GOT_LD_PREL19` (`:got_auth:` for `ldr`)

`LOADgotAUTH` pseudo-instruction is expanded to actual instruction
sequence like the following.

```
adr x16, :got_auth:sym
ldr x0, [x16]
autia x0, x16
```

Both SelectionDAG and GlobalISel are suppported. For FastISel, we fall
back to SelectionDAG.

Tests with 'auth' in name have corresponding variants w/o it.
Support `R_AARCH64_AUTH_GOT_ADR_PREL21` and `R_AARCH64_AUTH_GOT_LD_PREL19`
GOT-generating relocations.
@kovdan01 kovdan01 requested a review from asl April 22, 2024 02:13
@kovdan01 kovdan01 changed the title Dkovalev/pauth signed got mainline [PAC][AArch64][ELF] Support signed GOT Apr 22, 2024
// https://github.com/ARM-software/abi-aa/blob/main/pauthabielf64/pauthabielf64.rst#default-signing-schema
// Signed GOT entries use the IA key for symbols of type STT_FUNC and the
// DA key for all other symbol types, with the address of the GOT entry as
// the modifier. The static linker must encode the signing schema into the
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// the modifier. The static linker must encode the signing schema into the
// the discriminator. The static linker must encode the signing schema into the

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the ABI, they use the modifier term in this particular paragraph. Do we want to stick with discriminator everywhere for consistency or maybe we want to use terms in the same way as in the ABI? It looks like that they use discriminator for the 16-bit value and modifier for the value with address optionally blended:

discriminator is a 16-bit unsigned integer that after an optional blending (address diversity) forms the modifier for the sign and authenticate instructions.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can probably use the term "address diversity"?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Possible variant of paraphrasing this - please let me know if it's OK. Before:

Signed GOT entries use the IA key for symbols of type STT_FUNC and the DA key for all other symbol types, with the address of the GOT entry as the modifier.

After:

Signed GOT entries use the IA key for symbols of type STT_FUNC and the DA key for all other symbol types, with address diversity enabled and no additional 16-bit discriminator.

I'm not sure if it's any better, but, if the "modifier" term confuses code readers, I have no issues with avoiding it (but it's anyway already widely used in the spec so the person should be familiar with it).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Look better to me.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants