xref: /freebsd/stand/common/tslog.c (revision 7c43148a974877188a930e4078a164f83da8e652)
1*c8dfc327SColin Percival /*-
2*c8dfc327SColin Percival  * Copyright (c) 2021 Colin Percival
3*c8dfc327SColin Percival  * All rights reserved.
4*c8dfc327SColin Percival  *
5*c8dfc327SColin Percival  * Redistribution and use in source and binary forms, with or without
6*c8dfc327SColin Percival  * modification, are permitted provided that the following conditions
7*c8dfc327SColin Percival  * are met:
8*c8dfc327SColin Percival  * 1. Redistributions of source code must retain the above copyright
9*c8dfc327SColin Percival  *    notice, this list of conditions and the following disclaimer.
10*c8dfc327SColin Percival  * 2. Redistributions in binary form must reproduce the above copyright
11*c8dfc327SColin Percival  *    notice, this list of conditions and the following disclaimer in the
12*c8dfc327SColin Percival  *    documentation and/or other materials provided with the distribution.
13*c8dfc327SColin Percival  *
14*c8dfc327SColin Percival  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*c8dfc327SColin Percival  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*c8dfc327SColin Percival  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*c8dfc327SColin Percival  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*c8dfc327SColin Percival  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*c8dfc327SColin Percival  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*c8dfc327SColin Percival  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*c8dfc327SColin Percival  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*c8dfc327SColin Percival  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*c8dfc327SColin Percival  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*c8dfc327SColin Percival  * SUCH DAMAGE.
25*c8dfc327SColin Percival  */
26*c8dfc327SColin Percival 
27*c8dfc327SColin Percival #include <sys/types.h>
28*c8dfc327SColin Percival 
29*c8dfc327SColin Percival #include <stand.h>
30*c8dfc327SColin Percival 
31*c8dfc327SColin Percival #include "bootstrap.h"
32*c8dfc327SColin Percival 
33*c8dfc327SColin Percival /* Buffer for holding tslog data in string format. */
34*c8dfc327SColin Percival #ifndef LOADER_TSLOGSIZE
35*c8dfc327SColin Percival #define LOADER_TSLOGSIZE (2 * 1024 * 1024)
36*c8dfc327SColin Percival #endif
37*c8dfc327SColin Percival 
38*c8dfc327SColin Percival int
tslog_init(void)39*c8dfc327SColin Percival tslog_init(void)
40*c8dfc327SColin Percival {
41*c8dfc327SColin Percival 	void * tslog_buf;
42*c8dfc327SColin Percival 
43*c8dfc327SColin Percival 	/* Allocate buffer and pass to libsa tslog code. */
44*c8dfc327SColin Percival 	if ((tslog_buf = malloc(LOADER_TSLOGSIZE)) == NULL)
45*c8dfc327SColin Percival 		return (-1);
46*c8dfc327SColin Percival 	tslog_setbuf(tslog_buf, LOADER_TSLOGSIZE);
47*c8dfc327SColin Percival 
48*c8dfc327SColin Percival 	/* Record this as when we entered the loader. */
49*c8dfc327SColin Percival 	TSRAW("ENTER", "loader", NULL);
50*c8dfc327SColin Percival 
51*c8dfc327SColin Percival 	return (0);
52*c8dfc327SColin Percival }
53*c8dfc327SColin Percival 
54*c8dfc327SColin Percival /*
55*c8dfc327SColin Percival  * Pass our tslog buffer as a preloaded "module" to the kernel.  This should
56*c8dfc327SColin Percival  * be called as late as possible prior to the kernel being executed, since
57*c8dfc327SColin Percival  * any timestamps logged after this is called will not be visible to the
58*c8dfc327SColin Percival  * kernel.
59*c8dfc327SColin Percival  */
60*c8dfc327SColin Percival int
tslog_publish(void)61*c8dfc327SColin Percival tslog_publish(void)
62*c8dfc327SColin Percival {
63*c8dfc327SColin Percival 	void * tslog_buf;
64*c8dfc327SColin Percival 	size_t tslog_bufpos;
65*c8dfc327SColin Percival 
66*c8dfc327SColin Percival 	/* Record a log entry for ending logging. */
67*c8dfc327SColin Percival 	TSRAW("EXIT", "loader", NULL);
68*c8dfc327SColin Percival 
69*c8dfc327SColin Percival 	/* Get the buffer and its current length. */
70*c8dfc327SColin Percival 	tslog_getbuf(&tslog_buf, &tslog_bufpos);
71*c8dfc327SColin Percival 
72*c8dfc327SColin Percival 	/* If we never allocated a buffer, return an error. */
73*c8dfc327SColin Percival 	if (tslog_buf == NULL)
74*c8dfc327SColin Percival 		return (-1);
75*c8dfc327SColin Percival 
76*c8dfc327SColin Percival 	/* Store the buffer where the kernel can read it. */
77*c8dfc327SColin Percival 	return (file_addbuf("TSLOG", "TSLOG data", tslog_bufpos, tslog_buf));
78*c8dfc327SColin Percival }
79