Bug Report: Unaligned Access in BGP Code on ARMv7 Platforms

nick vincent at systemli.org
Thu Dec 5 23:35:13 CET 2024


Dear BIRD Community,

I am writing to report a bug observed in the BGP implementation on ARMv7 
platforms, which results in a SIGBUS error due to unaligned memory 
access in the NEON assembler code. I debugged this issue on version 
2.15.1 of BIRD.

### Problem Description

When running BIRD on ARMv7, the application crashes with a `SIGBUS` 
signal. The issue stems from an unaligned memory access instruction in 
the NEON assembly:

```
vst1.8 {d16-d17}, [r0 :64]
```

This instruction requires the address in `r0` to be 64-bit (8-byte) 
aligned. However, in some cases, `r0` is not correctly aligned, leading 
to a bus error.

Here is an excerpt from the kernel logs showing the alignment trap:

```
kern.err kernel: [90636.175853] Alignment trap: not handling instruction 
f4400a1f at [<00056fbc>]
kern.alert kernel: [90636.182044] Unhandled fault: alignment exception 
(0x801) at 0xb6dec01c
kern.alert kernel: [90636.184946] pgd = 190a2833
kern.alert kernel: [90636.191494] [b6dec01c] *pgd=82e91835, 
*pte=8502b75f, *ppte=8502bc7f
```

### Backtrace

The crash occurs in the `bgp_get_prefix` function due to the misaligned 
memory address:

```
Program received signal SIGBUS, Bus error.
0x00057504 in bgp_get_prefix (path_id=0, net=0xb6f3e030, c=0xb6f27420) 
at proto/bgp/attrs.c:1710
1710    proto/bgp/attrs.c: No such file or directory.
(gdb) bt
  #0  0x00057504 in bgp_get_prefix (path_id=0, net=0xb6f3e030, 
c=0xb6f27420) at proto/bgp/attrs.c:1710
  #1  bgp_rt_notify (old=0x400, new=0x64, n=0x4, C=0xb6f27420, 
P=0xb6f27850) at proto/bgp/attrs.c:1966
  #2  bgp_rt_notify (P=0xb6f27850, C=0xb6f27420, n=0x4, new=0x64, 
old=0x0) at proto/bgp/attrs.c:1936
  ...
```

The exact crashing line is this instruction:

```c
px->path_id = path_id;
```

You can view it here:
https://github.com/CZ-NIC/bird/blob/0b684a43bd7ce4a32c9cd7754b88286bcd1815bb/proto/bgp/attrs.c#L1710

### Root Cause

The root cause appears to be insufficient alignment of memory allocated 
for structures, specifically in this line:

```c
px = mb_alloc(c->pool, sizeof(struct bgp_prefix) + net->length);
```

The allocated memory may not be properly aligned for structures 
containing 64-bit data types, which is mandatory on ARMv7 when using 
NEON instructions.

### Temporary Workaround

To mitigate the issue, we are currently using the GCC compiler flag 
`-mno-unaligned-access`. This flag ensures that the compiler avoids 
generating code that assumes unaligned access is supported, thereby 
preventing the `SIGBUS` error.
https://github.com/freifunk-berlin/falter-packages/commit/fcce390fc57b44593fe969f1063c6ba711fc7f9b

### Request for Feedback

I would like to hear the community's thoughts on the best approach to 
resolve this issue permanently. If needed, I can provide further logs or 
test configurations to reproduce the problem.

Bests,
Nick



More information about the Bird-users mailing list