habanalabs: add security violations dump to debugfs
authorOfir Bitton <obitton@habana.ai>
Thu, 7 Jan 2021 10:14:17 +0000 (12:14 +0200)
committerOded Gabbay <ogabbay@kernel.org>
Wed, 27 Jan 2021 19:03:50 +0000 (21:03 +0200)
In order to improve driver security debuggability, we add
security violations dump to debugfs.

Signed-off-by: Ofir Bitton <obitton@habana.ai>
Reviewed-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
Documentation/ABI/testing/debugfs-driver-habanalabs
drivers/misc/habanalabs/common/debugfs.c
drivers/misc/habanalabs/common/habanalabs.h
drivers/misc/habanalabs/gaudi/gaudi.c
drivers/misc/habanalabs/gaudi/gaudiP.h
drivers/misc/habanalabs/gaudi/gaudi_security.c
drivers/misc/habanalabs/goya/goya.c
drivers/misc/habanalabs/goya/goyaP.h
drivers/misc/habanalabs/goya/goya_security.c

index c5d678d3914472514eca90fa67f894845a9d374e..3979bfdaa0801f6c19a21470b721330ab1f3d3f7 100644 (file)
@@ -182,3 +182,11 @@ KernelVersion:  5.6
 Contact:        oded.gabbay@gmail.com
 Description:    Sets the stop-on_error option for the device engines. Value of
                 "0" is for disable, otherwise enable.
+
+What:           /sys/kernel/debug/habanalabs/hl<n>/dump_security_violations
+Date:           Jan 2021
+KernelVersion:  5.12
+Contact:        oded.gabbay@gmail.com
+Description:    Dumps all security violations to dmesg. This will also ack
+                all security violations meanings those violations will not be
+                dumped next time user calls this API
index 50ca8eea6648354196ad421932d23d1b71ba2554..323d0381a60ad225846357624abc25b581366cf8 100644 (file)
@@ -867,6 +867,17 @@ static ssize_t hl_stop_on_err_write(struct file *f, const char __user *buf,
        return count;
 }
 
