RSE: Drop the comms link once session is closed
Drop the communication link before resuming system execution. As per the
ADAC spec, above step is performed after response is sent to the client.
Also only perform this step when the close session command response is
successfully sent to the client.
Signed-off-by: Maulik Patel <maulik.patel@arm.com>
Change-Id: I0b16e8a59ba735ffff350a77b4c42259c24406f7
diff --git a/psa-adac/sda/src/psa_adac_sda.c b/psa-adac/sda/src/psa_adac_sda.c
index b614227..97da2eb 100644
--- a/psa-adac/sda/src/psa_adac_sda.c
+++ b/psa-adac/sda/src/psa_adac_sda.c
@@ -394,9 +394,9 @@
case ADAC_CLOSE_SESSION_CMD:
PSA_ADAC_LOG_DEBUG("auth", "Terminate session \r\n");
(void) authenticator_request_packet_release(auth_ctx, request);
- psa_adac_close_session();
response = authenticator_response_packet_build(auth_ctx, ADAC_SUCCESS, NULL, 0);
ret = authenticator_send_response(auth_ctx, response);
+ psa_adac_close_session();
done = 1;
break;
diff --git a/target/trusted-firmware-m/platform/arm/corstone1000/corstone1000.c b/target/trusted-firmware-m/platform/arm/corstone1000/corstone1000.c
index 80cccdd..60bc333 100644
--- a/target/trusted-firmware-m/platform/arm/corstone1000/corstone1000.c
+++ b/target/trusted-firmware-m/platform/arm/corstone1000/corstone1000.c
@@ -32,7 +32,7 @@
void psa_adac_close_session(void)
{
- /* TODO: Code me */
+ (void)msg_interface_close(NULL);
}
void psa_adac_resume(void)
diff --git a/target/trusted-firmware-m/platform/arm/corstone1000/include/platform/msg_interface.h b/target/trusted-firmware-m/platform/arm/corstone1000/include/platform/msg_interface.h
index 4713985..19aea15 100644
--- a/target/trusted-firmware-m/platform/arm/corstone1000/include/platform/msg_interface.h
+++ b/target/trusted-firmware-m/platform/arm/corstone1000/include/platform/msg_interface.h
@@ -1,10 +1,12 @@
/*
- * Copyright (c) 2020 Arm Limited. All rights reserved.
+ * SPDX-FileCopyrightText: Copyright The TrustedFirmware-M Contributors
+ *
* SPDX-License-Identifier: BSD-3-Clause
+ *
*/
-#ifndef PSA_ADAC_MSG_INTERFACE_H
-#define PSA_ADAC_MSG_INTERFACE_H
+#ifndef __MSG_INTERFACE_H__
+#define __MSG_INTERFACE_H__
#include <psa_adac.h>
#include <platform/platform.h>
@@ -14,6 +16,7 @@
int msg_interface_init(void *ctx, uint8_t buffer[], size_t size);
int msg_interface_free(void *ctx);
+int msg_interface_close(void *ctx);
request_packet_t *request_packet_lock(size_t *max_data_size);
response_packet_t *response_packet_lock(size_t *max_data_size);
@@ -32,6 +35,7 @@
typedef int (*msg_interface_init_t)(void *ctx, uint8_t buffer[], size_t size);
typedef int (*msg_interface_free_t)(void *ctx);
+typedef int (*msg_interface_close_t)(void *ctx);
/* Target */
typedef request_packet_t *(*request_packet_receive_t)(void *ctx);
@@ -43,6 +47,7 @@
typedef struct {
msg_interface_init_t msg_interface_init;
msg_interface_free_t msg_interface_free;
+ msg_interface_close_t msg_interface_close;
request_packet_receive_t request_packet_receive;
request_packet_release_t request_packet_release;
response_packet_lock_t response_packet_lock;
@@ -52,4 +57,4 @@
} target_msg_interface_t;
#endif
-#endif //PSA_ADAC_MSG_INTERFACE_H
+#endif /* __MSG_INTERFACE_H__ */
diff --git a/target/trusted-firmware-m/platform/arm/musca_b1/include/platform/msg_interface.h b/target/trusted-firmware-m/platform/arm/musca_b1/include/platform/msg_interface.h
index 57a1f32..e1a3bc9 100644
--- a/target/trusted-firmware-m/platform/arm/musca_b1/include/platform/msg_interface.h
+++ b/target/trusted-firmware-m/platform/arm/musca_b1/include/platform/msg_interface.h
@@ -1,6 +1,8 @@
/*
- * Copyright (c) 2020-2023 Arm Limited. All rights reserved.
+ * SPDX-FileCopyrightText: Copyright The TrustedFirmware-M Contributors
+ *
* SPDX-License-Identifier: BSD-3-Clause
+ *
*/
#ifndef __MSG_INTERFACE_H__
@@ -19,6 +21,7 @@
int msg_interface_init(void *ctx, uint8_t buffer[], size_t size);
int msg_interface_free(void *ctx);
+int msg_interface_close(void *ctx);
request_packet_t *request_packet_lock(size_t *max_data_size);
response_packet_t *response_packet_lock(size_t *max_data_size);
@@ -37,6 +40,7 @@
typedef int (*msg_interface_init_t)(void *ctx, uint8_t buffer[], size_t size);
typedef int (*msg_interface_free_t)(void *ctx);
+typedef int (*msg_interface_close_t)(void *ctx);
/* Target */
typedef request_packet_t *(*request_packet_receive_t)(void *ctx);
@@ -48,6 +52,7 @@
typedef struct {
msg_interface_init_t msg_interface_init;
msg_interface_free_t msg_interface_free;
+ msg_interface_close_t msg_interface_close;
request_packet_receive_t request_packet_receive;
request_packet_release_t request_packet_release;
response_packet_lock_t response_packet_lock;
diff --git a/target/trusted-firmware-m/platform/arm/musca_b1/psa_adac_platform.c b/target/trusted-firmware-m/platform/arm/musca_b1/psa_adac_platform.c
index 3c44e16..c518301 100644
--- a/target/trusted-firmware-m/platform/arm/musca_b1/psa_adac_platform.c
+++ b/target/trusted-firmware-m/platform/arm/musca_b1/psa_adac_platform.c
@@ -48,7 +48,7 @@
void psa_adac_close_session(void)
{
- /* TODO: Code me */
+ (void)msg_interface_close(NULL);
}
void psa_adac_resume(void)
diff --git a/target/trusted-firmware-m/platform/arm/rse/common/include/platform/msg_interface.h b/target/trusted-firmware-m/platform/arm/rse/common/include/platform/msg_interface.h
index 53c16e4..e1a3bc9 100644
--- a/target/trusted-firmware-m/platform/arm/rse/common/include/platform/msg_interface.h
+++ b/target/trusted-firmware-m/platform/arm/rse/common/include/platform/msg_interface.h
@@ -1,6 +1,8 @@
/*
- * Copyright (c) 2022 Arm Limited. All rights reserved.
+ * SPDX-FileCopyrightText: Copyright The TrustedFirmware-M Contributors
+ *
* SPDX-License-Identifier: BSD-3-Clause
+ *
*/
#ifndef __MSG_INTERFACE_H__
@@ -19,6 +21,7 @@
int msg_interface_init(void *ctx, uint8_t buffer[], size_t size);
int msg_interface_free(void *ctx);
+int msg_interface_close(void *ctx);
request_packet_t *request_packet_lock(size_t *max_data_size);
response_packet_t *response_packet_lock(size_t *max_data_size);
@@ -37,6 +40,7 @@
typedef int (*msg_interface_init_t)(void *ctx, uint8_t buffer[], size_t size);
typedef int (*msg_interface_free_t)(void *ctx);
+typedef int (*msg_interface_close_t)(void *ctx);
/* Target */
typedef request_packet_t *(*request_packet_receive_t)(void *ctx);
@@ -48,6 +52,7 @@
typedef struct {
msg_interface_init_t msg_interface_init;
msg_interface_free_t msg_interface_free;
+ msg_interface_close_t msg_interface_close;
request_packet_receive_t request_packet_receive;
request_packet_release_t request_packet_release;
response_packet_lock_t response_packet_lock;
diff --git a/target/trusted-firmware-m/platform/arm/rse/common/psa_adac_platform.c b/target/trusted-firmware-m/platform/arm/rse/common/psa_adac_platform.c
index 38e34eb..f6d3c1d 100644
--- a/target/trusted-firmware-m/platform/arm/rse/common/psa_adac_platform.c
+++ b/target/trusted-firmware-m/platform/arm/rse/common/psa_adac_platform.c
@@ -60,7 +60,7 @@
void psa_adac_close_session(void)
{
- /* TODO: Code me */
+ (void)msg_interface_close(NULL);
}
void psa_adac_resume(void)
diff --git a/template_hal_files/trasport_layer.c b/template_hal_files/trasport_layer.c
index 76c1d2f..79e3a7f 100644
--- a/template_hal_files/trasport_layer.c
+++ b/template_hal_files/trasport_layer.c
@@ -1,6 +1,8 @@
/*
- * Copyright (c) 2020-2023 Arm Limited. All rights reserved.
+ * SPDX-FileCopyrightText: Copyright The TrustedFirmware-M Contributors
+ *
* SPDX-License-Identifier: BSD-3-Clause
+ *
*/
#include "psa_adac_debug.h"
@@ -27,6 +29,11 @@
/* Code me */
}
+int msg_interface_close(void *ctx)
+{
+ /* Code me */
+}
+
int request_packet_send(void)
{
/* Code me */
diff --git a/transport_layer/transports/memory_window.c b/transport_layer/transports/memory_window.c
index 6671bc5..0e42cea 100644
--- a/transport_layer/transports/memory_window.c
+++ b/transport_layer/transports/memory_window.c
@@ -1,6 +1,8 @@
/*
- * Copyright (c) 2020-2023 Arm Limited. All rights reserved.
+ * SPDX-FileCopyrightText: Copyright The TrustedFirmware-M Contributors
+ *
* SPDX-License-Identifier: BSD-3-Clause
+ *
*/
#include "psa_adac_config.h"
@@ -73,6 +75,10 @@
return psa_adac_static_buffer_msg_release();
}
+int msg_interface_close(void *ctx)
+{
+ /* TODO: Code me */
+}
int request_packet_send(request_packet_t *packet)
{
diff --git a/transport_layer/transports/sdc-600/int_com_port_driver.c b/transport_layer/transports/sdc-600/int_com_port_driver.c
index 3b7b679..5358151 100644
--- a/transport_layer/transports/sdc-600/int_com_port_driver.c
+++ b/transport_layer/transports/sdc-600/int_com_port_driver.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2019, Arm Limited. All rights reserved.
+ * SPDX-FileCopyrightText: Copyright The TrustedFirmware-M Contributors
*
* SPDX-License-Identifier: BSD-3-Clause
*
@@ -481,3 +481,27 @@
icpd_tx_rc_t IComPortTx(uint8_t *TxBuffer, size_t TxBufferLength, size_t *ActualLength) {
return IComPortTxInt(FLAG_START, TxBuffer, TxBufferLength, ActualLength);
}
+
+icpd_rc_t IComPortTerminate(void){
+ icpd_rc_t res = ICPD_SUCCESS;
+ uint8_t readByte;
+
+ /* Wait for link‐terminate from debugger (LPH2RL) */
+ SDC600_LOG_WARN("terminate", "%s: Blocked reading LPH2RL - Link terminate \r\n", __func__);
+ ICPD_ASSERT(IComPortReadByte(&readByte, BLOCKED, SKIP_ERROR_CHECK), ICPD_RX_SUCCESS, ICPD_FAIL);
+ ICPD_ASSERT(IComPortIsFlag(readByte, FLAG_LPH2RL), true, ICPD_DEBUGGER_NOT_CONNECTED);
+ SDC600_LOG_INFO("terminate", "%s: LPH2RL received\r\n", __func__);
+ /* Write LPH2RL flag to the Internal COM Port device TX */
+ ICPD_ASSERT(IComSendByte(FLAG_LPH2RL), ICPD_TX_SUCCESS, ICPD_FAIL);
+
+ /* Wait for power‐release from debugger (LPH1RL) */
+ SDC600_LOG_WARN("terminate", "%s: Blocked reading LPH1RL - Power release \r\n", __func__);
+ ICPD_ASSERT(IComPortReadByte(&readByte, BLOCKED, SKIP_ERROR_CHECK), ICPD_RX_SUCCESS, ICPD_FAIL);
+ ICPD_ASSERT(IComPortIsFlag(readByte, FLAG_LPH1RL), true, ICPD_DEBUGGER_NOT_CONNECTED);
+ SDC600_LOG_INFO("terminate", "%s: LPH1RL received\r\n", __func__);
+ /* Acknowledge power release by sending LPH1RL back */
+ ICPD_ASSERT(IComSendByte(FLAG_LPH1RL), ICPD_TX_SUCCESS, ICPD_FAIL);
+
+ bail:
+ return res;
+}
diff --git a/transport_layer/transports/sdc-600/int_com_port_driver.h b/transport_layer/transports/sdc-600/int_com_port_driver.h
index 6aba4da..0bdde23 100644
--- a/transport_layer/transports/sdc-600/int_com_port_driver.h
+++ b/transport_layer/transports/sdc-600/int_com_port_driver.h
@@ -1,12 +1,12 @@
/*
- * Copyright (c) 2016-2019, Arm Limited. All rights reserved.
+ * SPDX-FileCopyrightText: Copyright The TrustedFirmware-M Contributors
*
* SPDX-License-Identifier: BSD-3-Clause
*
*/
-#ifndef INT_COM_PORT_DRIVER_H_
-#define INT_COM_PORT_DRIVER_H_
+#ifndef __INT_COM_PORT_DRIVER_H__
+#define __INT_COM_PORT_DRIVER_H__
#include <stdint.h>
#include <stddef.h>
@@ -96,4 +96,17 @@
*/
icpd_tx_rc_t IComPortTx(uint8_t *TxBuffer, size_t TxBufferLength, size_t *ActualLength);
-#endif /* INT_COM_PORT_DRIVER_H_ */
+/**
+ * This function is called by the Secure Debug Handler to terminate the
+ * Internal COM port driver and tear down the COM link. It performs two
+ * handshake steps with the debugger:
+ * 1. Waits for the link‐terminate flag (LPH2RL), acknowledges it to
+ * drop the external COM link.
+ * 2. Waits for the power‐release flag (LPH1RL), acknowledges it to
+ * power down the internal COM port.
+ *
+ * @return ICPD_SUCCESS on clean termination, or an error code if any step fails
+ */
+icpd_rc_t IComPortTerminate(void);
+
+#endif /* __INT_COM_PORT_DRIVER_H__ */
diff --git a/transport_layer/transports/sdc-600/sdc-600.c b/transport_layer/transports/sdc-600/sdc-600.c
index 5d14dcf..531be7d 100644
--- a/transport_layer/transports/sdc-600/sdc-600.c
+++ b/transport_layer/transports/sdc-600/sdc-600.c
@@ -1,6 +1,8 @@
/*
- * Copyright (c) 2020-2023 Arm Limited. All rights reserved.
+ * SPDX-FileCopyrightText: Copyright The TrustedFirmware-M Contributors
+ *
* SPDX-License-Identifier: BSD-3-Clause
+ *
*/
#include <stdio.h>
@@ -61,6 +63,20 @@
return psa_adac_static_buffer_msg_release();
}
+int msg_interface_close(void *ctx)
+{
+ icpd_rc_t status;
+
+ status = IComPortTerminate();
+ if (status != ICPD_SUCCESS) {
+ PSA_ADAC_LOG_ERR("sdc-600", "IComPortTerminate failed with status %d\r\n", status);
+ return -1;
+ }
+
+ PSA_ADAC_LOG_INFO("sdc-600", "IComPortTerminate: Success\r\n");
+ return 0;
+}
+
int request_packet_send(void)
{
return -1;