diff --git a/device/linux-samsung-n5110/0001-BACKPORT-random-introduce-getrandom-2-system-call.patch b/device/linux-samsung-n5110/0001-BACKPORT-random-introduce-getrandom-2-system-call.patch
new file mode 100644
index 0000000000000000000000000000000000000000..6f67dee680fe895696753fc4e8bbb55f940306d3
--- /dev/null
+++ b/device/linux-samsung-n5110/0001-BACKPORT-random-introduce-getrandom-2-system-call.patch
@@ -0,0 +1,335 @@
+From 1c1f660bcb0682a80324e5204a08e59ac93b7a88 Mon Sep 17 00:00:00 2001
+From: Theodore Ts'o <tytso@mit.edu>
+Date: Thu, 17 Jul 2014 04:13:05 -0400
+Subject: [PATCH 1/3] BACKPORT: random: introduce getrandom(2) system call
+
+Almost clean cherry pick of c6e9d6f38894798696f23c8084ca7edbf16ee895,
+includes change made by merge 0891ad829d2a0501053703df66029e843e3b8365.
+
+The getrandom(2) system call was requested by the LibreSSL Portable
+developers.  It is analoguous to the getentropy(2) system call in
+OpenBSD.
+
+The rationale of this system call is to provide resiliance against
+file descriptor exhaustion attacks, where the attacker consumes all
+available file descriptors, forcing the use of the fallback code where
+/dev/[u]random is not available.  Since the fallback code is often not
+well-tested, it is better to eliminate this potential failure mode
+entirely.
+
+The other feature provided by this new system call is the ability to
+request randomness from the /dev/urandom entropy pool, but to block
+until at least 128 bits of entropy has been accumulated in the
+/dev/urandom entropy pool.  Historically, the emphasis in the
+/dev/urandom development has been to ensure that urandom pool is
+initialized as quickly as possible after system boot, and preferably
+before the init scripts start execution.
+
+This is because changing /dev/urandom reads to block represents an
+interface change that could potentially break userspace which is not
+acceptable.  In practice, on most x86 desktop and server systems, in
+general the entropy pool can be initialized before it is needed (and
+in modern kernels, we will printk a warning message if not).  However,
+on an embedded system, this may not be the case.  And so with this new
+interface, we can provide the functionality of blocking until the
+urandom pool has been initialized.  Any userspace program which uses
+this new functionality must take care to assure that if it is used
+during the boot process, that it will not cause the init scripts or
+other portions of the system startup to hang indefinitely.
+
+SYNOPSIS
+	#include <linux/random.h>
+
+	int getrandom(void *buf, size_t buflen, unsigned int flags);
+
+DESCRIPTION
+	The system call getrandom() fills the buffer pointed to by buf
+	with up to buflen random bytes which can be used to seed user
+	space random number generators (i.e., DRBG's) or for other
+	cryptographic uses.  It should not be used for Monte Carlo
+	simulations or other programs/algorithms which are doing
+	probabilistic sampling.
+
+	If the GRND_RANDOM flags bit is set, then draw from the
+	/dev/random pool instead of the /dev/urandom pool.  The
+	/dev/random pool is limited based on the entropy that can be
+	obtained from environmental noise, so if there is insufficient
+	entropy, the requested number of bytes may not be returned.
+	If there is no entropy available at all, getrandom(2) will
+	either block, or return an error with errno set to EAGAIN if
+	the GRND_NONBLOCK bit is set in flags.
+
+	If the GRND_RANDOM bit is not set, then the /dev/urandom pool
+	will be used.  Unlike using read(2) to fetch data from
+	/dev/urandom, if the urandom pool has not been sufficiently
+	initialized, getrandom(2) will block (or return -1 with the
+	errno set to EAGAIN if the GRND_NONBLOCK bit is set in flags).
+
+	The getentropy(2) system call in OpenBSD can be emulated using
+	the following function:
+
+            int getentropy(void *buf, size_t buflen)
+            {
+                    int     ret;
+
+                    if (buflen > 256)
+                            goto failure;
+                    ret = getrandom(buf, buflen, 0);
+                    if (ret < 0)
+                            return ret;
+                    if (ret == buflen)
+                            return 0;
+            failure:
+                    errno = EIO;
+                    return -1;
+            }
+
+RETURN VALUE
+       On success, the number of bytes that was filled in the buf is
+       returned.  This may not be all the bytes requested by the
+       caller via buflen if insufficient entropy was present in the
+       /dev/random pool, or if the system call was interrupted by a
+       signal.
+
+       On error, -1 is returned, and errno is set appropriately.
+
+ERRORS
+	EINVAL		An invalid flag was passed to getrandom(2)
+
+	EFAULT		buf is outside the accessible address space.
+
+	EAGAIN		The requested entropy was not available, and
+			getentropy(2) would have blocked if the
+			GRND_NONBLOCK flag was not set.
+
+	EINTR		While blocked waiting for entropy, the call was
+			interrupted by a signal handler; see the description
+			of how interrupted read(2) calls on "slow" devices
+			are handled with and without the SA_RESTART flag
+			in the signal(7) man page.
+
+NOTES
+	For small requests (buflen <= 256) getrandom(2) will not
+	return EINTR when reading from the urandom pool once the
+	entropy pool has been initialized, and it will return all of
+	the bytes that have been requested.  This is the recommended
+	way to use getrandom(2), and is designed for compatibility
+	with OpenBSD's getentropy() system call.
+
+	However, if you are using GRND_RANDOM, then getrandom(2) may
+	block until the entropy accounting determines that sufficient
+	environmental noise has been gathered such that getrandom(2)
+	will be operating as a NRBG instead of a DRBG for those people
+	who are working in the NIST SP 800-90 regime.  Since it may
+	block for a long time, these guarantees do *not* apply.  The
+	user may want to interrupt a hanging process using a signal,
+	so blocking until all of the requested bytes are returned
+	would be unfriendly.
+
+	For this reason, the user of getrandom(2) MUST always check
+	the return value, in case it returns some error, or if fewer
+	bytes than requested was returned.  In the case of
+	!GRND_RANDOM and small request, the latter should never
+	happen, but the careful userspace code (and all crypto code
+	should be careful) should check for this anyway!
+
+	Finally, unless you are doing long-term key generation (and
+	perhaps not even then), you probably shouldn't be using
+	GRND_RANDOM.  The cryptographic algorithms used for
+	/dev/urandom are quite conservative, and so should be
+	sufficient for all purposes.  The disadvantage of GRND_RANDOM
+	is that it can block, and the increased complexity required to
+	deal with partially fulfilled getrandom(2) requests.
+
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Reviewed-by: Zach Brown <zab@zabbo.net>
+
+Bug: http://b/29621447
+Change-Id: I189ba74070dd6d918b0fdf83ff30bb74ec0f7556
+(cherry picked from commit 4af712e8df998475736f3e2727701bd31e3751a9)
+[flex1911]: backport to 3.4
+[michitux]: backport to 3.0, remove x86 support
+---
+ drivers/char/random.c        | 52 +++++++++++++++++++++++++++++++-----
+ include/asm-generic/unistd.h |  4 ++-
+ include/linux/random.h       |  9 +++++++
+ include/linux/syscalls.h     |  3 +++
+ 4 files changed, 60 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/char/random.c b/drivers/char/random.c
+index e7e479c84233..8d09b53c9102 100644
+--- a/drivers/char/random.c
++++ b/drivers/char/random.c
+@@ -255,6 +255,8 @@
+ #include <linux/fips.h>
+ #include <linux/ptrace.h>
+ #include <linux/kmemcheck.h>
++#include <linux/syscalls.h>
++#include <linux/completion.h>
+ 
+ #ifdef CONFIG_GENERIC_HARDIRQS
+ # include <linux/irq.h>
+@@ -397,6 +399,7 @@ static struct poolinfo {
+  */
+ static DECLARE_WAIT_QUEUE_HEAD(random_read_wait);
+ static DECLARE_WAIT_QUEUE_HEAD(random_write_wait);
++static DECLARE_WAIT_QUEUE_HEAD(urandom_init_wait);
+ static struct fasync_struct *fasync;
+ 
+ #if 0
+@@ -607,10 +610,14 @@ retry:
+ 	if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig)
+ 		goto retry;
+ 
+-	if (!r->initialized && nbits > 0) {
+-		r->entropy_total += nbits;
+-		if (r->entropy_total > 128)
+-			r->initialized = 1;
++	r->entropy_total += nbits;
++	if (!r->initialized && r->entropy_total > 128) {
++		r->initialized = 1;
++		r->entropy_total = 0;
++		if (r == &nonblocking_pool) {
++			wake_up_interruptible(&urandom_init_wait);
++			pr_notice("random: %s pool is initialized\n", r->name);
++		}
+ 	}
+ 
+ 	trace_credit_entropy_bits(r->name, nbits, entropy_count,
+@@ -957,6 +964,7 @@ static ssize_t extract_entropy(struct entropy_store *r, void *buf,
+ 	ssize_t ret = 0, i;
+ 	__u8 tmp[EXTRACT_SIZE];
+ 
++
+ 	trace_extract_entropy(r->name, nbytes, r->entropy_count, _RET_IP_);
+ 	xfer_secondary_pool(r, nbytes);
+ 	nbytes = account(r, nbytes, min, reserved);
+@@ -991,13 +999,14 @@ static ssize_t extract_entropy_user(struct entropy_store *r, void __user *buf,
+ {
+ 	ssize_t ret = 0, i;
+ 	__u8 tmp[EXTRACT_SIZE];
++	int large_request = (nbytes > 256);
+ 
+ 	trace_extract_entropy_user(r->name, nbytes, r->entropy_count, _RET_IP_);
+ 	xfer_secondary_pool(r, nbytes);
+ 	nbytes = account(r, nbytes, 0, 0);
+ 
+ 	while (nbytes) {
+-		if (need_resched()) {
++		if (large_request && need_resched()) {
+ 			if (signal_pending(current)) {
+ 				if (ret == 0)
+ 					ret = -ERESTARTSYS;
+@@ -1130,7 +1139,7 @@ void rand_initialize_disk(struct gendisk *disk)
+ #endif
+ 
+ static ssize_t
+-random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
++_random_read(int nonblock, char __user *buf, size_t nbytes)
+ {
+ 	ssize_t n, retval = 0, count = 0;
+ 
+@@ -1150,7 +1159,7 @@ random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
+ 			  n*8, (nbytes-n)*8);
+ 
+ 		if (n == 0) {
+-			if (file->f_flags & O_NONBLOCK) {
++			if (nonblock) {
+ 				retval = -EAGAIN;
+ 				break;
+ 			}
+@@ -1185,6 +1194,12 @@ random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
+ 	return (count ? count : retval);
+ }
+ 
++static ssize_t
++random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
++{
++	return _random_read(file->f_flags & O_NONBLOCK, buf, nbytes);
++}
++
+ static ssize_t
+ urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
+ {
+@@ -1311,6 +1326,29 @@ const struct file_operations urandom_fops = {
+ 	.llseek = noop_llseek,
+ };
+ 
++SYSCALL_DEFINE3(getrandom, char __user *, buf, size_t, count,
++		unsigned int, flags)
++{
++	if (flags & ~(GRND_NONBLOCK|GRND_RANDOM))
++		return -EINVAL;
++
++	if (count > INT_MAX)
++		count = INT_MAX;
++
++	if (flags & GRND_RANDOM)
++		return _random_read(flags & GRND_NONBLOCK, buf, count);
++
++	if (unlikely(nonblocking_pool.initialized == 0)) {
++		if (flags & GRND_NONBLOCK)
++			return -EAGAIN;
++		wait_event_interruptible(urandom_init_wait,
++					 nonblocking_pool.initialized);
++		if (signal_pending(current))
++			return -ERESTARTSYS;
++	}
++	return urandom_read(NULL, buf, count, NULL);
++}
++
+ /***************************************************************
+  * Random UUID interface
+  *
+diff --git a/include/asm-generic/unistd.h b/include/asm-generic/unistd.h
+index 5518963e38b0..4eeff0f900ac 100644
+--- a/include/asm-generic/unistd.h
++++ b/include/asm-generic/unistd.h
+@@ -685,9 +685,11 @@ __SYSCALL(__NR_syncfs, sys_syncfs)
+ __SYSCALL(__NR_setns, sys_setns)
+ #define __NR_sendmmsg 269
+ __SC_COMP(__NR_sendmmsg, sys_sendmmsg, compat_sys_sendmmsg)
++#define __NR_getrandom 278
++__SYSCALL(__NR_getrandom, sys_getrandom)
+ 
+ #undef __NR_syscalls
+-#define __NR_syscalls 270
++#define __NR_syscalls 279
+ 
+ /*
+  * All syscalls below here should go away really,
+diff --git a/include/linux/random.h b/include/linux/random.h
+index 7e58ad27b7ff..788834fb7969 100644
+--- a/include/linux/random.h
++++ b/include/linux/random.h
+@@ -46,6 +46,15 @@ struct rnd_state {
+ 
+ /* Exported functions */
+ 
++/*
++ * Flags for getrandom(2)
++ *
++ * GRND_NONBLOCK	Don't block and return EAGAIN instead
++ * GRND_RANDOM		Use the /dev/random pool instead of /dev/urandom
++ */
++#define GRND_NONBLOCK	0x0001
++#define GRND_RANDOM	0x0002
++
+ #ifdef __KERNEL__
+ 
+ extern void add_device_randomness(const void *, unsigned int);
+diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
+index 8c03b98df5f9..6935b215e34c 100644
+--- a/include/linux/syscalls.h
++++ b/include/linux/syscalls.h
+@@ -847,4 +847,7 @@ asmlinkage long sys_open_by_handle_at(int mountdirfd,
+ 				      struct file_handle __user *handle,
+ 				      int flags);
+ asmlinkage long sys_setns(int fd, int nstype);
++asmlinkage long sys_getrandom(char __user *buf, size_t count,
++			      unsigned int flags);
++
+ #endif
+-- 
+2.19.0
+
diff --git a/device/linux-samsung-n5110/0002-BACKPORT-random-Wake-up-all-getrandom-2-callers-when.patch b/device/linux-samsung-n5110/0002-BACKPORT-random-Wake-up-all-getrandom-2-callers-when.patch
new file mode 100644
index 0000000000000000000000000000000000000000..87ba343a8a33db7e813b38469a3071b32739a913
--- /dev/null
+++ b/device/linux-samsung-n5110/0002-BACKPORT-random-Wake-up-all-getrandom-2-callers-when.patch
@@ -0,0 +1,39 @@
+From ad7154f084e30ed053a616fd1ebe1d969c2b742a Mon Sep 17 00:00:00 2001
+From: Herbert Xu <herbert@gondor.apana.org.au>
+Date: Thu, 21 May 2015 16:19:54 +0800
+Subject: [PATCH 2/3] BACKPORT: random: Wake up all getrandom(2) callers when
+ pool is ready
+
+Clean cherry pick of 1d9de44e268d880cbe2d0bd3be1ef0661f93fd34.
+
+If more than one application invokes getrandom(2) before the pool
+is ready, then all bar one will be stuck forever because we use
+wake_up_interruptible which wakes up a single task.
+
+This patch replaces it with wake_up_all.
+
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+
+Bug: http://b/29621447
+Change-Id: I5dfd7abac10898802f030e0a2af7110809283328
+(cherry picked from commit 1d9de44e268d880cbe2d0bd3be1ef0661f93fd34)
+---
+ drivers/char/random.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/char/random.c b/drivers/char/random.c
+index 8d09b53c9102..702b5bcad2c8 100644
+--- a/drivers/char/random.c
++++ b/drivers/char/random.c
+@@ -615,7 +615,7 @@ retry:
+ 		r->initialized = 1;
+ 		r->entropy_total = 0;
+ 		if (r == &nonblocking_pool) {
+-			wake_up_interruptible(&urandom_init_wait);
++			wake_up_all(&urandom_init_wait);
+ 			pr_notice("random: %s pool is initialized\n", r->name);
+ 		}
+ 	}
+-- 
+2.19.0
+
diff --git a/device/linux-samsung-n5110/0003-BACKPORT-ARM-wire-up-getrandom-syscall.patch b/device/linux-samsung-n5110/0003-BACKPORT-ARM-wire-up-getrandom-syscall.patch
new file mode 100644
index 0000000000000000000000000000000000000000..9d9c723375df2082778027ed530528e63029315e
--- /dev/null
+++ b/device/linux-samsung-n5110/0003-BACKPORT-ARM-wire-up-getrandom-syscall.patch
@@ -0,0 +1,71 @@
+From d919f1f5c38205ad2ab38d4c061e8b28e606559b Mon Sep 17 00:00:00 2001
+From: Russell King <rmk+kernel@arm.linux.org.uk>
+Date: Fri, 8 Aug 2014 10:56:34 +0100
+Subject: [PATCH 3/3] BACKPORT: ARM: wire up getrandom syscall
+
+Clean cherry pick of eb6452537b280652eee66801ec97cc369e27e5d8.
+
+Add the new getrandom syscall for ARM.
+
+Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
+
+Bug: http://b/29621447
+Change-Id: I6d50b57f3a61fbf9102c69103b9a5b7ebf239860
+(cherry picked from commit eb6452537b280652eee66801ec97cc369e27e5d8)
+[flex1911]: backport to 3.4
+[michitux]: backport to 3.0
+---
+ arch/arm/include/asm/unistd.h | 9 +++++++++
+ arch/arm/kernel/calls.S       | 9 +++++++++
+ 2 files changed, 18 insertions(+)
+
+diff --git a/arch/arm/include/asm/unistd.h b/arch/arm/include/asm/unistd.h
+index 2c04ed5efeb5..96e290b9fecf 100644
+--- a/arch/arm/include/asm/unistd.h
++++ b/arch/arm/include/asm/unistd.h
+@@ -402,6 +402,7 @@
+ #define __NR_syncfs			(__NR_SYSCALL_BASE+373)
+ #define __NR_sendmmsg			(__NR_SYSCALL_BASE+374)
+ #define __NR_setns			(__NR_SYSCALL_BASE+375)
++#define __NR_getrandom			(__NR_SYSCALL_BASE+384)
+ 
+ /*
+  * The following SWIs are ARM private.
+@@ -413,6 +414,14 @@
+ #define __ARM_NR_usr32			(__ARM_NR_BASE+4)
+ #define __ARM_NR_set_tls		(__ARM_NR_BASE+5)
+ 
++/*
++ * This may need to be greater than __NR_last_syscall+1 in order to
++ * account for the padding in the syscall table
++ */
++#ifdef __KERNEL__
++#define __NR_syscalls  (388)
++#endif
++
+ /*
+  * *NOTE*: This is a ghost syscall private to the kernel.  Only the
+  * __kuser_cmpxchg code in entry-armv.S should be aware of its
+diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S
+index 80f7896cc016..612627f899d4 100644
+--- a/arch/arm/kernel/calls.S
++++ b/arch/arm/kernel/calls.S
+@@ -385,6 +385,15 @@
+ 		CALL(sys_syncfs)
+ 		CALL(sys_sendmmsg)
+ /* 375 */	CALL(sys_setns)
++		CALL(sys_ni_syscall)
++		CALL(sys_ni_syscall)
++		CALL(sys_ni_syscall)
++		CALL(sys_ni_syscall)
++/* 380 */	CALL(sys_ni_syscall)
++		CALL(sys_ni_syscall)
++		CALL(sys_ni_syscall)
++		CALL(sys_ni_syscall)
++		CALL(sys_getrandom)
+ #ifndef syscalls_counted
+ .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
+ #define syscalls_counted
+-- 
+2.19.0
+
diff --git a/device/linux-samsung-n5110/APKBUILD b/device/linux-samsung-n5110/APKBUILD
index 15b840ce846f5307103fd5cb1bc7665ab1b6f435..d32333b8ba59081fa960c16b3c6c118540bb5db8 100644
--- a/device/linux-samsung-n5110/APKBUILD
+++ b/device/linux-samsung-n5110/APKBUILD
@@ -2,7 +2,7 @@
 
 pkgname="linux-samsung-n5110"
 pkgver=3.0.101
-pkgrel=1
+pkgrel=2
 pkgdesc="Samsung Galaxy Note 8.0 (Wi-Fi) kernel fork"
 arch="armhf"
 _carch="arm"
@@ -28,6 +28,9 @@ _config="config-${_flavor}.${arch}"
 source="
 	$pkgname-$_commit.tar.gz::https://github.com/LineageOS/${_repository}/archive/${_commit}.tar.gz
 	$_config
+	0001-BACKPORT-random-introduce-getrandom-2-system-call.patch
+	0002-BACKPORT-random-Wake-up-all-getrandom-2-callers-when.patch
+	0003-BACKPORT-ARM-wire-up-getrandom-syscall.patch
 	compiler-gcc6.h
 "
 builddir="$srcdir/${_repository}-${_commit}"
@@ -77,4 +80,7 @@ package() {
 
 sha512sums="7e47ecfa6c3b2f4ac199ceed4103a00a577f9fa0002f5759df570f3c11a3436e53114e87a13e9efd27f2a2e17fcaab1be0666dffaa7d23699e700bee0d2afe33  linux-samsung-n5110-b7ffe7f2aea2391737cdeac2a33217ee0ea4f2ba.tar.gz
 0d0219494704891d06c85929ed2d73db49c581874ad04c9e11f625dd06a499854a1ec813dd7073fb9bb88a91f17510ae168e38716986de324e156e45d6fb965e  config-samsung-n5110.armhf
+9f931974afda5f82dab400758aa35decb97678ef698748c56dae4b2ede62fab34c3a7d6c16293602cfbb7a6a41d64ac3d25b8cb63251bef23475d50bfaae16a6  0001-BACKPORT-random-introduce-getrandom-2-system-call.patch
+5d64e22eaeddc4a7fd4b99076bd2e29c02c214852663d6ddb30d304e9aba1f177f8c25e15f7892045cc132ef80e148952128536817fa8af6f03f3c7ee33d33a3  0002-BACKPORT-random-Wake-up-all-getrandom-2-callers-when.patch
+8ce10fba0b10131de07a9c47544702b68c52f2e0a09eb2942044abf2e292cbfacbac0b6f6445306af46915064573037cfd66f99500bfa75551daa9376b1a6f77  0003-BACKPORT-ARM-wire-up-getrandom-syscall.patch
 d80980e9474c82ba0ef1a6903b434d8bd1b092c40367ba543e72d2c119301c8b2d05265740e4104ca1ac5d15f6c4aa49e8776cb44264a9a28dc551e0d1850dcc  compiler-gcc6.h"