From ae7c60a92ee348f6aba2149283d024471a0ea5f6 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Mitsuharu Date: Tue, 30 Oct 2007 08:32:36 +0000 Subject: [PATCH] (unexec_regions_recorder, unexec_regions_merge): Don't assume regions are aligned to page boundary. (print_load_command_name): Add LC_UUID if defined. --- src/ChangeLog | 6 ++++++ src/unexmacosx.c | 38 ++++++++++++++++++++++++++++++-------- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index c76bdd80caa..faa02a11786 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2007-10-30 YAMAMOTO Mitsuharu + + * unexmacosx.c (unexec_regions_recorder, unexec_regions_merge): + Don't assume regions are aligned to page boundary. + (print_load_command_name): Add LC_UUID if defined. + 2007-10-30 Richard Stallman * emacs.c (syms_of_emacs) : Reflow docstring. diff --git a/src/unexmacosx.c b/src/unexmacosx.c index e9664f94bbc..3646aec6983 100644 --- a/src/unexmacosx.c +++ b/src/unexmacosx.c @@ -443,15 +443,13 @@ unexec_regions_recorder (task_t task, void *rr, unsigned type, while (num && num_unexec_regions < MAX_UNEXEC_REGIONS) { - /* Subtract the size of trailing null pages from filesize. It + /* Subtract the size of trailing null bytes from filesize. It can be smaller than vmsize in segment commands. In such a - case, trailing pages are initialized with zeros. */ - for (p = ranges->address + ranges->size; p > ranges->address; - p -= sizeof (int)) - if (*(((int *) p)-1)) - break; - filesize = ROUNDUP_TO_PAGE_BOUNDARY (p - ranges->address); - assert (filesize <= ranges->size); + case, trailing bytes are initialized with zeros. */ + for (p = ranges->address + ranges->size; p > ranges->address; p--) + if (*(((char *) p)-1)) + break; + filesize = p - ranges->address; unexec_regions[num_unexec_regions].filesize = filesize; unexec_regions[num_unexec_regions++].range = *ranges; @@ -503,11 +501,19 @@ unexec_regions_merge () { int i, n; unexec_region_info r; + vm_size_t padsize; qsort (unexec_regions, num_unexec_regions, sizeof (unexec_regions[0]), &unexec_regions_sort_compare); n = 0; r = unexec_regions[0]; + padsize = r.range.address & (pagesize - 1); + if (padsize) + { + r.range.address -= padsize; + r.range.size += padsize; + r.filesize += padsize; + } for (i = 1; i < num_unexec_regions; i++) { if (r.range.address + r.range.size == unexec_regions[i].range.address @@ -520,6 +526,17 @@ unexec_regions_merge () { unexec_regions[n++] = r; r = unexec_regions[i]; + padsize = r.range.address & (pagesize - 1); + if (padsize) + { + if ((unexec_regions[n-1].range.address + + unexec_regions[n-1].range.size) == r.range.address) + unexec_regions[n-1].range.size -= padsize; + + r.range.address -= padsize; + r.range.size += padsize; + r.filesize += padsize; + } } } unexec_regions[n++] = r; @@ -562,6 +579,11 @@ print_load_command_name (int lc) case LC_TWOLEVEL_HINTS: printf ("LC_TWOLEVEL_HINTS"); break; +#ifdef LC_UUID + case LC_UUID: + printf ("LC_UUID "); + break; +#endif default: printf ("unknown "); } -- 2.39.2