Hi all,
The BeagleBone Green Wireless uses an ARM Cortex-A8. So  it has the 
variance 1 and 2 
https://developer.arm.com/support/security-update

There are three main variants of the exploits, as detailed by Google in 
their blogpost, that explain in detail the mechanisms:

Variant 1: bounds check bypass (CVE-2017-5753)
Variant 2: branch target injection (CVE-2017-5715)
Variant 3: rogue data cache load (CVE-2017-5754)
In addition, Arm has included information on a related variant to 3, noted 
as 3a, in the table below.

Follow the steps below to determine if there is any vulnerability for your 
devices and, if vulnerable, then the mitigation mechanisms.

Step 1

Check the table below to determine if you have an affected processor.

Only affected cores are listed, all other Arm cores are NOT affected.
No indicates not affected by the particular variant.
Yes indicates affected by the particular variant but has a mitigation 
(unless otherwise stated).
ProcessorVariant 1variant 2variant 3variant 3a
Cortex-A8 Yes (under review) Yes No No



They update with more information recently with this link
For Cortex-A8, Cortex-A9, and Cortex-A15, please apply the patches 
available at 
https://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git/log/?h=kpti

The problem is that this patch can apply only for the kernel 4.9 and after 
kernels, however, the BBGW only can use the kernel 4.4, because if you use 
a different kernel you are going to have this error message

[  310.837199] wlcore: ERROR error getting static data
[  310.888675] wlcore: ERROR firmware boot failed despite 3 retries
[  317.196091] wlcore: ERROR Your WiFi FW version (8.9.0.0.17) is invalid.
[  317.196091] Please use at least FW 8.9.*.*.58.
[  317.196091] You can get the latest firmwares at:
[  317.196091] git://git.ti.com/wilink8-wlan/wl18xx_fw.git


I tried to solve it with this patch for the kernel:



diff --git a/arch/arm/include/asm/cp15.h b/arch/arm/include/asm/cp15.h
index c3f1152..8142add 100644
--- a/arch/arm/include/asm/cp15.h
+++ b/arch/arm/include/asm/cp15.h
@@ -49,6 +49,23 @@
 
 #ifdef CONFIG_CPU_CP15
 
+#define __ACCESS_CP15(CRn, Op1, CRm, Op2) \
+ "mrc", "mcr", __stringify(p15, Op1, %0, CRn, CRm, Op2), u32
+#define __ACCESS_CP15_64(Op1, CRm) \
+ "mrrc", "mcrr", __stringify(p15, Op1, %Q0, %R0, CRm), u64
+
+#define __read_sysreg(r, w, c, t) ({ \
+ t __val; \
+ asm volatile(r " " c : "=r" (__val)); \
+ __val; \
+})
+#define read_sysreg(...) __read_sysreg(__VA_ARGS__)
+
+#define __write_sysreg(v, r, w, c, t) asm volatile(w " " c : : "r" ((t)(v
)))
+#define write_sysreg(v, ...) __write_sysreg(v, __VA_ARGS__)
+
+#define BPIALL              __ACCESS_CP15(c7, 0, c5, 6)
+
 extern unsigned long cr_alignment; /* defined in entry-armv.S */
 
 static inline unsigned long get_cr(void)
diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c
index a11dc6d..4a98ca7 100644
--- a/arch/arm/mm/fault.c
+++ b/arch/arm/mm/fault.c
@@ -20,6 +20,7 @@
 #include <linux/highmem.h>
 #include <linux/perf_event.h>
 
+#include <asm/cp15.h>
 #include <asm/exception.h>
 #include <asm/pgtable.h>
 #include <asm/system_misc.h>
@@ -180,6 +181,7 @@ __do_user_fault(struct task_struct *tsk, unsigned long 
addr,
  si.si_errno = 0;
  si.si_code = code;
  si.si_addr = (void __user *)addr;
+
  force_sig_info(sig, &si, tsk);
 }
 
@@ -395,12 +397,35 @@ no_context:
  __do_kernel_fault(mm, addr, fsr, regs);
  return 0;
 }
