summaryrefslogtreecommitdiffstats
path: root/main/linux-grsec
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2012-12-11 08:48:38 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2012-12-11 09:16:01 +0000
commit35913da22f50d2d0602cd8146346423812b02b92 (patch)
treec64e5eaecd308a5b230003bd0bd9eda76e75375c /main/linux-grsec
parent80aa523c971b108d5f472ca5ac576e7deda46240 (diff)
downloadaports-35913da22f50d2d0602cd8146346423812b02b92.tar.bz2
aports-35913da22f50d2d0602cd8146346423812b02b92.tar.xz
main/linux-grsec: upgrade to 3.6.10
Diffstat (limited to 'main/linux-grsec')
-rw-r--r--main/linux-grsec/APKBUILD12
-rw-r--r--main/linux-grsec/grsecurity-2.9.1-3.6.10-201212101818.patch (renamed from main/linux-grsec/grsecurity-2.9.1-3.6.9-201212071641.patch)264
-rw-r--r--main/linux-grsec/pax-fpu-regression.patch19
3 files changed, 44 insertions, 251 deletions
diff --git a/main/linux-grsec/APKBUILD b/main/linux-grsec/APKBUILD
index 5d07a7c60..77a4c5f49 100644
--- a/main/linux-grsec/APKBUILD
+++ b/main/linux-grsec/APKBUILD
@@ -2,9 +2,9 @@
_flavor=grsec
pkgname=linux-${_flavor}
-pkgver=3.6.9
+pkgver=3.6.10
_kernver=3.6
-pkgrel=3
+pkgrel=0
pkgdesc="Linux kernel with grsecurity"
url=http://grsecurity.net
depends="mkinitfs linux-firmware"
@@ -14,8 +14,7 @@ _config=${config:-kernelconfig.${CARCH}}
install=
source="http://ftp.kernel.org/pub/linux/kernel/v3.x/linux-$_kernver.tar.xz
http://ftp.kernel.org/pub/linux/kernel/v3.x/patch-$pkgver.xz
- grsecurity-2.9.1-3.6.9-201212071641.patch
- pax-fpu-regression.patch
+ grsecurity-2.9.1-3.6.10-201212101818.patch
0004-arp-flush-arp-cache-on-device-change.patch
@@ -140,9 +139,8 @@ dev() {
}
md5sums="1a1760420eac802c541a20ab51a093d1 linux-3.6.tar.xz
-a7c656034599f90dcbc50895b69022aa patch-3.6.9.xz
-6e2dc33e621d993fd921d7dc85b56561 grsecurity-2.9.1-3.6.9-201212071641.patch
-699548fb6e34efc5790390a074b0d50a pax-fpu-regression.patch
+406a52f90a2ddc78a3ecdf4fe46e7cf7 patch-3.6.10.xz
+ef2ddd73dc2f0cd30687a540e09c0366 grsecurity-2.9.1-3.6.10-201212101818.patch
776adeeb5272093574f8836c5037dd7d 0004-arp-flush-arp-cache-on-device-change.patch
373db5888708938c6b1baed6da781fcb kernelconfig.x86
190788fb10e79abce9d570d5e87ec3b4 kernelconfig.x86_64"
diff --git a/main/linux-grsec/grsecurity-2.9.1-3.6.9-201212071641.patch b/main/linux-grsec/grsecurity-2.9.1-3.6.10-201212101818.patch
index 972461701..2c09d999d 100644
--- a/main/linux-grsec/grsecurity-2.9.1-3.6.9-201212071641.patch
+++ b/main/linux-grsec/grsecurity-2.9.1-3.6.10-201212101818.patch
@@ -251,7 +251,7 @@ index ad7e2e5..199f49e 100644
pcd. [PARIDE]
diff --git a/Makefile b/Makefile
-index 978af72..1121485 100644
+index 686b83c..5e0a360 100644
--- a/Makefile
+++ b/Makefile
@@ -241,8 +241,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
@@ -10603,7 +10603,7 @@ index 75ce3f4..882e801 100644
#endif /* _ASM_X86_EMERGENCY_RESTART_H */
diff --git a/arch/x86/include/asm/fpu-internal.h b/arch/x86/include/asm/fpu-internal.h
-index 75f4c6d..9215c4a 100644
+index 04cb0f8..1da4bc9 100644
--- a/arch/x86/include/asm/fpu-internal.h
+++ b/arch/x86/include/asm/fpu-internal.h
@@ -82,10 +82,12 @@ static inline void sanitize_i387_state(struct task_struct *tsk)
@@ -10648,7 +10648,23 @@ index 75f4c6d..9215c4a 100644
X86_FEATURE_FXSR,
"m" (*fx));
-@@ -271,7 +275,7 @@ static inline int restore_fpu_checking(struct task_struct *tsk)
+@@ -250,7 +254,14 @@ static inline int __save_init_fpu(struct task_struct *tsk)
+
+ static inline int fpu_fxrstor_checking(struct fpu *fpu)
+ {
+- return fxrstor_checking(&fpu->state->fxsave);
++ int ret;
++ mm_segment_t fs;
++
++ fs = get_fs();
++ set_fs(KERNEL_DS);
++ ret = fxrstor_checking(&fpu->state->fxsave);
++ set_fs(fs);
++ return ret;
+ }
+
+ static inline int fpu_restore_checking(struct fpu *fpu)
+@@ -271,7 +282,7 @@ static inline int restore_fpu_checking(struct task_struct *tsk)
"emms\n\t" /* clear stack tags */
"fildl %P[addr]", /* set F?P to defined value */
X86_FEATURE_FXSAVE_LEAK,
@@ -10657,30 +10673,6 @@ index 75f4c6d..9215c4a 100644
return fpu_restore_checking(&tsk->thread.fpu);
}
-@@ -334,14 +338,17 @@ static inline void __thread_fpu_begin(struct task_struct *tsk)
- typedef struct { int preload; } fpu_switch_t;
-
- /*
-- * FIXME! We could do a totally lazy restore, but we need to
-- * add a per-cpu "this was the task that last touched the FPU
-- * on this CPU" variable, and the task needs to have a "I last
-- * touched the FPU on this CPU" and check them.
-+ * Must be run with preemption disabled: this clears the fpu_owner_task,
-+ * on this CPU.
- *
-- * We don't do that yet, so "fpu_lazy_restore()" always returns
-- * false, but some day..
-+ * This will disable any lazy FPU state restore of the current FPU state,
-+ * but if the current thread owns the FPU, it will still be saved by.
- */
-+static inline void __cpu_disable_lazy_restore(unsigned int cpu)
-+{
-+ per_cpu(fpu_owner_task, cpu) = NULL;
-+}
-+
- static inline int fpu_lazy_restore(struct task_struct *new, unsigned int cpu)
- {
- return new == this_cpu_read_stable(fpu_owner_task) &&
diff --git a/arch/x86/include/asm/futex.h b/arch/x86/include/asm/futex.h
index 71ecbcb..11df950 100644
--- a/arch/x86/include/asm/futex.h
@@ -14157,10 +14149,10 @@ index d30a6a9..79becab 100644
obj-y += proc.o capflags.o powerflags.o common.o
obj-y += vmware.o hypervisor.o mshyperv.o
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
-index 9d92e19..49d7d79 100644
+index e4da438..8b1c97c 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
-@@ -724,7 +724,7 @@ static unsigned int __cpuinit amd_size_cache(struct cpuinfo_x86 *c,
+@@ -738,7 +738,7 @@ static unsigned int __cpuinit amd_size_cache(struct cpuinfo_x86 *c,
unsigned int size)
{
/* AMD errata T13 (order #21922) */
@@ -19252,19 +19244,10 @@ index b280908..6de349e 100644
if (err)
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
-index 7c5a8c3..8a54a1a 100644
+index 23c39cf..52ed8d9 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
-@@ -68,6 +68,8 @@
- #include <asm/mwait.h>
- #include <asm/apic.h>
- #include <asm/io_apic.h>
-+#include <asm/i387.h>
-+#include <asm/fpu-internal.h>
- #include <asm/setup.h>
- #include <asm/uv/uv.h>
- #include <linux/mc146818rtc.h>
-@@ -670,6 +672,7 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu, struct task_struct *idle)
+@@ -672,6 +672,7 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu, struct task_struct *idle)
idle->thread.sp = (unsigned long) (((struct pt_regs *)
(THREAD_SIZE + task_stack_page(idle))) - 1);
per_cpu(current_task, cpu) = idle;
@@ -19272,7 +19255,7 @@ index 7c5a8c3..8a54a1a 100644
#ifdef CONFIG_X86_32
/* Stack for startup_32 can be just as for start_secondary onwards */
-@@ -677,11 +680,13 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu, struct task_struct *idle)
+@@ -679,11 +680,13 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu, struct task_struct *idle)
#else
clear_tsk_thread_flag(idle, TIF_FORK);
initial_gs = per_cpu_offset(cpu);
@@ -19289,9 +19272,9 @@ index 7c5a8c3..8a54a1a 100644
initial_code = (unsigned long)start_secondary;
stack_start = idle->thread.sp;
-@@ -817,6 +822,15 @@ int __cpuinit native_cpu_up(unsigned int cpu, struct task_struct *tidle)
-
- per_cpu(cpu_state, cpu) = CPU_UP_PREPARE;
+@@ -822,6 +825,15 @@ int __cpuinit native_cpu_up(unsigned int cpu, struct task_struct *tidle)
+ /* the FPU context is blank, nobody can own it */
+ __cpu_disable_lazy_restore(cpu);
+#ifdef CONFIG_PAX_PER_CPU_PGD
+ clone_pgd_range(get_cpu_pgd(cpu) + KERNEL_PGD_BOUNDARY,
@@ -28155,10 +28138,10 @@ index 251c7b62..000462d 100644
bool enable = !device_may_wakeup(&dev->dev);
device_set_wakeup_enable(&dev->dev, enable);
diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c
-index bfc31cb..8213ce1 100644
+index bebe17f..3d0c1d8 100644
--- a/drivers/acpi/processor_driver.c
+++ b/drivers/acpi/processor_driver.c
-@@ -551,7 +551,7 @@ static int __cpuinit acpi_processor_add(struct acpi_device *device)
+@@ -552,7 +552,7 @@ static int __cpuinit acpi_processor_add(struct acpi_device *device)
return 0;
#endif
@@ -34061,7 +34044,7 @@ index 1cbfc6b..56e1dbb 100644
/*----------------------------------------------------------------*/
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
-index 05bb49e..84d7ce6 100644
+index 7077dcf..facc1e9 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -1810,7 +1810,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
@@ -35099,7 +35082,7 @@ index 57d64b8..623dd86 100644
MODULE_PARM_DESC(X, desc);
#else
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
-index 0875ecf..794cdf3 100644
+index b028b5e..2ef481f 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
@@ -3051,9 +3051,8 @@ static void bnx2x_drv_info_ether_stat(struct bnx2x *bp)
@@ -38197,7 +38180,7 @@ index 0d4aa82..f7832d4 100644
/* core tmem accessor functions */
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
-index 7502660..f214d9f 100644
+index c87ef74..6d32e54 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -1098,7 +1098,7 @@ struct se_device *transport_add_device_to_core_hba(
@@ -70594,7 +70577,7 @@ index 98ec494..4241d6d 100644
default:
diff --git a/kernel/sched/auto_group.c b/kernel/sched/auto_group.c
-index 0984a21..7e50319 100644
+index 15f60d0..7e50319 100644
--- a/kernel/sched/auto_group.c
+++ b/kernel/sched/auto_group.c
@@ -11,7 +11,7 @@
@@ -70615,38 +70598,6 @@ index 0984a21..7e50319 100644
ag->tg = tg;
#ifdef CONFIG_RT_GROUP_SCHED
/*
-@@ -143,15 +143,11 @@ autogroup_move_group(struct task_struct *p, struct autogroup *ag)
-
- p->signal->autogroup = autogroup_kref_get(ag);
-
-- if (!ACCESS_ONCE(sysctl_sched_autogroup_enabled))
-- goto out;
--
- t = p;
- do {
- sched_move_task(t);
- } while_each_thread(p, t);
-
--out:
- unlock_task_sighand(p, &flags);
- autogroup_kref_put(prev);
- }
-diff --git a/kernel/sched/auto_group.h b/kernel/sched/auto_group.h
-index 8bd0471..443232e 100644
---- a/kernel/sched/auto_group.h
-+++ b/kernel/sched/auto_group.h
-@@ -4,11 +4,6 @@
- #include <linux/rwsem.h>
-
- struct autogroup {
-- /*
-- * reference doesn't mean how many thread attach to this
-- * autogroup now. It just stands for the number of task
-- * could use this autogroup.
-- */
- struct kref kref;
- struct task_group *tg;
- struct rw_semaphore lock;
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 1a48cdb..d3949ff 100644
--- a/kernel/sched/core.c
@@ -71760,7 +71711,7 @@ index d4545f4..a9010a1 100644
local_irq_save(flags);
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
-index 872bd6d..b727b3a 100644
+index 6d42247..b727b3a 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -1422,7 +1422,7 @@ retry:
@@ -71781,18 +71732,6 @@ index 872bd6d..b727b3a 100644
if (test_and_set_bit(WORK_STRUCT_PENDING_BIT,
work_data_bits(rebind_work)))
-@@ -2266,8 +2266,10 @@ static int rescuer_thread(void *__wq)
- repeat:
- set_current_state(TASK_INTERRUPTIBLE);
-
-- if (kthread_should_stop())
-+ if (kthread_should_stop()) {
-+ __set_current_state(TASK_RUNNING);
- return 0;
-+ }
-
- /*
- * See whether any cpu is asking for help. Unbounded
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index 2403a63..5c4be4c 100644
--- a/lib/Kconfig.debug
@@ -72532,7 +72471,7 @@ index 14d260f..b2a80fd 100644
if (end == start)
goto out;
diff --git a/mm/memory-failure.c b/mm/memory-failure.c
-index a6e2141..0e32042 100644
+index 3dd21e2..0e32042 100644
--- a/mm/memory-failure.c
+++ b/mm/memory-failure.c
@@ -61,7 +61,7 @@ int sysctl_memory_failure_early_kill __read_mostly = 0;
@@ -72607,25 +72546,7 @@ index a6e2141..0e32042 100644
&mce_bad_pages);
set_page_hwpoison_huge_page(hpage);
dequeue_hwpoisoned_huge_page(hpage);
-@@ -1474,9 +1474,17 @@ int soft_offline_page(struct page *page, int flags)
- {
- int ret;
- unsigned long pfn = page_to_pfn(page);
-+ struct page *hpage = compound_trans_head(page);
-
- if (PageHuge(page))
- return soft_offline_huge_page(page, flags);
-+ if (PageTransHuge(hpage)) {
-+ if (PageAnon(hpage) && unlikely(split_huge_page(hpage))) {
-+ pr_info("soft offline: %#lx: failed to split THP\n",
-+ pfn);
-+ return -EBUSY;
-+ }
-+ }
-
- ret = get_any_page(page, pfn, flags);
- if (ret < 0)
-@@ -1572,7 +1580,7 @@ int soft_offline_page(struct page *page, int flags)
+@@ -1580,7 +1580,7 @@ int soft_offline_page(struct page *page, int flags)
return ret;
done:
@@ -76350,47 +76271,6 @@ index 1b7e22a..3fcd4f3 100644
}
return pgd;
}
-diff --git a/mm/sparse.c b/mm/sparse.c
-index fac95f2..a83de2f 100644
---- a/mm/sparse.c
-+++ b/mm/sparse.c
-@@ -617,7 +617,7 @@ static void __kfree_section_memmap(struct page *memmap, unsigned long nr_pages)
- {
- return; /* XXX: Not implemented yet */
- }
--static void free_map_bootmem(struct page *page, unsigned long nr_pages)
-+static void free_map_bootmem(struct page *memmap, unsigned long nr_pages)
- {
- }
- #else
-@@ -658,10 +658,11 @@ static void __kfree_section_memmap(struct page *memmap, unsigned long nr_pages)
- get_order(sizeof(struct page) * nr_pages));
- }
-
--static void free_map_bootmem(struct page *page, unsigned long nr_pages)
-+static void free_map_bootmem(struct page *memmap, unsigned long nr_pages)
- {
- unsigned long maps_section_nr, removing_section_nr, i;
- unsigned long magic;
-+ struct page *page = virt_to_page(memmap);
-
- for (i = 0; i < nr_pages; i++, page++) {
- magic = (unsigned long) page->lru.next;
-@@ -710,13 +711,10 @@ static void free_section_usemap(struct page *memmap, unsigned long *usemap)
- */
-
- if (memmap) {
-- struct page *memmap_page;
-- memmap_page = virt_to_page(memmap);
--
- nr_pages = PAGE_ALIGN(PAGES_PER_SECTION * sizeof(struct page))
- >> PAGE_SHIFT;
-
-- free_map_bootmem(memmap_page, nr_pages);
-+ free_map_bootmem(memmap, nr_pages);
- }
- }
-
diff --git a/mm/swap.c b/mm/swap.c
index 7782588..228c784 100644
--- a/mm/swap.c
@@ -76675,72 +76555,6 @@ index 2bb90b1..3795e47 100644
v->addr, v->addr + v->size, v->size);
if (v->caller)
-diff --git a/mm/vmscan.c b/mm/vmscan.c
-index 40db7d1..be5a9c1 100644
---- a/mm/vmscan.c
-+++ b/mm/vmscan.c
-@@ -2383,6 +2383,19 @@ static void age_active_anon(struct zone *zone, struct scan_control *sc)
- } while (memcg);
- }
-
-+static bool zone_balanced(struct zone *zone, int order,
-+ unsigned long balance_gap, int classzone_idx)
-+{
-+ if (!zone_watermark_ok_safe(zone, order, high_wmark_pages(zone) +
-+ balance_gap, classzone_idx, 0))
-+ return false;
-+
-+ if (COMPACTION_BUILD && order && !compaction_suitable(zone, order))
-+ return false;
-+
-+ return true;
-+}
-+
- /*
- * pgdat_balanced is used when checking if a node is balanced for high-order
- * allocations. Only zones that meet watermarks and are in a zone allowed
-@@ -2461,8 +2474,7 @@ static bool prepare_kswapd_sleep(pg_data_t *pgdat, int order, long remaining,
- continue;
- }
-
-- if (!zone_watermark_ok_safe(zone, order, high_wmark_pages(zone),
-- i, 0))
-+ if (!zone_balanced(zone, order, 0, i))
- all_zones_ok = false;
- else
- balanced += zone->present_pages;
-@@ -2571,8 +2583,7 @@ loop_again:
- break;
- }
-
-- if (!zone_watermark_ok_safe(zone, order,
-- high_wmark_pages(zone), 0, 0)) {
-+ if (!zone_balanced(zone, order, 0, 0)) {
- end_zone = i;
- break;
- } else {
-@@ -2648,9 +2659,8 @@ loop_again:
- testorder = 0;
-
- if ((buffer_heads_over_limit && is_highmem_idx(i)) ||
-- !zone_watermark_ok_safe(zone, testorder,
-- high_wmark_pages(zone) + balance_gap,
-- end_zone, 0)) {
-+ !zone_balanced(zone, testorder,
-+ balance_gap, end_zone)) {
- shrink_zone(zone, &sc);
-
- reclaim_state->reclaimed_slab = 0;
-@@ -2677,8 +2687,7 @@ loop_again:
- continue;
- }
-
-- if (!zone_watermark_ok_safe(zone, testorder,
-- high_wmark_pages(zone), end_zone, 0)) {
-+ if (!zone_balanced(zone, testorder, 0, end_zone)) {
- all_zones_ok = 0;
- /*
- * We are still under min water mark. This
diff --git a/mm/vmstat.c b/mm/vmstat.c
index df7a674..8b4a4f3 100644
--- a/mm/vmstat.c
@@ -81291,7 +81105,7 @@ index 5c11312..72742b5 100644
write_hex_cnt = 0;
for (i = 0; i < logo_clutsize; i++) {
diff --git a/security/Kconfig b/security/Kconfig
-index e9c6ac7..e7feb0d 100644
+index e9c6ac7..152c2e3 100644
--- a/security/Kconfig
+++ b/security/Kconfig
@@ -4,6 +4,896 @@
@@ -81872,7 +81686,7 @@ index e9c6ac7..e7feb0d 100644
+config PAX_KERNEXEC
+ bool "Enforce non-executable kernel pages"
+ default y if GRKERNSEC_CONFIG_AUTO && (GRKERNSEC_CONFIG_VIRT_NONE || (GRKERNSEC_CONFIG_VIRT_EPT && GRKERNSEC_CONFIG_VIRT_GUEST) || (GRKERNSEC_CONFIG_VIRT_EPT && GRKERNSEC_CONFIG_VIRT_KVM))
-+ depends on (PPC || X86) && (!X86_32 || X86_WP_WORKS_OK) && !XEN
++ depends on X86 && (!X86_32 || X86_WP_WORKS_OK) && !XEN
+ select PAX_PER_CPU_PGD if X86_64 || (X86_32 && X86_PAE)
+ select PAX_KERNEXEC_PLUGIN if X86_64
+ help
@@ -82643,7 +82457,7 @@ index 4c1cc51..16040040 100644
}
} else if (runtime->access == SNDRV_PCM_ACCESS_RW_NONINTERLEAVED) {
diff --git a/sound/core/pcm_compat.c b/sound/core/pcm_compat.c
-index 91cdf94..4085161 100644
+index 91cdf943..4085161 100644
--- a/sound/core/pcm_compat.c
+++ b/sound/core/pcm_compat.c
@@ -31,7 +31,7 @@ static int snd_pcm_ioctl_delay_compat(struct snd_pcm_substream *substream,
diff --git a/main/linux-grsec/pax-fpu-regression.patch b/main/linux-grsec/pax-fpu-regression.patch
deleted file mode 100644
index 7ec5b3374..000000000
--- a/main/linux-grsec/pax-fpu-regression.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-diff -u linux-3.6.9-pax/arch/x86/include/asm/fpu-internal.h linux-3.6.9-pax/arch/x86/include/asm/fpu-internal.h
---- linux-3.6.9-pax/arch/x86/include/asm/fpu-internal.h 2012-11-30 20:11:38.909016648 +0100
-+++ linux-3.6.9-pax/arch/x86/include/asm/fpu-internal.h 2012-12-10 00:53:24.196782810 +0100
-@@ -254,7 +254,14 @@
-
- static inline int fpu_fxrstor_checking(struct fpu *fpu)
- {
-- return fxrstor_checking(&fpu->state->fxsave);
-+ int ret;
-+ mm_segment_t fs;
-+
-+ fs = get_fs();
-+ set_fs(KERNEL_DS);
-+ ret = fxrstor_checking(&fpu->state->fxsave);
-+ set_fs(fs);
-+ return ret;
- }
-
- static inline int fpu_restore_checking(struct fpu *fpu)