6666#define APPLE_RTKIT_SYSLOG_MSG_SIZE GENMASK_ULL(31, 24)
6767
6868#define APPLE_RTKIT_OSLOG_TYPE GENMASK_ULL(63, 56)
69- #define APPLE_RTKIT_OSLOG_INIT 1
70- #define APPLE_RTKIT_OSLOG_ACK 3
69+ #define APPLE_RTKIT_OSLOG_BUFFER_REQUEST 1
70+ #define APPLE_RTKIT_OSLOG_SIZE GENMASK_ULL(55, 36)
71+ #define APPLE_RTKIT_OSLOG_IOVA GENMASK_ULL(35, 0)
7172
7273#define APPLE_RTKIT_MIN_SUPPORTED_VERSION 11
7374#define APPLE_RTKIT_MAX_SUPPORTED_VERSION 12
@@ -256,15 +257,21 @@ static int apple_rtkit_common_rx_get_buffer(struct apple_rtkit *rtk,
256257 struct apple_rtkit_shmem * buffer ,
257258 u8 ep , u64 msg )
258259{
259- size_t n_4kpages = FIELD_GET (APPLE_RTKIT_BUFFER_REQUEST_SIZE , msg );
260260 u64 reply ;
261261 int err ;
262262
263+ /* The different size vs. IOVA shifts look odd but are indeed correct this way */
264+ if (ep == APPLE_RTKIT_EP_OSLOG ) {
265+ buffer -> size = FIELD_GET (APPLE_RTKIT_OSLOG_SIZE , msg );
266+ buffer -> iova = FIELD_GET (APPLE_RTKIT_OSLOG_IOVA , msg ) << 12 ;
267+ } else {
268+ buffer -> size = FIELD_GET (APPLE_RTKIT_BUFFER_REQUEST_SIZE , msg ) << 12 ;
269+ buffer -> iova = FIELD_GET (APPLE_RTKIT_BUFFER_REQUEST_IOVA , msg );
270+ }
271+
263272 buffer -> buffer = NULL ;
264273 buffer -> iomem = NULL ;
265274 buffer -> is_mapped = false;
266- buffer -> iova = FIELD_GET (APPLE_RTKIT_BUFFER_REQUEST_IOVA , msg );
267- buffer -> size = n_4kpages << 12 ;
268275
269276 dev_dbg (rtk -> dev , "RTKit: buffer request for 0x%zx bytes at %pad\n" ,
270277 buffer -> size , & buffer -> iova );
@@ -289,11 +296,21 @@ static int apple_rtkit_common_rx_get_buffer(struct apple_rtkit *rtk,
289296 }
290297
291298 if (!buffer -> is_mapped ) {
292- reply = FIELD_PREP (APPLE_RTKIT_SYSLOG_TYPE ,
293- APPLE_RTKIT_BUFFER_REQUEST );
294- reply |= FIELD_PREP (APPLE_RTKIT_BUFFER_REQUEST_SIZE , n_4kpages );
295- reply |= FIELD_PREP (APPLE_RTKIT_BUFFER_REQUEST_IOVA ,
296- buffer -> iova );
299+ /* oslog uses different fields and needs a shifted IOVA instead of size */
300+ if (ep == APPLE_RTKIT_EP_OSLOG ) {
301+ reply = FIELD_PREP (APPLE_RTKIT_OSLOG_TYPE ,
302+ APPLE_RTKIT_OSLOG_BUFFER_REQUEST );
303+ reply |= FIELD_PREP (APPLE_RTKIT_OSLOG_SIZE , buffer -> size );
304+ reply |= FIELD_PREP (APPLE_RTKIT_OSLOG_IOVA ,
305+ buffer -> iova >> 12 );
306+ } else {
307+ reply = FIELD_PREP (APPLE_RTKIT_SYSLOG_TYPE ,
308+ APPLE_RTKIT_BUFFER_REQUEST );
309+ reply |= FIELD_PREP (APPLE_RTKIT_BUFFER_REQUEST_SIZE ,
310+ buffer -> size >> 12 );
311+ reply |= FIELD_PREP (APPLE_RTKIT_BUFFER_REQUEST_IOVA ,
312+ buffer -> iova );
313+ }
297314 apple_rtkit_send_message (rtk , ep , reply , NULL , false);
298315 }
299316
@@ -487,25 +504,18 @@ static void apple_rtkit_syslog_rx(struct apple_rtkit *rtk, u64 msg)
487504 }
488505}
489506
490- static void apple_rtkit_oslog_rx_init (struct apple_rtkit * rtk , u64 msg )
491- {
492- u64 ack ;
493-
494- dev_dbg (rtk -> dev , "RTKit: oslog init: msg: 0x%llx\n" , msg );
495- ack = FIELD_PREP (APPLE_RTKIT_OSLOG_TYPE , APPLE_RTKIT_OSLOG_ACK );
496- apple_rtkit_send_message (rtk , APPLE_RTKIT_EP_OSLOG , ack , NULL , false);
497- }
498-
499507static void apple_rtkit_oslog_rx (struct apple_rtkit * rtk , u64 msg )
500508{
501509 u8 type = FIELD_GET (APPLE_RTKIT_OSLOG_TYPE , msg );
502510
503511 switch (type ) {
504- case APPLE_RTKIT_OSLOG_INIT :
505- apple_rtkit_oslog_rx_init (rtk , msg );
512+ case APPLE_RTKIT_OSLOG_BUFFER_REQUEST :
513+ apple_rtkit_common_rx_get_buffer (rtk , & rtk -> oslog_buffer ,
514+ APPLE_RTKIT_EP_OSLOG , msg );
506515 break ;
507516 default :
508- dev_warn (rtk -> dev , "RTKit: Unknown oslog message: %llx\n" , msg );
517+ dev_warn (rtk -> dev , "RTKit: Unknown oslog message: %llx\n" ,
518+ msg );
509519 }
510520}
511521
@@ -787,6 +797,7 @@ int apple_rtkit_reinit(struct apple_rtkit *rtk)
787797
788798 apple_rtkit_free_buffer (rtk , & rtk -> ioreport_buffer );
789799 apple_rtkit_free_buffer (rtk , & rtk -> crashlog_buffer );
800+ apple_rtkit_free_buffer (rtk , & rtk -> oslog_buffer );
790801 apple_rtkit_free_buffer (rtk , & rtk -> syslog_buffer );
791802
792803 kfree (rtk -> syslog_msg_buffer );
@@ -967,6 +978,7 @@ void apple_rtkit_free(struct apple_rtkit *rtk)
967978
968979 apple_rtkit_free_buffer (rtk , & rtk -> ioreport_buffer );
969980 apple_rtkit_free_buffer (rtk , & rtk -> crashlog_buffer );
981+ apple_rtkit_free_buffer (rtk , & rtk -> oslog_buffer );
970982 apple_rtkit_free_buffer (rtk , & rtk -> syslog_buffer );
971983
972984 kfree (rtk -> syslog_msg_buffer );
0 commit comments