The format of the arm64 and x86 exception table entries is essentially the same as of commits: 46d28947d9876fc0 ("x86/extable: Rework the exception table mechanics") d6e2cc5647753825 ("arm64: extable: add `type` and `data` fields") Both use a 12-byte entry consisting of two 32-bit relative offsets and 32 bits of (absolute) data, and their sort functions are identical aside from commentary, with arm64 saying: /* Don't touch the fixup type or data */ ... and x86 saying: /* Don't touch the fixup type */ Unify the two behind a common sort_relative_table_with_data() function, retaining the arm64 commentary. There should be no functional change as a result of this patch.
Showing the changes to scripts (1 of 1 file). Show all
Unified · Split
| @@ -231,7 +231,7 @@ static void sort_relative_table(char *extab_image, int image_size) · 230 unmodified lines | |||
| 231 | } | 231 | } |
| 232 | } | 232 | } |
| 233 | 233 | ||
| 234 | static void arm64_sort_relative_table(char *extab_image, int image_size) | 234 | static void sort_relative_table_with_data(char *extab_image, int image_size) |
| 235 | { | 235 | { |
| 236 | int i = 0; | 236 | int i = 0; |
| 237 | 237 | ||
| @@ -259,34 +259,6 @@ static void arm64_sort_relative_table(char *extab_image, int image_size) · 21 unmodified lines | |||
| 259 | } | 259 | } |
| 260 | } | 260 | } |
| 261 | 261 | ||
| 262 | static void x86_sort_relative_table(char *extab_image, int image_size) | ||
| 263 | { | ||
| 264 | int i = 0; | ||
| 265 | |||
| 266 | while (i < image_size) { | ||
| 267 | uint32_t *loc = (uint32_t *)(extab_image + i); | ||
| 268 | |||
| 269 | w(r(loc) + i, loc); | ||
| 270 | w(r(loc + 1) + i + 4, loc + 1); | ||
| 271 | /* Don't touch the fixup type */ | ||
| 272 | |||
| 273 | i += sizeof(uint32_t) * 3; | ||
| 274 | } | ||
| 275 | |||
| 276 | qsort(extab_image, image_size / 12, 12, compare_relative_table); | ||
| 277 | |||
| 278 | i = 0; | ||
| 279 | while (i < image_size) { | ||
| 280 | uint32_t *loc = (uint32_t *)(extab_image + i); | ||
| 281 | |||
| 282 | w(r(loc) - i, loc); | ||
| 283 | w(r(loc + 1) - (i + 4), loc + 1); | ||
| 284 | /* Don't touch the fixup type */ | ||
| 285 | |||
| 286 | i += sizeof(uint32_t) * 3; | ||
| 287 | } | ||
| 288 | } | ||
| 289 | |||
| 290 | static void s390_sort_relative_table(char *extab_image, int image_size) | 262 | static void s390_sort_relative_table(char *extab_image, int image_size) |
| 291 | { | 263 | { |
| 292 | int i; | 264 | int i; |
| @@ -364,15 +336,13 @@ static int do_file(char const *const fname, void *addr) · 71 unmodified lines | |||
| 364 | 336 | ||
| 365 | switch (r2(&ehdr->e_machine)) { | 337 | switch (r2(&ehdr->e_machine)) { |
| 366 | case EM_386: | 338 | case EM_386: |
| 339 | case EM_AARCH64: | ||
| 367 | case EM_X86_64: | 340 | case EM_X86_64: |
| 368 | custom_sort = x86_sort_relative_table; | 341 | custom_sort = sort_relative_table_with_data; |
| 369 | break; | 342 | break; |
| 370 | case EM_S390: | 343 | case EM_S390: |
| 371 | custom_sort = s390_sort_relative_table; | 344 | custom_sort = s390_sort_relative_table; |
| 372 | break; | 345 | break; |
| 373 | case EM_AARCH64: | ||
| 374 | custom_sort = arm64_sort_relative_table; | ||
| 375 | break; | ||
| 376 | case EM_PARISC: | 346 | case EM_PARISC: |
| 377 | case EM_PPC: | 347 | case EM_PPC: |
| 378 | case EM_PPC64: | 348 | case EM_PPC64: |