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

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