aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Neuling <mikey@neuling.org>2017-03-23 17:15:07 +1100
committerStewart Smith <stewart@linux.vnet.ibm.com>2017-03-24 12:50:40 +1100
commitded2533b5b31252639ac354521127a239df39e30 (patch)
tree498b87f64b1ff81ea807dbb960961b9cd67092aa
parentb8ad0349ae8a119db471821c9a0a6a0e2ae2ffeb (diff)
downloadskiboot-ded2533b5b31252639ac354521127a239df39e30.zip
skiboot-ded2533b5b31252639ac354521127a239df39e30.tar.gz
skiboot-ded2533b5b31252639ac354521127a239df39e30.tar.bz2
xscom: Harden indirect writes
Indirect scoms can only set certain bits of data. Ensure only these are set when trying to write. Signed-off-by: Michael Neuling <mikey@neuling.org> Reviewed-by: Cédric Le Goater <clg@kaod.org> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
-rw-r--r--hw/xscom.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/hw/xscom.c b/hw/xscom.c
index 6fde427..b0bc260 100644
--- a/hw/xscom.c
+++ b/hw/xscom.c
@@ -369,6 +369,10 @@ static int xscom_indirect_write(uint32_t gcid, uint64_t pcb_addr, uint64_t val)
if (proc_gen < proc_gen_p8)
return OPAL_UNSUPPORTED;
+ /* Only 16 bit data with indirect */
+ if (val & ~(XSCOM_ADDR_IND_DATA))
+ return OPAL_PARAMETER;
+
/* Write indirect address & data */
addr = pcb_addr & 0x7fffffff;
data = pcb_addr & XSCOM_ADDR_IND_ADDR;