On Thu, Mar 14, 2013 at 05:48:40PM +0800, Zhang Yanfei wrote:
> 于 2013年03月14日 17:08, Simon Horman 写道:
> > On Thu, Mar 14, 2013 at 01:26:56AM +0800, Zhang Yanfei wrote:
> >> From: Zhang Yanfei <[email protected]>
> >>
> >> By replacing all the explicit align opertions with marco _ALIGN*,
> >> the code logic could be more clear.
> > 
> > Not a big deal, but I believe this patch needs to come after
> > the arm changes in the series in order to avoid breaking the build
> > on that architecture.
> 
> Sorry, could you explain more? I don't have an arm machine, so, I couldn't
> test them.

The problem is that kexec/fs2dt.c is used by ARM.
So _ALIGN() needs to be added to ARM before using _ALIGN() in kexec/fs2dt.c.

> And I found a bug in this patch, still the ")" issue
> 
> +     len = _ALIGN(sizeof(bb[0], 8);
> 
> oops...
> 
> > 
> >>
> >> Signed-off-by: Zhang Yanfei <[email protected]>
> >> ---
> >>  kexec/crashdump-elf.c          |    3 +--
> >>  kexec/fs2dt.c                  |    5 ++---
> >>  kexec/kexec-elf-boot.c         |    2 +-
> >>  kexec/kexec-elf-rel.c          |    8 ++++----
> >>  kexec/kexec-elf.c              |    8 ++++----
> >>  kexec/kexec.c                  |   15 +++++++--------
> >>  kexec/libfdt/libfdt_internal.h |    2 +-
> >>  7 files changed, 20 insertions(+), 23 deletions(-)
> >>
> >> diff --git a/kexec/crashdump-elf.c b/kexec/crashdump-elf.c
> >> index ec66548..2baa357 100644
> >> --- a/kexec/crashdump-elf.c
> >> +++ b/kexec/crashdump-elf.c
> >> @@ -96,8 +96,7 @@ int FUNC(struct kexec_info *info,
> >>            return -1;
> >>    }
> >>  
> >> -  sz += align - 1;
> >> -  sz &= ~(align - 1);
> >> +  sz = _ALIGN(sz, align);
> >>  
> >>    bufp = xmalloc(sz);
> >>    memset(bufp, 0, sz);
> >> diff --git a/kexec/fs2dt.c b/kexec/fs2dt.c
> >> index 5d933c8..bd972ba 100644
> >> --- a/kexec/fs2dt.c
> >> +++ b/kexec/fs2dt.c
> >> @@ -697,8 +697,7 @@ static void add_boot_block(char **bufp, off_t *sizep)
> >>    unsigned long tlen, toff;
> >>    char *buf;
> >>  
> >> -  len = sizeof(bb[0]);
> >> -  len += 7; len &= ~7;
> >> +  len = _ALIGN(sizeof(bb[0], 8);
> >>  
> >>    bb->off_mem_rsvmap = cpu_to_be32(len);
> >>  
> >> @@ -721,7 +720,7 @@ static void add_boot_block(char **bufp, off_t *sizep)
> >>  
> >>    len = propnum("");
> >>    bb->dt_strings_size = cpu_to_be32(len);
> >> -  len +=  3; len &= ~3;
> >> +  len = _ALIGN(len, 4);
> >>    bb->totalsize = cpu_to_be32(be32_to_cpu(bb->off_dt_strings) + len);
> >>  
> >>    bb->magic = cpu_to_be32(0xd00dfeed);
> >> diff --git a/kexec/kexec-elf-boot.c b/kexec/kexec-elf-boot.c
> >> index f082f8b..38f9056 100644
> >> --- a/kexec/kexec-elf-boot.c
> >> +++ b/kexec/kexec-elf-boot.c
> >> @@ -31,7 +31,7 @@
> >>  #include "kexec-elf-boot.h"
> >>  
> >>  
> >> -#define UPSZ(X) ((sizeof(X) + 3) &~3)
> >> +#define UPSZ(X) _ALIGN_UP(sizeof(X), 4)
> >>  
> >>  static struct boot_notes {
> >>    Elf_Bhdr hdr;
> >> diff --git a/kexec/kexec-elf-rel.c b/kexec/kexec-elf-rel.c
> >> index 8880c8b..38e34ec 100644
> >> --- a/kexec/kexec-elf-rel.c
> >> +++ b/kexec/kexec-elf-rel.c
> >> @@ -225,7 +225,7 @@ int elf_rel_load(struct mem_ehdr *ehdr, struct 
> >> kexec_info *info,
> >>                            buf_align = align;
> >>                    }
> >>                    /* Now align bufsz */
> >> -                  bufsz = (bufsz + (align - 1)) & ~(align - 1);
> >> +                  bufsz = _ALIGN(bufsz, align);
> >>                    /* And now add our buffer */
> >>                    bufsz += shdr->sh_size;
> >>            }
> >> @@ -237,7 +237,7 @@ int elf_rel_load(struct mem_ehdr *ehdr, struct 
> >> kexec_info *info,
> >>                            bss_align = align;
> >>                    }
> >>                    /* Now align bsssz */
> >> -                  bsssz = (bsssz + (align - 1)) & ~(align -1);
> >> +                  bsssz = _ALIGN(bsssz, align);
> >>                    /* And now add our buffer */
> >>                    bsssz += shdr->sh_size;
> >>            }
> >> @@ -269,7 +269,7 @@ int elf_rel_load(struct mem_ehdr *ehdr, struct 
> >> kexec_info *info,
> >>            if (shdr->sh_type != SHT_NOBITS) {
> >>                    unsigned long off;
> >>                    /* Adjust the address */
> >> -                  data_addr = (data_addr + (align - 1)) & ~(align -1);
> >> +                  data_addr = _ALIGN(data_addr, align);
> >>  
> >>                    /* Update the section */
> >>                    off = data_addr - buf_addr;
> >> @@ -281,7 +281,7 @@ int elf_rel_load(struct mem_ehdr *ehdr, struct 
> >> kexec_info *info,
> >>                    data_addr += shdr->sh_size;
> >>            } else {
> >>                    /* Adjust the address */
> >> -                  bss_addr = (bss_addr + (align - 1)) & ~(align -1);
> >> +                  bss_addr = _ALIGN(bss_addr, align);
> >>  
> >>                    /* Update the section */
> >>                    shdr->sh_addr = bss_addr;
> >> diff --git a/kexec/kexec-elf.c b/kexec/kexec-elf.c
> >> index b88aced..3515203 100644
> >> --- a/kexec/kexec-elf.c
> >> +++ b/kexec/kexec-elf.c
> >> @@ -704,8 +704,8 @@ static int build_mem_notes(struct mem_ehdr *ehdr)
> >>            ElfNN_Nhdr hdr;
> >>            read_nhdr(ehdr, &hdr, note);
> >>            note_size  = sizeof(hdr);
> >> -          note_size += (hdr.n_namesz + 3) & ~3;
> >> -          note_size += (hdr.n_descsz + 3) & ~3;
> >> +          note_size += _ALIGN(hdr.n_namesz, 4);
> >> +          note_size += _ALIGN(hdr.n_descsz, 4);
> >>            ehdr->e_notenum += 1;
> >>    }
> >>    /* Now walk and normalize the notes */
> >> @@ -716,9 +716,9 @@ static int build_mem_notes(struct mem_ehdr *ehdr)
> >>            read_nhdr(ehdr, &hdr, note);
> >>            note_size  = sizeof(hdr);
> >>            name       = note + note_size;
> >> -          note_size += (hdr.n_namesz + 3) & ~3;
> >> +          note_size += _ALIGN(hdr.n_namesz, 4);
> >>            desc       = note + note_size;
> >> -          note_size += (hdr.n_descsz + 3) & ~3;
> >> +          note_size += _ALIGN(hdr.n_descsz, 4);
> >>  
> >>            if ((hdr.n_namesz != 0) && (name[hdr.n_namesz -1] != '\0')) {
> >>                    /* If note name string is not null terminated, just
> >> diff --git a/kexec/kexec.c b/kexec/kexec.c
> >> index 494c5b3..f3928af 100644
> >> --- a/kexec/kexec.c
> >> +++ b/kexec/kexec.c
> >> @@ -257,8 +257,7 @@ unsigned long locate_hole(struct kexec_info *info,
> >>            if (start < hole_min) {
> >>                    start = hole_min;
> >>            }
> >> -          start = (start + hole_align - 1) &
> >> -                  ~((unsigned long long)hole_align - 1);
> >> +          start = _ALIGN(start, hole_align);
> >>            if (end > mem_max) {
> >>                    end = mem_max;
> >>            }
> >> @@ -276,8 +275,8 @@ unsigned long locate_hole(struct kexec_info *info,
> >>                            hole_base = start;
> >>                            break;
> >>                    } else {
> >> -                          hole_base = (end - hole_size) &
> >> -                                  ~((unsigned long long)hole_align - 1);
> >> +                          hole_base = _ALIGN_DOWN(end - hole_size,
> >> +                                  hole_align);
> >>                    }
> >>            }
> >>    }
> >> @@ -313,7 +312,7 @@ void add_segment_phys_virt(struct kexec_info *info,
> >>  
> >>    /* Round memsz up to a multiple of pagesize */
> >>    pagesize = getpagesize();
> >> -  memsz = (memsz + (pagesize - 1)) & ~(pagesize - 1);
> >> +  memsz = _ALIGN(memsz, pagesize);
> >>  
> >>    /* Verify base is pagesize aligned.
> >>     * Finding a way to cope with this problem
> >> @@ -363,7 +362,7 @@ unsigned long add_buffer_phys_virt(struct kexec_info 
> >> *info,
> >>  
> >>    /* Round memsz up to a multiple of pagesize */
> >>    pagesize = getpagesize();
> >> -  memsz = (memsz + (pagesize - 1)) & ~(pagesize - 1);
> >> +  memsz = _ALIGN(memsz, pagesize);
> >>  
> >>    base = locate_hole(info, memsz, buf_align, buf_min, buf_max, buf_end);
> >>    if (base == ULONG_MAX) {
> >> @@ -457,8 +456,8 @@ int add_backup_segments(struct kexec_info *info, 
> >> unsigned long backup_base,
> >>                            return -1;
> >>                    if (!find_segment_hole(info, &bkseg_base, &bkseg_size))
> >>                            break;
> >> -                  start = (bkseg_base + pagesize - 1) & ~(pagesize - 1);
> >> -                  end = (bkseg_base + bkseg_size) & ~(pagesize - 1);
> >> +                  start = _ALIGN(bkseg_base, pagesize);
> >> +                  end = _ALIGN_DOWN(bkseg_base + bkseg_size, pagesize);
> >>                    add_segment_phys_virt(info, NULL, 0,
> >>                                          start, end-start, 0);
> >>                    mem_size = mem_base + mem_size - \
> >> diff --git a/kexec/libfdt/libfdt_internal.h 
> >> b/kexec/libfdt/libfdt_internal.h
> >> index 46eb93e..3635d98 100644
> >> --- a/kexec/libfdt/libfdt_internal.h
> >> +++ b/kexec/libfdt/libfdt_internal.h
> >> @@ -52,7 +52,7 @@
> >>   */
> >>  #include <fdt.h>
> >>  
> >> -#define FDT_ALIGN(x, a)           (((x) + (a) - 1) & ~((a) - 1))
> >> +#define FDT_ALIGN(x, a)           _ALIGN(x, a)
> >>  #define FDT_TAGALIGN(x)           (FDT_ALIGN((x), FDT_TAGSIZE))
> >>  
> >>  #define FDT_CHECK_HEADER(fdt) \
> >> -- 
> >> 1.7.1
> >>
> > 
> > _______________________________________________
> > kexec mailing list
> > [email protected]
> > http://lists.infradead.org/mailman/listinfo/kexec
> > 
> 
> 

_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to