Lines Matching +defs:a +defs:c
2 * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
26 * from: FreeBSD: src/sys/boot/sparc64/loader/metadata.c,v 1.6
47 * used as a directory for loaded modules.
49 * Module data is presented in a self-describing format. Each datum
50 * is preceded by a 32-bit identifier and a 32-bit size field.
61 * Clients are required to define a MOD_ALIGN(l) macro which rounds the passed
65 #define COPY32(v, a, c) { \
67 if (c) \
68 archsw.arch_copyin(&x, a, sizeof(x)); \
69 a += sizeof(x); \
72 #define MOD_STR(t, a, s, c) { \
73 COPY32(t, a, c); \
74 COPY32(strlen(s) + 1, a, c) \
75 if (c) \
76 archsw.arch_copyin(s, a, strlen(s) + 1);\
77 a += MOD_ALIGN(strlen(s) + 1); \
80 #define MOD_NAME(a, s, c) MOD_STR(MODINFO_NAME, a, s, c)
81 #define MOD_TYPE(a, s, c) MOD_STR(MODINFO_TYPE, a, s, c)
82 #define MOD_ARGS(a, s, c) MOD_STR(MODINFO_ARGS, a, s, c)
84 #define MOD_VAR(t, a, s, c) { \
85 COPY32(t, a, c); \
86 COPY32(sizeof(s), a, c); \
87 if (c) \
88 archsw.arch_copyin(&s, a, sizeof(s)); \
89 a += MOD_ALIGN(sizeof(s)); \
92 #define MOD_ADDR(a, s, c) MOD_VAR(MODINFO_ADDR, a, s, c)
93 #define MOD_SIZE(a, s, c) MOD_VAR(MODINFO_SIZE, a, s, c)
95 #define MOD_METADATA(a, mm, c) { \
96 COPY32(MODINFO_METADATA | mm->md_type, a, c);\
97 COPY32(mm->md_size, a, c); \
98 if (c) { \
99 archsw.arch_copyin(mm->md_data, a, mm->md_size);\
100 mm->md_addr = a; \
102 a += MOD_ALIGN(mm->md_size); \
105 #define MOD_END(a, c) { \
106 COPY32(MODINFO_END, a, c); \
107 COPY32(0, a, c); \
124 int c;
128 c = addr != 0;
132 MOD_NAME(addr, fp->f_name, c); /* this field must come first */
133 MOD_TYPE(addr, fp->f_type, c);
135 MOD_ARGS(addr, fp->f_args, c);
138 MOD_ADDR(addr, scratch64, c);
140 MOD_SIZE(addr, scratch64, c);
146 MOD_ADDR(addr, scratch32, c);
147 MOD_SIZE(addr, fp->f_size, c);
151 MOD_METADATA(addr, md, c);
155 MOD_END(addr, c);
161 * Each variable is formatted as <name>=<value>, with a single nul
162 * separating each variable, and a double nul terminating the environment.