Message ID | 8a1e6171-0238-4e64-5879-44233d3dec64@rimuhosting.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | livepatch-build-tools: fix section mismatch | expand |
HI all A quick bump on this, and added Andrew to the CC list since he appears to have looked at livepatch 'stuff' recently. Was this patch of any interest at all? Or just wrong? After reading patch submission guidlines, should I resend this a different way? Regards, Glenn On 4/1/19 3:28 PM, Glenn Enright wrote: > I hit an issue generating a livepatch for a recent xsa. I saw the > following lines from the create-diff-object.log ... > > /livepatch-build-tools/create-diff-object: ERROR: grant_table.o: > kpatch_regenerate_special_section: 1162: group size mismatch for section > .altinstructions > > This looks really similar to the issue reported and fixed in > https://github.com/dynup/kpatch/pull/528 > > The attached patch is based on that report, and resulted in a good > livepatch. The alt section size in my case was actually 14. > > Regards, Glenn > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xenproject.org > https://lists.xenproject.org/mailman/listinfo/xen-devel >
On Fri, Apr 12, 2019 at 01:21:48PM +1200, Glenn Enright wrote: > HI all > > A quick bump on this, and added Andrew to the CC list since he appears to > have looked at livepatch 'stuff' recently. > > Was this patch of any interest at all? Or just wrong? After reading patch > submission guidlines, should I resend this a different way? What patch? Please send it to xen-devel mailing list and use git-send-email. And also CC the maintainers -which are me and Ross. Thanks. > > Regards, Glenn > > On 4/1/19 3:28 PM, Glenn Enright wrote: > > I hit an issue generating a livepatch for a recent xsa. I saw the > > following lines from the create-diff-object.log ... > > > > /livepatch-build-tools/create-diff-object: ERROR: grant_table.o: > > kpatch_regenerate_special_section: 1162: group size mismatch for section > > .altinstructions > > > > This looks really similar to the issue reported and fixed in > > https://github.com/dynup/kpatch/pull/528 > > > > The attached patch is based on that report, and resulted in a good > > livepatch. The alt section size in my case was actually 14. > > > > Regards, Glenn > > > > _______________________________________________ > > Xen-devel mailing list > > Xen-devel@lists.xenproject.org > > https://lists.xenproject.org/mailman/listinfo/xen-devel > >
diff --git a/create-diff-object.c b/create-diff-object.c index 82f777e..f9f4abf 100644 --- a/create-diff-object.c +++ b/create-diff-object.c @@ -962,9 +962,35 @@ static int bug_frames_0_group_size(struct kpatch_elf *kelf, int offset) { return static int bug_frames_1_group_size(struct kpatch_elf *kelf, int offset) { return 8; } static int bug_frames_2_group_size(struct kpatch_elf *kelf, int offset) { return 8; } static int bug_frames_3_group_size(struct kpatch_elf *kelf, int offset) { return 16; } -static int ex_table_group_size(struct kpatch_elf *kelf, int offset) { return 8; } -static int altinstructions_group_size(struct kpatch_elf *kelf, int offset) { return 12; } +int ex_table_group_size(struct kpatch_elf *kelf, int offset) +{ + static int size = 0; + char *str; + + if (!size) { + str = getenv("EX_STRUCT_SIZE"); + if (!str) + ERROR("EX_STRUCT_SIZE not set"); + size = atoi(str); + } + + return size; +} +int altinstructions_group_size(struct kpatch_elf *kelf, int offset) +{ + static int size = 0; + char *str; + + if (!size) { + str = getenv("ALT_STRUCT_SIZE"); + if (!str) + ERROR("ALT_STRUCT_SIZE not set"); + size = atoi(str); + } + + return size; +} /* * The rela groups in the .fixup section vary in size. The beginning of each * .fixup rela group is referenced by the .ex_table section. To find the size diff --git a/livepatch-build b/livepatch-build index c057fa1..6c3409c 100755 --- a/livepatch-build +++ b/livepatch-build @@ -304,6 +304,27 @@ if [ "${SKIP}" != "build" ]; then XEN_DEBUG="debug=$XEN_DEBUG" fi + echo "Reading special section data" + SPECIAL_VARS=$(readelf -wi "$XENSYMS" | + gawk --non-decimal-data ' + BEGIN { a = e = 0 } + a == 0 && /DW_AT_name.* alt_instr$/ {a = 1; next} + e == 0 && /DW_AT_name.* exception_table_entry$/ {e = 1; next} + a == 1 {printf("export ALT_STRUCT_SIZE=%d\n", $4); a = 2} + e == 1 {printf("export EX_STRUCT_SIZE=%d\n", $4); e = 2} + a == 2 && b == 2 && p == 2 && e == 2 {exit}') + + [[ -n $SPECIAL_VARS ]] && eval "$SPECIAL_VARS" + + if [[ -z $ALT_STRUCT_SIZE ]] || [[ -z $EX_STRUCT_SIZE ]]; then + die "can't find special struct size" + fi + for i in $ALT_STRUCT_SIZE $EX_STRUCT_SIZE; do + if [[ ! $i -gt 0 ]] || [[ ! $i -le 16 ]]; then + die "invalid special struct size $i" + fi + done + echo "Perform full initial build with ${CPUS} CPU(s)..." build_full