2cfa963126
Various tools, such as kexec-tools and m68k-bootinfo, expect each bootinfo entry to be aligned to 4 bytes, not 2 bytes. So adjust the padding to fill this out as such. Also, break apart the padding additions from the other field length additions, so that it's more clear why these magic numbers are being added, and comment them too. Reported-by: Geert Uytterhoeven <geert@linux-m68k.org> Cc: Laurent Vivier <laurent@vivier.eu> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> Reviewed-by: Laurent Vivier <laurent@vivier.eu> Message-Id: <20220926113900.1256630-2-Jason@zx2c4.com> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
78 lines
2.1 KiB
C
78 lines
2.1 KiB
C
/*
|
|
* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
|
|
*
|
|
* Bootinfo tags from linux bootinfo.h and bootinfo-mac.h:
|
|
* This is an easily parsable and extendable structure containing all
|
|
* information to be passed from the bootstrap to the kernel
|
|
*
|
|
* This structure is copied right after the kernel by the bootstrap
|
|
* routine.
|
|
*/
|
|
|
|
#ifndef HW_M68K_BOOTINFO_H
|
|
#define HW_M68K_BOOTINFO_H
|
|
|
|
#define BOOTINFO0(as, base, id) \
|
|
do { \
|
|
stw_phys(as, base, id); \
|
|
base += 2; \
|
|
stw_phys(as, base, sizeof(struct bi_record)); \
|
|
base += 2; \
|
|
} while (0)
|
|
|
|
#define BOOTINFO1(as, base, id, value) \
|
|
do { \
|
|
stw_phys(as, base, id); \
|
|
base += 2; \
|
|
stw_phys(as, base, sizeof(struct bi_record) + 4); \
|
|
base += 2; \
|
|
stl_phys(as, base, value); \
|
|
base += 4; \
|
|
} while (0)
|
|
|
|
#define BOOTINFO2(as, base, id, value1, value2) \
|
|
do { \
|
|
stw_phys(as, base, id); \
|
|
base += 2; \
|
|
stw_phys(as, base, sizeof(struct bi_record) + 8); \
|
|
base += 2; \
|
|
stl_phys(as, base, value1); \
|
|
base += 4; \
|
|
stl_phys(as, base, value2); \
|
|
base += 4; \
|
|
} while (0)
|
|
|
|
#define BOOTINFOSTR(as, base, id, string) \
|
|
do { \
|
|
int i; \
|
|
stw_phys(as, base, id); \
|
|
base += 2; \
|
|
stw_phys(as, base, \
|
|
(sizeof(struct bi_record) + strlen(string) + \
|
|
1 /* null termination */ + 3 /* padding */) & ~3); \
|
|
base += 2; \
|
|
for (i = 0; string[i]; i++) { \
|
|
stb_phys(as, base++, string[i]); \
|
|
} \
|
|
stb_phys(as, base++, 0); \
|
|
base = (base + 3) & ~3; \
|
|
} while (0)
|
|
|
|
#define BOOTINFODATA(as, base, id, data, len) \
|
|
do { \
|
|
int i; \
|
|
stw_phys(as, base, id); \
|
|
base += 2; \
|
|
stw_phys(as, base, \
|
|
(sizeof(struct bi_record) + len + \
|
|
2 /* length field */ + 3 /* padding */) & ~3); \
|
|
base += 2; \
|
|
stw_phys(as, base, len); \
|
|
base += 2; \
|
|
for (i = 0; i < len; ++i) { \
|
|
stb_phys(as, base++, data[i]); \
|
|
} \
|
|
base = (base + 3) & ~3; \
|
|
} while (0)
|
|
#endif
|