xref: /xnu-11215/libkern/os/log_encode_types.h (revision 5c2921b0)
1 /*
2  * Copyright (c) 2015-2020 Apple Inc. All rights reserved.
3  *
4  * @APPLE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. Please obtain a copy of the License at
10  * http://www.opensource.apple.com/apsl/ and read it before using this
11  * file.
12  *
13  * The Original Code and all software distributed under the License are
14  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18  * Please see the License for the specific language governing rights and
19  * limitations under the License.
20  *
21  * @APPLE_LICENSE_HEADER_END@
22  */
23 
24 #ifndef log_encode_types_h
25 #define log_encode_types_h
26 
27 /*
28  * These are IPIs between xnu and libtrace, used to have common encoding
29  * and implementation for kernel logging and user logging. They are subject
30  * to change at any point.
31  */
32 
33 #include <os/base.h>
34 #include <os/log.h>
35 #include <stdint.h>
36 #include <stdbool.h>
37 #include <stddef.h>
38 
39 #include "log_mem.h"
40 
41 #pragma mark - buffer support structures, enums
42 
43 OS_ENUM(os_log_fmt_hdr_flags, uint8_t,
44     OSLF_HDR_FLAG_HAS_PRIVATE    = 0x01,
45     OSLF_HDR_FLAG_HAS_NON_SCALAR = 0x02,
46     );
47 
48 OS_ENUM(os_log_fmt_cmd_type, uint8_t,
49     OSLF_CMD_TYPE_SCALAR      = 0, // %u, %lld, %x, %p, %g, ...
50     OSLF_CMD_TYPE_COUNT       = 1, // %.16P, %.*s
51     OSLF_CMD_TYPE_STRING      = 2, // %s
52     OSLF_CMD_TYPE_POINTER     = 3, // %P
53     OSLF_CMD_TYPE_OBJECT      = 4, // %@
54     OSLF_CMD_TYPE_WIDE_STRING = 5, // %S
55     OSLF_CMD_TYPE_ERRNO       = 6, // %m
56     OSLF_CMD_TYPE_MASK        = 7, // %{mask.foo}...
57     );
58 
59 OS_ENUM(os_log_fmt_cmd_flags, uint8_t,
60     OSLF_CMD_FLAG_PRIVATE    = 0x1,
61     OSLF_CMD_FLAG_PUBLIC     = 0x2,
62     OSLF_CMD_FLAG_SENSITIVE  = 0x4 | OSLF_CMD_FLAG_PRIVATE,
63     );
64 
65 enum os_log_int_types_t {
66 	OST_CHAR      = -2,
67 	OST_SHORT     = -1,
68 	OST_INT       =  0,
69 	OST_LONG      =  1,
70 	OST_LONGLONG  =  2,
71 	OST_SIZE      =  3,
72 	OST_INTMAX    =  4,
73 	OST_PTRDIFF   =  5,
74 };
75 
76 union os_log_fmt_types_u {
77 	uint16_t    u16;
78 	uint32_t    u32;
79 	uint64_t    u64;
80 	char        ch;
81 	short       s;
82 	int         i;
83 	void        *p;
84 	char        *pch;
85 	size_t      z;
86 	intmax_t    im;
87 	ptrdiff_t   pd;
88 	long        l;
89 	long long   ll;
90 };
91 
92 typedef struct os_log_fmt_hdr_s {
93 	os_log_fmt_hdr_flags_t hdr_flags;
94 	uint8_t hdr_cmd_cnt;
95 	uint8_t hdr_data[];
96 } *os_log_fmt_hdr_t;
97 
98 typedef struct os_log_fmt_cmd_s {
99 	os_log_fmt_cmd_flags_t cmd_flags : 4;
100 	os_log_fmt_cmd_type_t cmd_type : 4;
101 	uint8_t cmd_size;
102 	uint8_t cmd_data[];
103 } *os_log_fmt_cmd_t;
104 
105 typedef struct os_log_fmt_range_s {
106 	uint16_t offset;
107 	uint16_t length : 15;
108 	uint16_t truncated : 1;
109 } *os_log_fmt_range_t;
110 
111 #define OS_LOG_MAX_PUB_ARGS (32)
112 
113 typedef struct os_log_context_s {
114 	logmem_t                    *ctx_logmem;
115 	uint8_t                     *ctx_buffer;
116 	size_t                      ctx_buffer_sz;
117 	os_log_fmt_hdr_t            ctx_hdr;
118 	char                        *ctx_pubdata[OS_LOG_MAX_PUB_ARGS];
119 	uint16_t                    ctx_content_off; // offset into buffer->hdr_data
120 	uint16_t                    ctx_content_sz; // size not including the header
121 	uint16_t                    ctx_pubdata_sz;
122 	uint16_t                    ctx_pubdata_cnt;
123 	uint8_t                     ctx_truncated : 1;
124 	uint8_t                     ctx_allocated : 1;
125 } *os_log_context_t;
126 
127 #endif /* log_encode_types_h */
128