+
+static int
+do_pabt_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *
regs)
+{
+   if (addr > TASK_SIZE) {
+       switch(read_cpuid_part()) {
+       case ARM_CPU_PART_CORTEX_A8:
+       case ARM_CPU_PART_CORTEX_A9:
+       case ARM_CPU_PART_CORTEX_A12:
+       case ARM_CPU_PART_CORTEX_A17:
+           write_sysreg(0, BPIALL);
+           break;
+       }
+   }
+
+   return do_page_fault(addr, fsr, regs);
+}
 #else /* CONFIG_MMU */
 static int
 do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
 {
  return 0;
 }
+
+static int
+do_pabt_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *
regs)
+{
+   return 0;
+}
 #endif /* CONFIG_MMU */
 
 /*
diff --git a/arch/arm/mm/fsr-2level.c b/arch/arm/mm/fsr-2level.c
index 18ca74c..4cede9b 100644
--- a/arch/arm/mm/fsr-2level.c
+++ b/arch/arm/mm/fsr-2level.c
@@ -50,7 +50,7 @@ static struct fsr_info ifsr_info[] = {
  { do_bad, SIGBUS,  0, "unknown 4"   },
  { do_translation_fault, SIGSEGV, SEGV_MAPERR, "section translation fault" 
  },
  { do_bad, SIGSEGV, SEGV_ACCERR, "page access flag fault"   },
- { do_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault"   },
+ { do_pabt_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault"   },
  { do_bad, SIGBUS, 0, "external abort on non-linefetch"  },
  { do_bad, SIGSEGV, SEGV_ACCERR, "section domain fault"   },
  { do_bad, SIGBUS,  0, "unknown 10"   },
@@ -58,7 +58,7 @@ static struct fsr_info ifsr_info[] = {
  { do_bad, SIGBUS, 0, "external abort on translation"   },
  { do_sect_fault, SIGSEGV, SEGV_ACCERR, "section permission fault"   },
  { do_bad, SIGBUS, 0, "external abort on translation"   },
- { do_page_fault, SIGSEGV, SEGV_ACCERR, "page permission fault"   },
+ { do_pabt_page_fault, SIGSEGV, SEGV_ACCERR, "page permission fault"   },
  { do_bad, SIGBUS,  0, "unknown 16"   },
  { do_bad, SIGBUS,  0, "unknown 17"   },
  { do_bad, SIGBUS,  0, "unknown 18"   },
diff --git a/arch/arm/mm/fsr-3level.c b/arch/arm/mm/fsr-3level.c
index ab4409a..f3931ed 100644
--- a/arch/arm/mm/fsr-3level.c
+++ b/arch/arm/mm/fsr-3level.c
@@ -64,5 +64,69 @@ static struct fsr_info fsr_info[] = {
  { do_bad, SIGBUS,  0, "unknown 62" },
  { do_bad, SIGBUS,  0, "unknown 63" },
 };
-
-#define ifsr_info fsr_info
+static struct fsr_info ifsr_info[] = {
+   { do_bad,       SIGBUS,  0,     "unknown 0"         },
+   { do_bad,       SIGBUS,  0,     "unknown 1"         },
+   { do_bad,       SIGBUS,  0,     "unknown 2"         },
+   { do_bad,       SIGBUS,  0,     "unknown 3"         },
+   { do_bad,       SIGBUS,  0,     "reserved translation fault"    },
+   { do_translation_fault, SIGSEGV, SEGV_MAPERR,   "level 1 translation 
fault" },
+   { do_translation_fault, SIGSEGV, SEGV_MAPERR,   "level 2 translation 
fault" },
+   { do_pabt_page_fault,   SIGSEGV, SEGV_MAPERR,   "level 3 translation 
fault" },
+   { do_bad,       SIGBUS,  0,     "reserved access flag fault"    },
+   { do_bad,       SIGSEGV, SEGV_ACCERR,   "level 1 access flag fault" },
+   { do_pabt_page_fault,   SIGSEGV, SEGV_ACCERR,   "level 2 access flag 
fault" },
+   { do_pabt_page_fault,   SIGSEGV, SEGV_ACCERR,   "level 3 access flag 
fault" },
+   { do_bad,       SIGBUS,  0,     "reserved permission fault" },
+   { do_bad,       SIGSEGV, SEGV_ACCERR,   "level 1 permission fault"  },
+   { do_pabt_page_fault,   SIGSEGV, SEGV_ACCERR,   "level 2 permission 
fault"  },
+   { do_pabt_page_fault,   SIGSEGV, SEGV_ACCERR,   "level 3 permission 
fault"  },
+   { do_bad,       SIGBUS,  0,     "synchronous external abort"    },
+   { do_bad,       SIGBUS,  0,     "asynchronous external abort"   },
+   { do_bad,       SIGBUS,  0,     "unknown 18"            },
+   { do_bad,       SIGBUS,  0,     "unknown 19"            },
+   { do_bad,       SIGBUS,  0,     "synchronous abort (translation table 
walk)" },
+   { do_bad,       SIGBUS,  0,     "synchronous abort (translation table 
walk)" },
+   { do_bad,       SIGBUS,  0,     "synchronous abort (translation table 
walk)" },
+   { do_bad,       SIGBUS,  0,     "synchronous abort (translation table 
walk)" },
+   { do_bad,       SIGBUS,  0,     "synchronous parity error"  },
+   { do_bad,       SIGBUS,  0,     "asynchronous parity error" },
+   { do_bad,       SIGBUS,  0,     "unknown 26"            },
+   { do_bad,       SIGBUS,  0,     "unknown 27"            },
+   { do_bad,       SIGBUS,  0,     "synchronous parity error (translation 
table walk" },
+   { do_bad,       SIGBUS,  0,     "synchronous parity error (translation 
table walk" },
+   { do_bad,       SIGBUS,  0,     "synchronous parity error (translation 
table walk" },
+   { do_bad,       SIGBUS,  0,     "synchronous parity error (translation 
table walk" },
+   { do_bad,       SIGBUS,  0,     "unknown 32"            },
+   { do_bad,       SIGBUS,  BUS_ADRALN,    "alignment fault"       },
+   { do_bad,       SIGBUS,  0,     "debug event"           },
+   { do_bad,       SIGBUS,  0,     "unknown 35"            },
+   { do_bad,       SIGBUS,  0,     "unknown 36"            },
+   { do_bad,       SIGBUS,  0,     "unknown 37"            },
+   { do_bad,       SIGBUS,  0,     "unknown 38"            },
+   { do_bad,       SIGBUS,  0,     "unknown 39"            },
+   { do_bad,       SIGBUS,  0,     "unknown 40"            },
+   { do_bad,       SIGBUS,  0,     "unknown 41"            },
+   { do_bad,       SIGBUS,  0,     "unknown 42"            },
+   { do_bad,       SIGBUS,  0,     "unknown 43"            },
+   { do_bad,       SIGBUS,  0,     "unknown 44"            },
+   { do_bad,       SIGBUS,  0,     "unknown 45"            },
+   { do_bad,       SIGBUS,  0,     "unknown 46"            },
+   { do_bad,       SIGBUS,  0,     "unknown 47"            },
+   { do_bad,       SIGBUS,  0,     "unknown 48"            },
+   { do_bad,       SIGBUS,  0,     "unknown 49"            },
+   { do_bad,       SIGBUS,  0,     "unknown 50"            },
+   { do_bad,       SIGBUS,  0,     "unknown 51"            },
+   { do_bad,       SIGBUS,  0,     "implementation fault (lockdown abort)" 
},
+   { do_bad,       SIGBUS,  0,     "unknown 53"            },
+   { do_bad,       SIGBUS,  0,     "unknown 54"            },
+   { do_bad,       SIGBUS,  0,     "unknown 55"            },
+   { do_bad,       SIGBUS,  0,     "unknown 56"            },
+   { do_bad,       SIGBUS,  0,     "unknown 57"            },
+   { do_bad,       SIGBUS,  0,     "implementation fault (coprocessor 
abort)" },
+   { do_bad,       SIGBUS,  0,     "unknown 59"            },
+   { do_bad,       SIGBUS,  0,     "unknown 60"            },
+   { do_bad,       SIGBUS,  0,     "unknown 61"            },
+   { do_bad,       SIGBUS,  0,     "unknown 62"            },
+   { do_bad,       SIGBUS,  0,     "unknown 63"            },
+};


Can you check that this solution is fine?

-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to beagleboard+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/beagleboard/91bc09bf-a0fd-4621-bede-182218d08d65%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to