1919#define APPLE_RTKIT_EP_SYSLOG 2
2020#define APPLE_RTKIT_EP_DEBUG 3
2121#define APPLE_RTKIT_EP_IOREPORT 4
22+ #define APPLE_RTKIT_EP_OSLOG 8
2223#define APPLE_RTKIT_EP_TRACEKIT 10
2324
2425/* Messages for management endpoint. */
4748#define APPLE_RTKIT_MGMT_EPMAP_REPLY 8
4849#define APPLE_RTKIT_MGMT_EPMAP_REPLY_MORE BIT(0)
4950
51+ #define APPLE_RTKIT_OSLOG_TYPE GENMASK_ULL(63, 56)
52+ #define APPLE_RTKIT_OSLOG_BUFFER_REQUEST 1
53+ #define APPLE_RTKIT_OSLOG_SIZE GENMASK_ULL(55, 36)
54+ #define APPLE_RTKIT_OSLOG_IOVA GENMASK_ULL(35, 0)
55+
5056#define APPLE_RTKIT_MIN_SUPPORTED_VERSION 11
5157#define APPLE_RTKIT_MAX_SUPPORTED_VERSION 12
5258
@@ -66,6 +72,7 @@ struct apple_rtkit {
6672 struct apple_rtkit_buffer syslog_buffer ;
6773 struct apple_rtkit_buffer crashlog_buffer ;
6874 struct apple_rtkit_buffer ioreport_buffer ;
75+ struct apple_rtkit_buffer oslog_buffer ;
6976
7077 int iop_pwr ;
7178 int ap_pwr ;
@@ -98,30 +105,26 @@ void apple_rtkit_free(struct apple_rtkit *rtk)
98105 rtk -> shmem_destroy (rtk -> cookie , & rtk -> crashlog_buffer );
99106 if (rtk -> ioreport_buffer .buffer )
100107 rtk -> shmem_destroy (rtk -> cookie , & rtk -> ioreport_buffer );
108+ if (rtk -> oslog_buffer .buffer )
109+ rtk -> shmem_destroy (rtk -> cookie , & rtk -> oslog_buffer );
101110 } else {
102111 if (rtk -> syslog_buffer .buffer )
103112 free (rtk -> syslog_buffer .buffer );
104113 if (rtk -> crashlog_buffer .buffer )
105114 free (rtk -> crashlog_buffer .buffer );
106115 if (rtk -> ioreport_buffer .buffer )
107116 free (rtk -> ioreport_buffer .buffer );
117+ if (rtk -> oslog_buffer .buffer )
118+ free (rtk -> oslog_buffer .buffer );
108119 }
109120 free (rtk );
110121}
111122
112123static int rtkit_handle_buf_req (struct apple_rtkit * rtk , int endpoint , struct apple_mbox_msg * msg )
113124{
114125 struct apple_rtkit_buffer * buf ;
115- size_t num_4kpages ;
116126 int ret ;
117127
118- num_4kpages = FIELD_GET (APPLE_RTKIT_BUFFER_REQUEST_SIZE , msg -> msg0 );
119-
120- if (num_4kpages == 0 ) {
121- printf ("%s: unexpected request for buffer without size\n" , __func__ );
122- return -1 ;
123- }
124-
125128 switch (endpoint ) {
126129 case APPLE_RTKIT_EP_CRASHLOG :
127130 buf = & rtk -> crashlog_buffer ;
@@ -132,13 +135,31 @@ static int rtkit_handle_buf_req(struct apple_rtkit *rtk, int endpoint, struct ap
132135 case APPLE_RTKIT_EP_IOREPORT :
133136 buf = & rtk -> ioreport_buffer ;
134137 break ;
138+ case APPLE_RTKIT_EP_OSLOG :
139+ buf = & rtk -> oslog_buffer ;
140+ break ;
135141 default :
136142 printf ("%s: unexpected endpoint %d\n" , __func__ , endpoint );
137143 return -1 ;
138144 }
139145
146+ switch (endpoint ) {
147+ case APPLE_RTKIT_EP_OSLOG :
148+ buf -> size = FIELD_GET (APPLE_RTKIT_OSLOG_SIZE , msg -> msg0 );
149+ buf -> dva = FIELD_GET (APPLE_RTKIT_OSLOG_IOVA , msg -> msg0 << 12 );
150+ break ;
151+ default :
152+ buf -> size = FIELD_GET (APPLE_RTKIT_BUFFER_REQUEST_SIZE , msg -> msg0 ) << 12 ;
153+ buf -> dva = FIELD_GET (APPLE_RTKIT_BUFFER_REQUEST_IOVA , msg -> msg0 );
154+ break ;
155+ }
156+
157+ if (buf -> size == 0 ) {
158+ printf ("%s: unexpected request for buffer without size\n" , __func__ );
159+ return -1 ;
160+ }
161+
140162 buf -> dva = FIELD_GET (APPLE_RTKIT_BUFFER_REQUEST_IOVA , msg -> msg0 );
141- buf -> size = num_4kpages << 12 ;
142163 buf -> is_mapped = !!buf -> dva ;
143164
144165 if (rtk -> shmem_setup ) {
@@ -157,10 +178,18 @@ static int rtkit_handle_buf_req(struct apple_rtkit *rtk, int endpoint, struct ap
157178 }
158179
159180 if (!buf -> is_mapped ) {
160- msg -> msg0 = FIELD_PREP (APPLE_RTKIT_MGMT_TYPE , APPLE_RTKIT_BUFFER_REQUEST ) |
161- FIELD_PREP (APPLE_RTKIT_BUFFER_REQUEST_SIZE , num_4kpages ) |
162- FIELD_PREP (APPLE_RTKIT_BUFFER_REQUEST_IOVA , buf -> dva );
163- msg -> msg1 = endpoint ;
181+ /* oslog uses different fields */
182+ if (endpoint == APPLE_RTKIT_EP_OSLOG ) {
183+ msg -> msg0 = FIELD_PREP (APPLE_RTKIT_OSLOG_TYPE ,
184+ APPLE_RTKIT_OSLOG_BUFFER_REQUEST );
185+ msg -> msg0 |= FIELD_PREP (APPLE_RTKIT_OSLOG_SIZE , buf -> size );
186+ msg -> msg0 |= FIELD_PREP (APPLE_RTKIT_OSLOG_IOVA , buf -> dva >> 12 );
187+ } else {
188+ msg -> msg0 = FIELD_PREP (APPLE_RTKIT_MGMT_TYPE ,
189+ APPLE_RTKIT_BUFFER_REQUEST );
190+ msg -> msg0 |= FIELD_PREP (APPLE_RTKIT_BUFFER_REQUEST_SIZE , buf -> size >> 12 );
191+ msg -> msg0 |= FIELD_PREP (APPLE_RTKIT_BUFFER_REQUEST_IOVA , buf -> dva );
192+ }
164193
165194 return mbox_send (rtk -> chan , msg );
166195 }
@@ -193,6 +222,20 @@ int apple_rtkit_poll(struct apple_rtkit *rtk, ulong timeout)
193222 }
194223 }
195224
225+ if (endpoint == APPLE_RTKIT_EP_OSLOG ) {
226+ msgtype = FIELD_GET (APPLE_RTKIT_OSLOG_TYPE , msg .msg0 );
227+
228+ if (msgtype == APPLE_RTKIT_OSLOG_BUFFER_REQUEST ) {
229+ ret = rtkit_handle_buf_req (rtk , endpoint , & msg );
230+ if (ret < 0 )
231+ return ret ;
232+ return 0 ;
233+ } else {
234+ /* Ignore */
235+ return 0 ;
236+ }
237+ }
238+
196239 if (endpoint == APPLE_RTKIT_EP_IOREPORT ) {
197240 // these two messages have to be ack-ed for proper startup
198241 if (msgtype == 0xc || msgtype == 0x8 ) {
0 commit comments