Blame SOURCES/0015-EP11-Default-unknown-CPs-to-ON.patch

447573
From 65cb0f2b0204183617b5d6e8e475f85faa8b789d Mon Sep 17 00:00:00 2001
447573
From: Ingo Franzki <ifranzki@linux.ibm.com>
447573
Date: Mon, 14 Feb 2022 16:35:34 +0100
447573
Subject: [PATCH 15/34] EP11: Default unknown CPs to ON
447573
447573
Newer EP11 cards know additional control points that older cards do not
447573
know. When building the combined minimum control point setting, treat
447573
unknown control points as ON, to not disable mechanisms just because an
447573
older card does not know a control point.
447573
447573
Signed-off-by: Ingo Franzki <ifranzki@linux.ibm.com>
447573
---
447573
 usr/lib/ep11_stdll/ep11_specific.c | 21 +++++++++++++++++----
447573
 1 file changed, 17 insertions(+), 4 deletions(-)
447573
447573
diff --git a/usr/lib/ep11_stdll/ep11_specific.c b/usr/lib/ep11_stdll/ep11_specific.c
447573
index 147ce7b2..e3451163 100644
447573
--- a/usr/lib/ep11_stdll/ep11_specific.c
447573
+++ b/usr/lib/ep11_stdll/ep11_specific.c
447573
@@ -10904,13 +10904,18 @@ static CK_RV control_point_handler(uint_32 adapter, uint_32 domain,
447573
 #ifdef DEBUG
447573
     TRACE_DEBUG("Control points from adapter %02X.%04X\n", adapter, domain);
447573
     TRACE_DEBUG_DUMP("    ", cp, cp_len);
447573
+    TRACE_DEBUG("Max control point index: %lu\n", max_cp_index);
447573
 #endif
447573
 
447573
     if (data->first) {
447573
         data->first_adapter = adapter;
447573
         data->first_domain = domain;
447573
-        memcpy(data->first_cp, cp, cp_len);
447573
-        memcpy(data->combined_cp, cp, cp_len);
447573
+        /* Apply CP bits 0 to max_cp_index-1 only */
447573
+        for (i = 0; i < max_cp_index; i++) {
447573
+            data->combined_cp[CP_BYTE_NO(i)] &=
447573
+                                    (cp[CP_BYTE_NO(i)] | ~CP_BIT_MASK(i));
447573
+        }
447573
+        memcpy(data->first_cp, data->combined_cp, sizeof(data->first_cp));
447573
         data->max_cp_index = max_cp_index;
447573
         data->first = 0;
447573
     } else {
447573
@@ -10927,8 +10932,10 @@ static CK_RV control_point_handler(uint_32 adapter, uint_32 domain,
447573
                        data->first_domain);
447573
         }
447573
 
447573
-        for (i = 0; i < cp_len; i++) {
447573
-            data->combined_cp[i] &= cp[i];
447573
+        for (i = 0; i < max_cp_index; i++) {
447573
+            /* Apply CP bits 0 to max_cp_index-1 only */
447573
+            data->combined_cp[CP_BYTE_NO(i)] &=
447573
+                                    (cp[CP_BYTE_NO(i)] | ~CP_BIT_MASK(i));
447573
         }
447573
 
447573
         if (max_cp_index != data->max_cp_index) {
447573
@@ -10973,6 +10980,11 @@ static CK_RV get_control_points(STDLL_TokData_t * tokdata,
447573
     ep11_private_data_t *ep11_data = tokdata->private_data;
447573
 
447573
     memset(&data, 0, sizeof(data));
447573
+    /*
447573
+     * Turn all CPs ON by default, so that newer control points that are unknown
447573
+     * to older cards default to ON. CPs being OFF disable functionality.
447573
+     */
447573
+    memset(data.combined_cp, 0xff, sizeof(data.combined_cp));
447573
     data.first = 1;
447573
     rc = handle_all_ep11_cards(&ep11_data->target_list, control_point_handler,
447573
                                &data);
447573
@@ -10987,6 +10999,7 @@ static CK_RV get_control_points(STDLL_TokData_t * tokdata,
447573
     TRACE_DEBUG("Combined control points from all cards (%lu CPs):\n",
447573
                 data.max_cp_index);
447573
     TRACE_DEBUG_DUMP("    ", cp, *cp_len);
447573
+    TRACE_DEBUG("Max control point index: %lu\n", data.max_cp_index);
447573
     print_control_points(cp, *cp_len, data.max_cp_index);
447573
 #endif
447573
 
447573
-- 
447573
2.16.2.windows.1
447573