[PATCH 4/6] arm: apple: rtkit: Add OSLog buffer support

Mark Kettenis kettenis at openbsd.org
Sun Apr 20 13:58:06 CEST 2025


From: Hector Martin <marcan at marcan.st>

This will work for u-boot itself, but needs a special workaround in the
MTP driver for Linux handoff to work.

Signed-off-by: Hector Martin <marcan at marcan.st>
Signed-off-by: Mark Kettenis <kettenis at openbsd.org>
---
 arch/arm/mach-apple/rtkit.c | 69 ++++++++++++++++++++++++++++++-------
 1 file changed, 56 insertions(+), 13 deletions(-)

diff --git a/arch/arm/mach-apple/rtkit.c b/arch/arm/mach-apple/rtkit.c
index 5e8e282ec0e..d294ee09350 100644
--- a/arch/arm/mach-apple/rtkit.c
+++ b/arch/arm/mach-apple/rtkit.c
@@ -19,6 +19,7 @@
 #define APPLE_RTKIT_EP_SYSLOG 2
 #define APPLE_RTKIT_EP_DEBUG 3
 #define APPLE_RTKIT_EP_IOREPORT 4
+#define APPLE_RTKIT_EP_OSLOG 8
 #define APPLE_RTKIT_EP_TRACEKIT 10
 
 /* Messages for management endpoint. */
@@ -47,6 +48,11 @@
 #define APPLE_RTKIT_MGMT_EPMAP_REPLY 8
 #define APPLE_RTKIT_MGMT_EPMAP_REPLY_MORE BIT(0)
 
+#define APPLE_RTKIT_OSLOG_TYPE GENMASK_ULL(63, 56)
+#define APPLE_RTKIT_OSLOG_BUFFER_REQUEST 1
+#define APPLE_RTKIT_OSLOG_SIZE GENMASK_ULL(55, 36)
+#define APPLE_RTKIT_OSLOG_IOVA GENMASK_ULL(35, 0)
+
 #define APPLE_RTKIT_MIN_SUPPORTED_VERSION 11
 #define APPLE_RTKIT_MAX_SUPPORTED_VERSION 12
 
@@ -66,6 +72,7 @@ struct apple_rtkit {
 	struct apple_rtkit_buffer syslog_buffer;
 	struct apple_rtkit_buffer crashlog_buffer;
 	struct apple_rtkit_buffer ioreport_buffer;
+	struct apple_rtkit_buffer oslog_buffer;
 
 	int iop_pwr;
 	int ap_pwr;
@@ -98,6 +105,8 @@ void apple_rtkit_free(struct apple_rtkit *rtk)
 			rtk->shmem_destroy(rtk->cookie, &rtk->crashlog_buffer);
 		if (rtk->ioreport_buffer.buffer)
 			rtk->shmem_destroy(rtk->cookie, &rtk->ioreport_buffer);
+		if (rtk->oslog_buffer.buffer)
+			rtk->shmem_destroy(rtk->cookie, &rtk->oslog_buffer);
 	} else {
 		if (rtk->syslog_buffer.buffer)
 			free(rtk->syslog_buffer.buffer);
@@ -105,6 +114,8 @@ void apple_rtkit_free(struct apple_rtkit *rtk)
 			free(rtk->crashlog_buffer.buffer);
 		if (rtk->ioreport_buffer.buffer)
 			free(rtk->ioreport_buffer.buffer);
+		if (rtk->oslog_buffer.buffer)
+			free(rtk->oslog_buffer.buffer);
 	}
 	free(rtk);
 }
