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 { \ 4704e7ca8dSLaurent Vivier int i; \ 48281ac13eSJason A. Donenfeld stw_p(base, id); \ 4904e7ca8dSLaurent Vivier base += 2; \ 50281ac13eSJason A. Donenfeld stw_p(base, \ 512cfa9631SJason A. Donenfeld (sizeof(struct bi_record) + strlen(string) + \ 522cfa9631SJason A. Donenfeld 1 /* null termination */ + 3 /* padding */) & ~3); \ 5304e7ca8dSLaurent Vivier base += 2; \ 5404e7ca8dSLaurent Vivier for (i = 0; string[i]; i++) { \ 55281ac13eSJason A. Donenfeld stb_p(base++, string[i]); \ 5604e7ca8dSLaurent Vivier } \ 57281ac13eSJason A. Donenfeld stb_p(base++, 0); \ 58281ac13eSJason A. Donenfeld base = QEMU_ALIGN_PTR_UP(base, 4); \ 5904e7ca8dSLaurent Vivier } while (0) 60a988465dSJason A. Donenfeld 61281ac13eSJason A. Donenfeld #define BOOTINFODATA(base, id, data, len) \ 62a988465dSJason A. Donenfeld do { \ 63a988465dSJason A. Donenfeld int i; \ 64281ac13eSJason A. Donenfeld stw_p(base, id); \ 65a988465dSJason A. Donenfeld base += 2; \ 66281ac13eSJason A. Donenfeld stw_p(base, \ 672cfa9631SJason A. Donenfeld (sizeof(struct bi_record) + len + \ 682cfa9631SJason A. Donenfeld 2 /* length field */ + 3 /* padding */) & ~3); \ 69a988465dSJason A. Donenfeld base += 2; \ 70281ac13eSJason A. Donenfeld stw_p(base, len); \ 71a988465dSJason A. Donenfeld base += 2; \ 72a988465dSJason A. Donenfeld for (i = 0; i < len; ++i) { \ 73281ac13eSJason A. Donenfeld stb_p(base++, data[i]); \ 74a988465dSJason A. Donenfeld } \ 75281ac13eSJason A. Donenfeld base = QEMU_ALIGN_PTR_UP(base, 4); \ 76a988465dSJason A. Donenfeld } while (0) 7704e7ca8dSLaurent Vivier #endif 78