Skip to content

Commit d9cee5d

Browse files
committed
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
Pull crypto fixes from Herbert Xu: "This fixes a build problem with bcm63xx and yet another fix to the memzero_explicit function to ensure that the memset is not elided" * git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: hwrng: bcm63xx - Fix driver compilation lib: make memzero_explicit more robust against dead store elimination
2 parents c02d7da + f440c4e commit d9cee5d

File tree

5 files changed

+32
-11
lines changed

5 files changed

+32
-11
lines changed

drivers/char/hw_random/bcm63xx-rng.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ static void bcm63xx_rng_cleanup(struct hwrng *rng)
5757
val &= ~RNG_EN;
5858
__raw_writel(val, priv->regs + RNG_CTRL);
5959

60-
clk_didsable_unprepare(prov->clk);
60+
clk_disable_unprepare(priv->clk);
6161
}
6262

6363
static int bcm63xx_rng_data_present(struct hwrng *rng, int wait)
@@ -97,14 +97,14 @@ static int bcm63xx_rng_probe(struct platform_device *pdev)
9797
priv->rng.name = pdev->name;
9898
priv->rng.init = bcm63xx_rng_init;
9999
priv->rng.cleanup = bcm63xx_rng_cleanup;
100-
prov->rng.data_present = bcm63xx_rng_data_present;
100+
priv->rng.data_present = bcm63xx_rng_data_present;
101101
priv->rng.data_read = bcm63xx_rng_data_read;
102102

103103
priv->clk = devm_clk_get(&pdev->dev, "ipsec");
104104
if (IS_ERR(priv->clk)) {
105-
error = PTR_ERR(priv->clk);
106-
dev_err(&pdev->dev, "no clock for device: %d\n", error);
107-
return error;
105+
ret = PTR_ERR(priv->clk);
106+
dev_err(&pdev->dev, "no clock for device: %d\n", ret);
107+
return ret;
108108
}
109109

110110
if (!devm_request_mem_region(&pdev->dev, r->start,
@@ -120,11 +120,11 @@ static int bcm63xx_rng_probe(struct platform_device *pdev)
120120
return -ENOMEM;
121121
}
122122

123-
error = devm_hwrng_register(&pdev->dev, &priv->rng);
124-
if (error) {
123+
ret = devm_hwrng_register(&pdev->dev, &priv->rng);
124+
if (ret) {
125125
dev_err(&pdev->dev, "failed to register rng device: %d\n",
126-
error);
127-
return error;
126+
ret);
127+
return ret;
128128
}
129129

130130
dev_info(&pdev->dev, "registered RNG driver\n");

include/linux/compiler-gcc.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,24 @@
99
+ __GNUC_MINOR__ * 100 \
1010
+ __GNUC_PATCHLEVEL__)
1111

12-
1312
/* Optimization barrier */
13+
1414
/* The "volatile" is due to gcc bugs */
1515
#define barrier() __asm__ __volatile__("": : :"memory")
16+
/*
17+
* This version is i.e. to prevent dead stores elimination on @ptr
18+
* where gcc and llvm may behave differently when otherwise using
19+
* normal barrier(): while gcc behavior gets along with a normal
20+
* barrier(), llvm needs an explicit input variable to be assumed
21+
* clobbered. The issue is as follows: while the inline asm might
22+
* access any memory it wants, the compiler could have fit all of
23+
* @ptr into memory registers instead, and since @ptr never escaped
24+
* from that, it proofed that the inline asm wasn't touching any of
25+
* it. This version works well with both compilers, i.e. we're telling
26+
* the compiler that the inline asm absolutely may see the contents
27+
* of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495
28+
*/
29+
#define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory")
1630

1731
/*
1832
* This macro obfuscates arithmetic on a variable address so that gcc

include/linux/compiler-intel.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,12 @@
1313
/* Intel ECC compiler doesn't support gcc specific asm stmts.
1414
* It uses intrinsics to do the equivalent things.
1515
*/
16+
#undef barrier_data
1617
#undef RELOC_HIDE
1718
#undef OPTIMIZER_HIDE_VAR
1819

20+
#define barrier_data(ptr) barrier()
21+
1922
#define RELOC_HIDE(ptr, off) \
2023
({ unsigned long __ptr; \
2124
__ptr = (unsigned long) (ptr); \

include/linux/compiler.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,10 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
169169
# define barrier() __memory_barrier()
170170
#endif
171171

172+
#ifndef barrier_data
173+
# define barrier_data(ptr) barrier()
174+
#endif
175+
172176
/* Unreachable code */
173177
#ifndef unreachable
174178
# define unreachable() do { } while (1)

lib/string.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,7 @@ EXPORT_SYMBOL(memset);
607607
void memzero_explicit(void *s, size_t count)
608608
{
609609
memset(s, 0, count);
610-
barrier();
610+
barrier_data(s);
611611
}
612612
EXPORT_SYMBOL(memzero_explicit);
613613

0 commit comments

Comments
 (0)