Skip to content

Commit 4bab1e6

Browse files
committed
utils: boot-analysis: Make handling of first kernel message more flexible.
Allows us to disable EDD completely, and still have boot-analysis work.
1 parent ab223f4 commit 4bab1e6

File tree

1 file changed

+26
-9
lines changed

1 file changed

+26
-9
lines changed

boot-analysis/boot-analysis-timeline.c

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ construct_timeline (void)
6767
size_t i, j, k;
6868
struct pass_data *data;
6969
struct activity *activity;
70+
const char *first_kernel_message;
7071

7172
for (i = 0; i < NR_TEST_PASSES; ++i) {
7273
data = &pass_data[i];
@@ -217,14 +218,30 @@ construct_timeline (void)
217218
strstr (data->events[k].message, "libvirt XML:"));
218219

219220
#if defined(__aarch64__)
220-
#define FIRST_KERNEL_MESSAGE "Booting Linux on physical CPU"
221221
#define FIRST_FIRMWARE_MESSAGE "UEFI firmware starting"
222222
#else
223223
#define SGABIOS_STRING "\033[1;256r\033[256;256H\033[6n"
224-
#define FIRST_KERNEL_MESSAGE "Probing EDD"
225224
#define FIRST_FIRMWARE_MESSAGE SGABIOS_STRING
226225
#endif
227226

227+
/* Try to determine the first message that the kernel prints. */
228+
#if defined(__aarch64__)
229+
first_kernel_message = "Booting Linux on physical CPU";
230+
#else
231+
first_kernel_message = "Probing EDD";
232+
for (j = 0; j < data->nr_events; ++j)
233+
if (data->events[j].source == GUESTFS_EVENT_APPLIANCE &&
234+
strstr (data->events[j].message, first_kernel_message))
235+
goto found_first_kernel_message;
236+
first_kernel_message = "Linux version ";
237+
for (j = 0; j < data->nr_events; ++j)
238+
if (data->events[j].source == GUESTFS_EVENT_APPLIANCE &&
239+
strstr (data->events[j].message, first_kernel_message))
240+
goto found_first_kernel_message;
241+
error (EXIT_FAILURE, 0, "could not determine first message printed by the kernel");
242+
found_first_kernel_message:
243+
#endif
244+
228245
/* For the libvirt backend, find the overhead of libvirt. */
229246
FIND_OPTIONAL ("libvirt:overhead", 0,
230247
data->events[j].source == GUESTFS_EVENT_LIBRARY &&
@@ -244,7 +261,7 @@ construct_timeline (void)
244261
data->events[j].source == GUESTFS_EVENT_APPLIANCE &&
245262
strstr (data->events[j].message, FIRST_FIRMWARE_MESSAGE),
246263
data->events[k].source == GUESTFS_EVENT_APPLIANCE &&
247-
strstr (data->events[k].message, FIRST_KERNEL_MESSAGE));
264+
strstr (data->events[k].message, first_kernel_message));
248265

249266
#if defined(__i386__) || defined(__x86_64__)
250267
/* SGABIOS (option ROM). */
@@ -261,7 +278,7 @@ construct_timeline (void)
261278
data->events[j].source == GUESTFS_EVENT_APPLIANCE &&
262279
strstr (data->events[j].message, "SeaBIOS (version"),
263280
data->events[k].source == GUESTFS_EVENT_APPLIANCE &&
264-
strstr (data->events[k].message, FIRST_KERNEL_MESSAGE));
281+
strstr (data->events[k].message, first_kernel_message));
265282
#endif
266283

267284
#if defined(__i386__) || defined(__x86_64__)
@@ -276,23 +293,23 @@ construct_timeline (void)
276293
/* Find where we run the guest kernel. */
277294
FIND ("kernel", LONG_ACTIVITY,
278295
data->events[j].source == GUESTFS_EVENT_APPLIANCE &&
279-
strstr (data->events[j].message, FIRST_KERNEL_MESSAGE),
296+
strstr (data->events[j].message, first_kernel_message),
280297
data->events[k].source == GUESTFS_EVENT_CLOSE);
281298

282299
/* Kernel startup to userspace. */
283300
FIND ("kernel:overhead", 0,
284301
data->events[j].source == GUESTFS_EVENT_APPLIANCE &&
285-
strstr (data->events[j].message, FIRST_KERNEL_MESSAGE),
302+
strstr (data->events[j].message, first_kernel_message),
286303
data->events[k].source == GUESTFS_EVENT_APPLIANCE &&
287304
strstr (data->events[k].message, "supermin:") &&
288305
strstr (data->events[k].message, "starting up"));
289306

290307
/* The time taken to get into start_kernel function. */
291-
FIND ("kernel:entry", 0,
308+
FIND_OPTIONAL ("kernel:entry", 0,
292309
data->events[j].source == GUESTFS_EVENT_APPLIANCE &&
293-
strstr (data->events[j].message, FIRST_KERNEL_MESSAGE),
310+
strstr (data->events[j].message, first_kernel_message),
294311
data->events[k].source == GUESTFS_EVENT_APPLIANCE &&
295-
strstr (data->events[k].message, "Linux version"));
312+
strstr (data->events[k].message, "Linux version "));
296313

297314
#if defined(__i386__) || defined(__x86_64__)
298315
/* Alternatives patching instructions (XXX not very accurate we

0 commit comments

Comments
 (0)