xref: /llvm-project/bolt/test/X86/linux-parainstructions.s (revision 6e8a1a45a783c13e4cd19bfd20b7a56cab6f7d81)
1f51ade25SMaksim Panchenko# REQUIRES: system-linux
2f51ade25SMaksim Panchenko
3f51ade25SMaksim Panchenko## Check that BOLT correctly parses the Linux kernel .parainstructions section.
4f51ade25SMaksim Panchenko
5f51ade25SMaksim Panchenko# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %s -o %t.o
6f51ade25SMaksim Panchenko# RUN: %clang %cflags -nostdlib %t.o -o %t.exe \
7f51ade25SMaksim Panchenko# RUN:   -Wl,--image-base=0xffffffff80000000,--no-dynamic-linker,--no-eh-frame-hdr,--no-pie
8f51ade25SMaksim Panchenko
9f51ade25SMaksim Panchenko## Verify paravirtual bindings to instructions.
10f51ade25SMaksim Panchenko
1151268a57SMaksim Panchenko# RUN: llvm-bolt %t.exe --print-normalized -o %t.out --keep-nops=0 | FileCheck %s
12f51ade25SMaksim Panchenko
13f51ade25SMaksim Panchenko# CHECK:      BOLT-INFO: Linux kernel binary detected
14f51ade25SMaksim Panchenko# CHECK:      BOLT-INFO: parsed 2 paravirtual patch sites
15f51ade25SMaksim Panchenko
16f51ade25SMaksim Panchenko  .rodata
17f51ade25SMaksim Panchenkofptr:
18f51ade25SMaksim Panchenko  .quad 0
19f51ade25SMaksim Panchenko
20f51ade25SMaksim Panchenko  .text
21f51ade25SMaksim Panchenko  .globl _start
22f51ade25SMaksim Panchenko  .type _start, %function
23f51ade25SMaksim Panchenko_start:
24f51ade25SMaksim Panchenko# CHECK: Binary Function "_start"
25f51ade25SMaksim Panchenko  nop
26f51ade25SMaksim Panchenko.L1:
27f51ade25SMaksim Panchenko  call *fptr(%rip)
28f51ade25SMaksim Panchenko# CHECK:      call
29f51ade25SMaksim Panchenko# CHECK-SAME: ParaSite: 1
30f51ade25SMaksim Panchenko  nop
31f51ade25SMaksim Panchenko.L2:
32f51ade25SMaksim Panchenko  call *fptr(%rip)
33f51ade25SMaksim Panchenko# CHECK:      call
34f51ade25SMaksim Panchenko# CHECK-SAME: ParaSite: 2
35f51ade25SMaksim Panchenko  ret
36f51ade25SMaksim Panchenko  .size _start, .-_start
37f51ade25SMaksim Panchenko
38f51ade25SMaksim Panchenko
39f51ade25SMaksim Panchenko## Paravirtual patch sites.
40f51ade25SMaksim Panchenko  .section .parainstructions,"a",@progbits
41f51ade25SMaksim Panchenko
42f51ade25SMaksim Panchenko  .balign 8
43f51ade25SMaksim Panchenko  .quad .L1      # instruction
44f51ade25SMaksim Panchenko  .byte 1        # type
45f51ade25SMaksim Panchenko  .byte 7        # length
46f51ade25SMaksim Panchenko
47f51ade25SMaksim Panchenko  .balign 8
48f51ade25SMaksim Panchenko  .quad .L2      # instruction
49f51ade25SMaksim Panchenko  .byte 1        # type
50f51ade25SMaksim Panchenko  .byte 7        # length
51f51ade25SMaksim Panchenko
52*6e8a1a45SFranklin## Linux kernel version
53*6e8a1a45SFranklin  .rodata
54*6e8a1a45SFranklin  .align 16
55*6e8a1a45SFranklin  .globl linux_banner
56*6e8a1a45SFranklin  .type  linux_banner, @object
57*6e8a1a45SFranklinlinux_banner:
58*6e8a1a45SFranklin  .string  "Linux version 6.6.61\n"
59*6e8a1a45SFranklin  .size  linux_banner, . - linux_banner
60*6e8a1a45SFranklin
61f51ade25SMaksim Panchenko## Fake Linux Kernel sections.
62f51ade25SMaksim Panchenko  .section __ksymtab,"a",@progbits
63f51ade25SMaksim Panchenko  .section __ksymtab_gpl,"a",@progbits
64