104e7ca8dSLaurent Vivier /* 206e23296SPhilippe Mathieu-Daudé * SPDX-License-Identifier: GPL-2.0-only 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 { \ 17*77b535cfSPhilippe Mathieu-Daudé stw_be_p(base, id); \ 1804e7ca8dSLaurent Vivier base += 2; \ 19*77b535cfSPhilippe Mathieu-Daudé stw_be_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 { \ 25*77b535cfSPhilippe Mathieu-Daudé stw_be_p(base, id); \ 2604e7ca8dSLaurent Vivier base += 2; \ 27*77b535cfSPhilippe Mathieu-Daudé stw_be_p(base, sizeof(struct bi_record) + 4); \ 2804e7ca8dSLaurent Vivier base += 2; \ 29*77b535cfSPhilippe Mathieu-Daudé stl_be_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 { \ 35*77b535cfSPhilippe Mathieu-Daudé stw_be_p(base, id); \ 3604e7ca8dSLaurent Vivier base += 2; \ 37*77b535cfSPhilippe Mathieu-Daudé stw_be_p(base, sizeof(struct bi_record) + 8); \ 3804e7ca8dSLaurent Vivier base += 2; \ 39*77b535cfSPhilippe Mathieu-Daudé stl_be_p(base, value1); \ 4004e7ca8dSLaurent Vivier base += 4; \ 41*77b535cfSPhilippe Mathieu-Daudé stl_be_p(base, value2); \ 4204e7ca8dSLaurent Vivier base += 4; \ 4304e7ca8dSLaurent Vivier } while (0) 4404e7ca8dSLaurent Vivier 45281ac13eSJason A. Donenfeld #define BOOTINFOSTR(base, id, string) \ 4604e7ca8dSLaurent Vivier do { \ 47*77b535cfSPhilippe Mathieu-Daudé stw_be_p(base, id); \ 4804e7ca8dSLaurent Vivier base += 2; \ 49*77b535cfSPhilippe Mathieu-Daudé stw_be_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 { \ 62*77b535cfSPhilippe Mathieu-Daudé stw_be_p(base, id); \ 63a988465dSJason A. Donenfeld base += 2; \ 64*77b535cfSPhilippe Mathieu-Daudé stw_be_p(base, \ 652cfa9631SJason A. Donenfeld (sizeof(struct bi_record) + len + \ 662cfa9631SJason A. Donenfeld 2 /* length field */ + 3 /* padding */) & ~3); \ 67a988465dSJason A. Donenfeld base += 2; \ 68*77b535cfSPhilippe Mathieu-Daudé stw_be_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