@@ -112,16 +123,8 @@ void apple_rtkit_free(struct apple_rtkit *rtk)
 static int rtkit_handle_buf_req(struct apple_rtkit *rtk, int endpoint, struct apple_mbox_msg *msg)
 {
 	struct apple_rtkit_buffer *buf;
-	size_t num_4kpages;
 	int ret;
 
-	num_4kpages = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_SIZE, msg->msg0);
-
-	if (num_4kpages == 0) {
-		printf("%s: unexpected request for buffer without size\n", __func__);
-		return -1;
-	}
-
 	switch (endpoint) {
 	case APPLE_RTKIT_EP_CRASHLOG:
 		buf = &rtk->crashlog_buffer;
@@ -132,13 +135,31 @@ static int rtkit_handle_buf_req(struct apple_rtkit *rtk, int endpoint, struct ap
 	case APPLE_RTKIT_EP_IOREPORT:
 		buf = &rtk->ioreport_buffer;
 		break;
+	case APPLE_RTKIT_EP_OSLOG:
+		buf = &rtk->oslog_buffer;
+		break;
 	default:
 		printf("%s: unexpected endpoint %d\n", __func__, endpoint);
 		return -1;
 	}
 
+	switch (endpoint) {
+	case APPLE_RTKIT_EP_OSLOG:
+		buf->size = FIELD_GET(APPLE_RTKIT_OSLOG_SIZE, msg->msg0);
+		buf->dva = FIELD_GET(APPLE_RTKIT_OSLOG_IOVA, msg->msg0 << 12);
+		break;
+	default:
+		buf->size = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_SIZE, msg->msg0) << 12;
+		buf->dva = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_IOVA, msg->msg0);
+		break;
+	}
+
+	if (buf->size == 0) {
+		printf("%s: unexpected request for buffer without size\n", __func__);
+		return -1;
+	}
+
 	buf->dva = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_IOVA, msg->msg0);
-	buf->size = num_4kpages << 12;
 	buf->is_mapped = !!buf->dva;
 
 	if (rtk->shmem_setup) {
@@ -157,10 +178,18 @@ static int rtkit_handle_buf_req(struct apple_rtkit *rtk, int endpoint, struct ap
 	}
 
 	if (!buf->is_mapped) {
-		msg->msg0 = FIELD_PREP(APPLE_RTKIT_MGMT_TYPE, APPLE_RTKIT_BUFFER_REQUEST) |
-				FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_SIZE, num_4kpages) |
-				FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_IOVA, buf->dva);
-		msg->msg1 = endpoint;
+		/* oslog uses different fields */
+		if (endpoint == APPLE_RTKIT_EP_OSLOG) {
+			msg->msg0 = FIELD_PREP(APPLE_RTKIT_OSLOG_TYPE,
+					       APPLE_RTKIT_OSLOG_BUFFER_REQUEST);
+			msg->msg0 |= FIELD_PREP(APPLE_RTKIT_OSLOG_SIZE, buf->size);
+			msg->msg0 |= FIELD_PREP(APPLE_RTKIT_OSLOG_IOVA, buf->dva >> 12);
+		} else {
+			msg->msg0 = FIELD_PREP(APPLE_RTKIT_MGMT_TYPE,
+					   APPLE_RTKIT_BUFFER_REQUEST);
+			msg->msg0 |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_SIZE, buf->size >> 12);
+			msg->msg0 |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_IOVA, buf->dva);
+		}
 
 		return mbox_send(rtk->chan, msg);
 	}
@@ -193,6 +222,20 @@ int apple_rtkit_poll(struct apple_rtkit *rtk, ulong timeout)
 		}
 	}
 
+	if (endpoint == APPLE_RTKIT_EP_OSLOG) {
+		msgtype = FIELD_GET(APPLE_RTKIT_OSLOG_TYPE, msg.msg0);
+
+		if (msgtype == APPLE_RTKIT_OSLOG_BUFFER_REQUEST) {
+			ret = rtkit_handle_buf_req(rtk, endpoint, &msg);
+			if (ret < 0)
+				return ret;
+			return 0;
+		} else {
+			/* Ignore */
+			return 0;
+		}
+	}
+
 	if (endpoint == APPLE_RTKIT_EP_IOREPORT) {
 		// these two messages have to be ack-ed for proper startup
 		if (msgtype == 0xc || msgtype == 0x8) {
-- 
2.49.0



More information about the U-Boot mailing list