+static ssize_t hl_security_violations_read(struct file *f, char __user *buf,
+                                       size_t count, loff_t *ppos)
+{
+       struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
+       struct hl_device *hdev = entry->hdev;
+
+       hdev->asic_funcs->ack_protection_bits_errors(hdev);
+
+       return 0;
+}
+
 static const struct file_operations hl_data32b_fops = {
        .owner = THIS_MODULE,
        .read = hl_data_read32,
@@ -924,6 +935,11 @@ static const struct file_operations hl_stop_on_err_fops = {
        .write = hl_stop_on_err_write
 };
 
+static const struct file_operations hl_security_violations_fops = {
+       .owner = THIS_MODULE,
+       .read = hl_security_violations_read
+};
+
 static const struct hl_info_list hl_debugfs_list[] = {
        {"command_buffers", command_buffers_show, NULL},
        {"command_submission", command_submission_show, NULL},
@@ -1073,6 +1089,12 @@ void hl_debugfs_add_device(struct hl_device *hdev)
                                dev_entry,
                                &hl_stop_on_err_fops);
 
+       debugfs_create_file("dump_security_violations",
+                               0644,
+                               dev_entry->root,
+                               dev_entry,
+                               &hl_security_violations_fops);
+
        for (i = 0, entry = dev_entry->entry_arr ; i < count ; i++, entry++) {
 
                ent = debugfs_create_file(hl_debugfs_list[i].name,
index 8e0553bf3e0ef2a88d1adab08bd1c64188637afd..3923b03e99aa76e7b0dbb905dd301236d5c3e42b 100644 (file)
@@ -850,6 +850,7 @@ enum div_select_defs {
  * @collective_wait_create_jobs: allocate collective wait cs jobs
  * @scramble_vaddr: Routine to scramble the virtual address prior of mapping it
  *                  in the MMU.
+ * @ack_protection_bits_errors: ack and dump all security violations
  */
 struct hl_asic_funcs {
        int (*early_init)(struct hl_device *hdev);
@@ -960,6 +961,7 @@ struct hl_asic_funcs {
                        struct hl_ctx *ctx, struct hl_cs *cs, u32 wait_queue_id,
                        u32 collective_engine_id);
        u64 (*scramble_vaddr)(struct hl_device *hdev, u64 virt_addr);
+       void (*ack_protection_bits_errors)(struct hl_device *hdev);
 };
 
 
index d9f1b646aac95c500906053dd1084a55df3d4b8b..2b01c081404adc6ca9ab4300bff864d1833572f7 100644 (file)
@@ -8546,7 +8546,8 @@ static const struct hl_asic_funcs gaudi_funcs = {
        .get_device_time = gaudi_get_device_time,
        .collective_wait_init_cs = gaudi_collective_wait_init_cs,
        .collective_wait_create_jobs = gaudi_collective_wait_create_jobs,
-       .scramble_vaddr = hl_mmu_scramble_vaddr
+       .scramble_vaddr = hl_mmu_scramble_vaddr,
+       .ack_protection_bits_errors = gaudi_ack_protection_bits_errors
 };
 
 /**
index 78830443341d839698b5f670ede7f3e98172ab3f..50bb4ad570fdad90e79ab400ca0a84f06c14d49f 100644 (file)
@@ -335,6 +335,7 @@ struct gaudi_device {
 };
 
 void gaudi_init_security(struct hl_device *hdev);
+void gaudi_ack_protection_bits_errors(struct hl_device *hdev);
 void gaudi_add_device_attr(struct hl_device *hdev,
                        struct attribute_group *dev_attr_grp);
 void gaudi_set_pll_profile(struct hl_device *hdev, enum hl_pll_frequency freq);
index e10181692d0bbab8896a9e52061f90f07e80c35e..7085f45814ae4d9564b81e206b9dc5e09f7c09c2 100644 (file)
@@ -13052,3 +13052,8 @@ void gaudi_init_security(struct hl_device *hdev)
 
        gaudi_init_protection_bits(hdev);
 }
+
+void gaudi_ack_protection_bits_errors(struct hl_device *hdev)
+{
+
+}
index cf0496b04044a1cf07ba1434a487053890dffd89..50dcefc02cdd97b0e292f1bd3c17ab11f170676b 100644 (file)
@@ -5457,7 +5457,8 @@ static const struct hl_asic_funcs goya_funcs = {
        .get_device_time = goya_get_device_time,
        .collective_wait_init_cs = goya_collective_wait_init_cs,
        .collective_wait_create_jobs = goya_collective_wait_create_jobs,
-       .scramble_vaddr = hl_mmu_scramble_vaddr
+       .scramble_vaddr = hl_mmu_scramble_vaddr,
+       .ack_protection_bits_errors = goya_ack_protection_bits_errors
 };
 
 /*
index 8b3408211af62c88d7423ab23ba1fa42cd4b658a..23fe099ed218c73439b9ff665aa8e96e1a00dd5a 100644 (file)
@@ -173,6 +173,7 @@ void goya_init_mme_qmans(struct hl_device *hdev);
 void goya_init_tpc_qmans(struct hl_device *hdev);
 int goya_init_cpu_queues(struct hl_device *hdev);
 void goya_init_security(struct hl_device *hdev);
+void goya_ack_protection_bits_errors(struct hl_device *hdev);
 int goya_late_init(struct hl_device *hdev);
 void goya_late_fini(struct hl_device *hdev);
 
index 14701836f92b9dfd0c48f7e209902dfbc538386d..14c3bae3ccdc6d53eed6d91eb34fa1d1876595aa 100644 (file)
@@ -3120,3 +3120,8 @@ void goya_init_security(struct hl_device *hdev)
 
        goya_init_protection_bits(hdev);
 }
+
+void goya_ack_protection_bits_errors(struct hl_device *hdev)
+{
+
+}