xref: /qemu/hw/m68k/bootinfo.h (revision 5f87dddb)
104e7ca8dSLaurent Vivier /*
204e7ca8dSLaurent Vivier  * SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
304e7ca8dSLaurent Vivier  *
404e7ca8dSLaurent Vivier  * Bootinfo tags from linux bootinfo.h and bootinfo-mac.h:
504e7ca8dSLaurent Vivier  * This is an easily parsable and extendable structure containing all
604e7ca8dSLaurent Vivier  * information to be passed from the bootstrap to the kernel
704e7ca8dSLaurent Vivier  *
804e7ca8dSLaurent Vivier  * This structure is copied right after the kernel by the bootstrap
904e7ca8dSLaurent Vivier  * routine.
1004e7ca8dSLaurent Vivier  */
1104e7ca8dSLaurent Vivier 
1204e7ca8dSLaurent Vivier #ifndef HW_M68K_BOOTINFO_H
1304e7ca8dSLaurent Vivier #define HW_M68K_BOOTINFO_H
1404e7ca8dSLaurent Vivier 
15281ac13eSJason A. Donenfeld #define BOOTINFO0(base, id) \
1604e7ca8dSLaurent Vivier     do { \
17281ac13eSJason A. Donenfeld         stw_p(base, id); \
1804e7ca8dSLaurent Vivier         base += 2; \
19281ac13eSJason A. Donenfeld         stw_p(base, sizeof(struct bi_record)); \
2004e7ca8dSLaurent Vivier         base += 2; \
2104e7ca8dSLaurent Vivier     } while (0)
2204e7ca8dSLaurent Vivier 
23281ac13eSJason A. Donenfeld #define BOOTINFO1(base, id, value) \
2404e7ca8dSLaurent Vivier     do { \
25281ac13eSJason A. Donenfeld         stw_p(base, id); \
2604e7ca8dSLaurent Vivier         base += 2; \
27281ac13eSJason A. Donenfeld         stw_p(base, sizeof(struct bi_record) + 4); \
2804e7ca8dSLaurent Vivier         base += 2; \
29281ac13eSJason A. Donenfeld         stl_p(base, value); \
3004e7ca8dSLaurent Vivier         base += 4; \
3104e7ca8dSLaurent Vivier     } while (0)
3204e7ca8dSLaurent Vivier 
33281ac13eSJason A. Donenfeld #define BOOTINFO2(base, id, value1, value2) \
3404e7ca8dSLaurent Vivier     do { \
35281ac13eSJason A. Donenfeld         stw_p(base, id); \
3604e7ca8dSLaurent Vivier         base += 2; \
37281ac13eSJason A. Donenfeld         stw_p(base, sizeof(struct bi_record) + 8); \
3804e7ca8dSLaurent Vivier         base += 2; \
39281ac13eSJason A. Donenfeld         stl_p(base, value1); \
4004e7ca8dSLaurent Vivier         base += 4; \
41281ac13eSJason A. Donenfeld         stl_p(base, value2); \
4204e7ca8dSLaurent Vivier         base += 4; \
4304e7ca8dSLaurent Vivier     } while (0)
4404e7ca8dSLaurent Vivier 
45281ac13eSJason A. Donenfeld #define BOOTINFOSTR(base, id, string) \
4604e7ca8dSLaurent Vivier     do { \
47281ac13eSJason A. Donenfeld         stw_p(base, id); \
4804e7ca8dSLaurent Vivier         base += 2; \
49281ac13eSJason A. Donenfeld         stw_p(base, \
502cfa9631SJason A. Donenfeld                  (sizeof(struct bi_record) + strlen(string) + \
512cfa9631SJason A. Donenfeld                   1 /* null termination */ + 3 /* padding */) & ~3); \
5204e7ca8dSLaurent Vivier         base += 2; \
535f87dddbSPhilippe Mathieu-Daudé         for (unsigned i_ = 0; string[i_]; i_++) { \
545f87dddbSPhilippe Mathieu-Daudé             stb_p(base++, string[i_]); \
5504e7ca8dSLaurent Vivier         } \
56281ac13eSJason A. Donenfeld         stb_p(base++, 0); \
57281ac13eSJason A. Donenfeld         base = QEMU_ALIGN_PTR_UP(base, 4); \
5804e7ca8dSLaurent Vivier     } while (0)
59a988465dSJason A. Donenfeld 
60281ac13eSJason A. Donenfeld #define BOOTINFODATA(base, id, data, len) \
61a988465dSJason A. Donenfeld     do { \
62281ac13eSJason A. Donenfeld         stw_p(base, id); \
63a988465dSJason A. Donenfeld         base += 2; \
64281ac13eSJason A. Donenfeld         stw_p(base, \
652cfa9631SJason A. Donenfeld                  (sizeof(struct bi_record) + len + \
662cfa9631SJason A. Donenfeld                   2 /* length field */ + 3 /* padding */) & ~3); \
67a988465dSJason A. Donenfeld         base += 2; \
68281ac13eSJason A. Donenfeld         stw_p(base, len); \
69a988465dSJason A. Donenfeld         base += 2; \
705f87dddbSPhilippe Mathieu-Daudé         for (unsigned i_ = 0; i_ < len; ++i_) { \
715f87dddbSPhilippe Mathieu-Daudé             stb_p(base++, data[i_]); \
72a988465dSJason A. Donenfeld         } \
73281ac13eSJason A. Donenfeld         base = QEMU_ALIGN_PTR_UP(base, 4); \
74a988465dSJason A. Donenfeld     } while (0)
7504e7ca8dSLaurent Vivier #endif
76