mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-05 02:19:51 +00:00
Merge branch 'master' into for-linus
This commit is contained in:
commit
b4093d6235
320 changed files with 10081 additions and 1958 deletions
2
CREDITS
2
CREDITS
|
@ -1856,7 +1856,7 @@ E: rfkoenig@immd4.informatik.uni-erlangen.de
|
||||||
D: The Linux Support Team Erlangen
|
D: The Linux Support Team Erlangen
|
||||||
|
|
||||||
N: Andreas Koensgen
|
N: Andreas Koensgen
|
||||||
E: ajk@iehk.rwth-aachen.de
|
E: ajk@comnets.uni-bremen.de
|
||||||
D: 6pack driver for AX.25
|
D: 6pack driver for AX.25
|
||||||
|
|
||||||
N: Harald Koerfgen
|
N: Harald Koerfgen
|
||||||
|
|
|
@ -83,11 +83,12 @@ not detect it missed following items in original chain.
|
||||||
obj = kmem_cache_alloc(...);
|
obj = kmem_cache_alloc(...);
|
||||||
lock_chain(); // typically a spin_lock()
|
lock_chain(); // typically a spin_lock()
|
||||||
obj->key = key;
|
obj->key = key;
|
||||||
atomic_inc(&obj->refcnt);
|
|
||||||
/*
|
/*
|
||||||
* we need to make sure obj->key is updated before obj->next
|
* we need to make sure obj->key is updated before obj->next
|
||||||
|
* or obj->refcnt
|
||||||
*/
|
*/
|
||||||
smp_wmb();
|
smp_wmb();
|
||||||
|
atomic_set(&obj->refcnt, 1);
|
||||||
hlist_add_head_rcu(&obj->obj_node, list);
|
hlist_add_head_rcu(&obj->obj_node, list);
|
||||||
unlock_chain(); // typically a spin_unlock()
|
unlock_chain(); // typically a spin_unlock()
|
||||||
|
|
||||||
|
@ -159,6 +160,10 @@ out:
|
||||||
obj = kmem_cache_alloc(cachep);
|
obj = kmem_cache_alloc(cachep);
|
||||||
lock_chain(); // typically a spin_lock()
|
lock_chain(); // typically a spin_lock()
|
||||||
obj->key = key;
|
obj->key = key;
|
||||||
|
/*
|
||||||
|
* changes to obj->key must be visible before refcnt one
|
||||||
|
*/
|
||||||
|
smp_wmb();
|
||||||
atomic_set(&obj->refcnt, 1);
|
atomic_set(&obj->refcnt, 1);
|
||||||
/*
|
/*
|
||||||
* insert obj in RCU way (readers might be traversing chain)
|
* insert obj in RCU way (readers might be traversing chain)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* cn_test.c
|
* cn_test.c
|
||||||
*
|
*
|
||||||
* 2004-2005 Copyright (c) Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
* 2004+ Copyright (c) Evgeniy Polyakov <zbr@ioremap.net>
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -194,5 +194,5 @@ module_init(cn_test_init);
|
||||||
module_exit(cn_test_fini);
|
module_exit(cn_test_fini);
|
||||||
|
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_AUTHOR("Evgeniy Polyakov <johnpol@2ka.mipt.ru>");
|
MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>");
|
||||||
MODULE_DESCRIPTION("Connector's test module");
|
MODULE_DESCRIPTION("Connector's test module");
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* ucon.c
|
* ucon.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2004+ Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
* Copyright (c) 2004+ Evgeniy Polyakov <zbr@ioremap.net>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
This is the 6pack-mini-HOWTO, written by
|
This is the 6pack-mini-HOWTO, written by
|
||||||
|
|
||||||
Andreas Könsgen DG3KQ
|
Andreas Könsgen DG3KQ
|
||||||
Internet: ajk@iehk.rwth-aachen.de
|
Internet: ajk@comnets.uni-bremen.de
|
||||||
AMPR-net: dg3kq@db0pra.ampr.org
|
AMPR-net: dg3kq@db0pra.ampr.org
|
||||||
AX.25: dg3kq@db0ach.#nrw.deu.eu
|
AX.25: dg3kq@db0ach.#nrw.deu.eu
|
||||||
|
|
||||||
|
|
|
@ -101,6 +101,8 @@ card*/pcm*/xrun_debug
|
||||||
bit 0 = Enable XRUN/jiffies debug messages
|
bit 0 = Enable XRUN/jiffies debug messages
|
||||||
bit 1 = Show stack trace at XRUN / jiffies check
|
bit 1 = Show stack trace at XRUN / jiffies check
|
||||||
bit 2 = Enable additional jiffies check
|
bit 2 = Enable additional jiffies check
|
||||||
|
bit 3 = Log hwptr update at each period interrupt
|
||||||
|
bit 4 = Log hwptr update at each snd_pcm_update_hw_ptr()
|
||||||
|
|
||||||
When the bit 0 is set, the driver will show the messages to
|
When the bit 0 is set, the driver will show the messages to
|
||||||
kernel log when an xrun is detected. The debug message is
|
kernel log when an xrun is detected. The debug message is
|
||||||
|
@ -117,6 +119,9 @@ card*/pcm*/xrun_debug
|
||||||
buggy) hardware that doesn't give smooth pointer updates.
|
buggy) hardware that doesn't give smooth pointer updates.
|
||||||
This feature is enabled via the bit 2.
|
This feature is enabled via the bit 2.
|
||||||
|
|
||||||
|
Bits 3 and 4 are for logging the hwptr records. Note that
|
||||||
|
these will give flood of kernel messages.
|
||||||
|
|
||||||
card*/pcm*/sub*/info
|
card*/pcm*/sub*/info
|
||||||
The general information of this PCM sub-stream.
|
The general information of this PCM sub-stream.
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
19 -> EM2860/SAA711X Reference Design (em2860)
|
19 -> EM2860/SAA711X Reference Design (em2860)
|
||||||
20 -> AMD ATI TV Wonder HD 600 (em2880) [0438:b002]
|
20 -> AMD ATI TV Wonder HD 600 (em2880) [0438:b002]
|
||||||
21 -> eMPIA Technology, Inc. GrabBeeX+ Video Encoder (em2800) [eb1a:2801]
|
21 -> eMPIA Technology, Inc. GrabBeeX+ Video Encoder (em2800) [eb1a:2801]
|
||||||
22 -> Unknown EM2750/EM2751 webcam grabber (em2750) [eb1a:2750,eb1a:2751]
|
22 -> EM2710/EM2750/EM2751 webcam grabber (em2750) [eb1a:2750,eb1a:2751]
|
||||||
23 -> Huaqi DLCW-130 (em2750)
|
23 -> Huaqi DLCW-130 (em2750)
|
||||||
24 -> D-Link DUB-T210 TV Tuner (em2820/em2840) [2001:f112]
|
24 -> D-Link DUB-T210 TV Tuner (em2820/em2840) [2001:f112]
|
||||||
25 -> Gadmei UTV310 (em2820/em2840)
|
25 -> Gadmei UTV310 (em2820/em2840)
|
||||||
|
|
|
@ -44,7 +44,9 @@ zc3xx 0458:7007 Genius VideoCam V2
|
||||||
zc3xx 0458:700c Genius VideoCam V3
|
zc3xx 0458:700c Genius VideoCam V3
|
||||||
zc3xx 0458:700f Genius VideoCam Web V2
|
zc3xx 0458:700f Genius VideoCam Web V2
|
||||||
sonixj 0458:7025 Genius Eye 311Q
|
sonixj 0458:7025 Genius Eye 311Q
|
||||||
|
sn9c20x 0458:7029 Genius Look 320s
|
||||||
sonixj 0458:702e Genius Slim 310 NB
|
sonixj 0458:702e Genius Slim 310 NB
|
||||||
|
sn9c20x 045e:00f4 LifeCam VX-6000 (SN9C20x + OV9650)
|
||||||
sonixj 045e:00f5 MicroSoft VX3000
|
sonixj 045e:00f5 MicroSoft VX3000
|
||||||
sonixj 045e:00f7 MicroSoft VX1000
|
sonixj 045e:00f7 MicroSoft VX1000
|
||||||
ov519 045e:028c Micro$oft xbox cam
|
ov519 045e:028c Micro$oft xbox cam
|
||||||
|
@ -282,6 +284,28 @@ sonixj 0c45:613a Microdia Sonix PC Camera
|
||||||
sonixj 0c45:613b Surfer SN-206
|
sonixj 0c45:613b Surfer SN-206
|
||||||
sonixj 0c45:613c Sonix Pccam168
|
sonixj 0c45:613c Sonix Pccam168
|
||||||
sonixj 0c45:6143 Sonix Pccam168
|
sonixj 0c45:6143 Sonix Pccam168
|
||||||
|
sn9c20x 0c45:6240 PC Camera (SN9C201 + MT9M001)
|
||||||
|
sn9c20x 0c45:6242 PC Camera (SN9C201 + MT9M111)
|
||||||
|
sn9c20x 0c45:6248 PC Camera (SN9C201 + OV9655)
|
||||||
|
sn9c20x 0c45:624e PC Camera (SN9C201 + SOI968)
|
||||||
|
sn9c20x 0c45:624f PC Camera (SN9C201 + OV9650)
|
||||||
|
sn9c20x 0c45:6251 PC Camera (SN9C201 + OV9650)
|
||||||
|
sn9c20x 0c45:6253 PC Camera (SN9C201 + OV9650)
|
||||||
|
sn9c20x 0c45:6260 PC Camera (SN9C201 + OV7670)
|
||||||
|
sn9c20x 0c45:6270 PC Camera (SN9C201 + MT9V011/MT9V111/MT9V112)
|
||||||
|
sn9c20x 0c45:627b PC Camera (SN9C201 + OV7660)
|
||||||
|
sn9c20x 0c45:627c PC Camera (SN9C201 + HV7131R)
|
||||||
|
sn9c20x 0c45:627f PC Camera (SN9C201 + OV9650)
|
||||||
|
sn9c20x 0c45:6280 PC Camera (SN9C202 + MT9M001)
|
||||||
|
sn9c20x 0c45:6282 PC Camera (SN9C202 + MT9M111)
|
||||||
|
sn9c20x 0c45:6288 PC Camera (SN9C202 + OV9655)
|
||||||
|
sn9c20x 0c45:628e PC Camera (SN9C202 + SOI968)
|
||||||
|
sn9c20x 0c45:628f PC Camera (SN9C202 + OV9650)
|
||||||
|
sn9c20x 0c45:62a0 PC Camera (SN9C202 + OV7670)
|
||||||
|
sn9c20x 0c45:62b0 PC Camera (SN9C202 + MT9V011/MT9V111/MT9V112)
|
||||||
|
sn9c20x 0c45:62b3 PC Camera (SN9C202 + OV9655)
|
||||||
|
sn9c20x 0c45:62bb PC Camera (SN9C202 + OV7660)
|
||||||
|
sn9c20x 0c45:62bc PC Camera (SN9C202 + HV7131R)
|
||||||
sunplus 0d64:0303 Sunplus FashionCam DXG
|
sunplus 0d64:0303 Sunplus FashionCam DXG
|
||||||
etoms 102c:6151 Qcam Sangha CIF
|
etoms 102c:6151 Qcam Sangha CIF
|
||||||
etoms 102c:6251 Qcam xxxxxx VGA
|
etoms 102c:6251 Qcam xxxxxx VGA
|
||||||
|
@ -290,6 +314,7 @@ spca561 10fd:7e50 FlyCam Usb 100
|
||||||
zc3xx 10fd:8050 Typhoon Webshot II USB 300k
|
zc3xx 10fd:8050 Typhoon Webshot II USB 300k
|
||||||
ov534 1415:2000 Sony HD Eye for PS3 (SLEH 00201)
|
ov534 1415:2000 Sony HD Eye for PS3 (SLEH 00201)
|
||||||
pac207 145f:013a Trust WB-1300N
|
pac207 145f:013a Trust WB-1300N
|
||||||
|
sn9c20x 145f:013d Trust WB-3600R
|
||||||
vc032x 15b8:6001 HP 2.0 Megapixel
|
vc032x 15b8:6001 HP 2.0 Megapixel
|
||||||
vc032x 15b8:6002 HP 2.0 Megapixel rz406aa
|
vc032x 15b8:6002 HP 2.0 Megapixel rz406aa
|
||||||
spca501 1776:501c Arowana 300K CMOS Camera
|
spca501 1776:501c Arowana 300K CMOS Camera
|
||||||
|
@ -300,4 +325,11 @@ spca500 2899:012c Toptro Industrial
|
||||||
spca508 8086:0110 Intel Easy PC Camera
|
spca508 8086:0110 Intel Easy PC Camera
|
||||||
spca500 8086:0630 Intel Pocket PC Camera
|
spca500 8086:0630 Intel Pocket PC Camera
|
||||||
spca506 99fa:8988 Grandtec V.cap
|
spca506 99fa:8988 Grandtec V.cap
|
||||||
|
sn9c20x a168:0610 Dino-Lite Digital Microscope (SN9C201 + HV7131R)
|
||||||
|
sn9c20x a168:0611 Dino-Lite Digital Microscope (SN9C201 + HV7131R)
|
||||||
|
sn9c20x a168:0613 Dino-Lite Digital Microscope (SN9C201 + HV7131R)
|
||||||
|
sn9c20x a168:0618 Dino-Lite Digital Microscope (SN9C201 + HV7131R)
|
||||||
|
sn9c20x a168:0614 Dino-Lite Digital Microscope (SN9C201 + MT9M111)
|
||||||
|
sn9c20x a168:0615 Dino-Lite Digital Microscope (SN9C201 + MT9M111)
|
||||||
|
sn9c20x a168:0617 Dino-Lite Digital Microscope (SN9C201 + MT9M111)
|
||||||
spca561 abcd:cdee Petcam
|
spca561 abcd:cdee Petcam
|
||||||
|
|
11
MAINTAINERS
11
MAINTAINERS
|
@ -150,7 +150,7 @@ F: drivers/scsi/53c700*
|
||||||
|
|
||||||
6PACK NETWORK DRIVER FOR AX.25
|
6PACK NETWORK DRIVER FOR AX.25
|
||||||
P: Andreas Koensgen
|
P: Andreas Koensgen
|
||||||
M: ajk@iehk.rwth-aachen.de
|
M: ajk@comnets.uni-bremen.de
|
||||||
L: linux-hams@vger.kernel.org
|
L: linux-hams@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/net/hamradio/6pack.c
|
F: drivers/net/hamradio/6pack.c
|
||||||
|
@ -1612,6 +1612,13 @@ S: Supported
|
||||||
F: fs/configfs/
|
F: fs/configfs/
|
||||||
F: include/linux/configfs.h
|
F: include/linux/configfs.h
|
||||||
|
|
||||||
|
CONNECTOR
|
||||||
|
P: Evgeniy Polyakov
|
||||||
|
M: zbr@ioremap.net
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/connector/
|
||||||
|
|
||||||
CONTROL GROUPS (CGROUPS)
|
CONTROL GROUPS (CGROUPS)
|
||||||
P: Paul Menage
|
P: Paul Menage
|
||||||
M: menage@google.com
|
M: menage@google.com
|
||||||
|
@ -4089,6 +4096,7 @@ L: netfilter@vger.kernel.org
|
||||||
L: coreteam@netfilter.org
|
L: coreteam@netfilter.org
|
||||||
W: http://www.netfilter.org/
|
W: http://www.netfilter.org/
|
||||||
W: http://www.iptables.org/
|
W: http://www.iptables.org/
|
||||||
|
T: git://git.kernel.org/pub/scm/linux/kernel/git/kaber/nf-2.6.git
|
||||||
S: Supported
|
S: Supported
|
||||||
F: include/linux/netfilter*
|
F: include/linux/netfilter*
|
||||||
F: include/linux/netfilter/
|
F: include/linux/netfilter/
|
||||||
|
@ -5586,7 +5594,6 @@ S: Odd Fixes
|
||||||
F: drivers/net/starfire*
|
F: drivers/net/starfire*
|
||||||
|
|
||||||
STARMODE RADIO IP (STRIP) PROTOCOL DRIVER
|
STARMODE RADIO IP (STRIP) PROTOCOL DRIVER
|
||||||
W: http://mosquitonet.Stanford.EDU/strip.html
|
|
||||||
S: Orphan
|
S: Orphan
|
||||||
F: drivers/net/wireless/strip.c
|
F: drivers/net/wireless/strip.c
|
||||||
F: include/linux/if_strip.h
|
F: include/linux/if_strip.h
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 31
|
SUBLEVEL = 31
|
||||||
EXTRAVERSION = -rc3
|
EXTRAVERSION = -rc4
|
||||||
NAME = Man-Eating Seals of Antiquity
|
NAME = Man-Eating Seals of Antiquity
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
#include <asm-generic/tlb.h>
|
#include <asm-generic/tlb.h>
|
||||||
|
|
||||||
#define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, pte)
|
#define __pte_free_tlb(tlb, pte, address) pte_free((tlb)->mm, pte)
|
||||||
#define __pmd_free_tlb(tlb, pmd) pmd_free((tlb)->mm, pmd)
|
#define __pmd_free_tlb(tlb, pmd, address) pmd_free((tlb)->mm, pmd)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -102,8 +102,8 @@ tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define tlb_remove_page(tlb,page) free_page_and_swap_cache(page)
|
#define tlb_remove_page(tlb,page) free_page_and_swap_cache(page)
|
||||||
#define pte_free_tlb(tlb, ptep) pte_free((tlb)->mm, ptep)
|
#define pte_free_tlb(tlb, ptep, addr) pte_free((tlb)->mm, ptep)
|
||||||
#define pmd_free_tlb(tlb, pmdp) pmd_free((tlb)->mm, pmdp)
|
#define pmd_free_tlb(tlb, pmdp, addr) pmd_free((tlb)->mm, pmdp)
|
||||||
|
|
||||||
#define tlb_migrate_finish(mm) do { } while (0)
|
#define tlb_migrate_finish(mm) do { } while (0)
|
||||||
|
|
||||||
|
|
|
@ -83,7 +83,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
|
||||||
quicklist_free_page(QUICK_PT, NULL, pte);
|
quicklist_free_page(QUICK_PT, NULL, pte);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __pte_free_tlb(tlb,pte) \
|
#define __pte_free_tlb(tlb,pte,addr) \
|
||||||
do { \
|
do { \
|
||||||
pgtable_page_dtor(pte); \
|
pgtable_page_dtor(pte); \
|
||||||
tlb_remove_page((tlb), pte); \
|
tlb_remove_page((tlb), pte); \
|
||||||
|
|
|
@ -47,7 +47,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
|
||||||
__free_page(pte);
|
__free_page(pte);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __pte_free_tlb(tlb,pte) \
|
#define __pte_free_tlb(tlb,pte,address) \
|
||||||
do { \
|
do { \
|
||||||
pgtable_page_dtor(pte); \
|
pgtable_page_dtor(pte); \
|
||||||
tlb_remove_page((tlb), pte); \
|
tlb_remove_page((tlb), pte); \
|
||||||
|
|
|
@ -49,7 +49,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
|
||||||
__free_page(pte);
|
__free_page(pte);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __pte_free_tlb(tlb,pte) \
|
#define __pte_free_tlb(tlb,pte,address) \
|
||||||
do { \
|
do { \
|
||||||
pgtable_page_dtor(pte); \
|
pgtable_page_dtor(pte); \
|
||||||
tlb_remove_page((tlb),(pte)); \
|
tlb_remove_page((tlb),(pte)); \
|
||||||
|
@ -62,7 +62,7 @@ do { \
|
||||||
*/
|
*/
|
||||||
#define pmd_alloc_one(mm, addr) ({ BUG(); ((pmd_t *) 2); })
|
#define pmd_alloc_one(mm, addr) ({ BUG(); ((pmd_t *) 2); })
|
||||||
#define pmd_free(mm, x) do { } while (0)
|
#define pmd_free(mm, x) do { } while (0)
|
||||||
#define __pmd_free_tlb(tlb,x) do { } while (0)
|
#define __pmd_free_tlb(tlb,x,a) do { } while (0)
|
||||||
|
|
||||||
#endif /* CONFIG_MMU */
|
#endif /* CONFIG_MMU */
|
||||||
|
|
||||||
|
|
|
@ -225,7 +225,7 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address)
|
||||||
*/
|
*/
|
||||||
#define pud_alloc_one(mm, address) NULL
|
#define pud_alloc_one(mm, address) NULL
|
||||||
#define pud_free(mm, x) do { } while (0)
|
#define pud_free(mm, x) do { } while (0)
|
||||||
#define __pud_free_tlb(tlb, x) do { } while (0)
|
#define __pud_free_tlb(tlb, x, address) do { } while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The "pud_xxx()" functions here are trivial for a folded two-level
|
* The "pud_xxx()" functions here are trivial for a folded two-level
|
||||||
|
|
|
@ -48,7 +48,7 @@ static inline void pud_free(struct mm_struct *mm, pud_t *pud)
|
||||||
{
|
{
|
||||||
quicklist_free(0, NULL, pud);
|
quicklist_free(0, NULL, pud);
|
||||||
}
|
}
|
||||||
#define __pud_free_tlb(tlb, pud) pud_free((tlb)->mm, pud)
|
#define __pud_free_tlb(tlb, pud, address) pud_free((tlb)->mm, pud)
|
||||||
#endif /* CONFIG_PGTABLE_4 */
|
#endif /* CONFIG_PGTABLE_4 */
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@ -67,7 +67,7 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
|
||||||
quicklist_free(0, NULL, pmd);
|
quicklist_free(0, NULL, pmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __pmd_free_tlb(tlb, pmd) pmd_free((tlb)->mm, pmd)
|
#define __pmd_free_tlb(tlb, pmd, address) pmd_free((tlb)->mm, pmd)
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
pmd_populate(struct mm_struct *mm, pmd_t * pmd_entry, pgtable_t pte)
|
pmd_populate(struct mm_struct *mm, pmd_t * pmd_entry, pgtable_t pte)
|
||||||
|
@ -117,6 +117,6 @@ static inline void check_pgt_cache(void)
|
||||||
quicklist_trim(0, NULL, 25, 16);
|
quicklist_trim(0, NULL, 25, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, pte)
|
#define __pte_free_tlb(tlb, pte, address) pte_free((tlb)->mm, pte)
|
||||||
|
|
||||||
#endif /* _ASM_IA64_PGALLOC_H */
|
#endif /* _ASM_IA64_PGALLOC_H */
|
||||||
|
|
|
@ -236,22 +236,22 @@ do { \
|
||||||
__tlb_remove_tlb_entry(tlb, ptep, addr); \
|
__tlb_remove_tlb_entry(tlb, ptep, addr); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define pte_free_tlb(tlb, ptep) \
|
#define pte_free_tlb(tlb, ptep, address) \
|
||||||
do { \
|
do { \
|
||||||
tlb->need_flush = 1; \
|
tlb->need_flush = 1; \
|
||||||
__pte_free_tlb(tlb, ptep); \
|
__pte_free_tlb(tlb, ptep, address); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define pmd_free_tlb(tlb, ptep) \
|
#define pmd_free_tlb(tlb, ptep, address) \
|
||||||
do { \
|
do { \
|
||||||
tlb->need_flush = 1; \
|
tlb->need_flush = 1; \
|
||||||
__pmd_free_tlb(tlb, ptep); \
|
__pmd_free_tlb(tlb, ptep, address); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define pud_free_tlb(tlb, pudp) \
|
#define pud_free_tlb(tlb, pudp, address) \
|
||||||
do { \
|
do { \
|
||||||
tlb->need_flush = 1; \
|
tlb->need_flush = 1; \
|
||||||
__pud_free_tlb(tlb, pudp); \
|
__pud_free_tlb(tlb, pudp, address); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#endif /* _ASM_IA64_TLB_H */
|
#endif /* _ASM_IA64_TLB_H */
|
||||||
|
|
|
@ -58,7 +58,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
|
||||||
__free_page(pte);
|
__free_page(pte);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, (pte))
|
#define __pte_free_tlb(tlb, pte, addr) pte_free((tlb)->mm, (pte))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* allocating and freeing a pmd is trivial: the 1-entry pmd is
|
* allocating and freeing a pmd is trivial: the 1-entry pmd is
|
||||||
|
@ -68,7 +68,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
|
||||||
|
|
||||||
#define pmd_alloc_one(mm, addr) ({ BUG(); ((pmd_t *)2); })
|
#define pmd_alloc_one(mm, addr) ({ BUG(); ((pmd_t *)2); })
|
||||||
#define pmd_free(mm, x) do { } while (0)
|
#define pmd_free(mm, x) do { } while (0)
|
||||||
#define __pmd_free_tlb(tlb, x) do { } while (0)
|
#define __pmd_free_tlb(tlb, x, addr) do { } while (0)
|
||||||
#define pgd_populate(mm, pmd, pte) BUG()
|
#define pgd_populate(mm, pmd, pte) BUG()
|
||||||
|
|
||||||
#define check_pgt_cache() do { } while (0)
|
#define check_pgt_cache() do { } while (0)
|
||||||
|
|
|
@ -54,7 +54,8 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t page)
|
||||||
__free_page(page);
|
__free_page(page);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t page)
|
static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t page,
|
||||||
|
unsigned long address)
|
||||||
{
|
{
|
||||||
pgtable_page_dtor(page);
|
pgtable_page_dtor(page);
|
||||||
cache_page(kmap(page));
|
cache_page(kmap(page));
|
||||||
|
@ -73,7 +74,8 @@ static inline int pmd_free(struct mm_struct *mm, pmd_t *pmd)
|
||||||
return free_pointer_table(pmd);
|
return free_pointer_table(pmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd)
|
static inline int __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
|
||||||
|
unsigned long address)
|
||||||
{
|
{
|
||||||
return free_pointer_table(pmd);
|
return free_pointer_table(pmd);
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t page)
|
||||||
__free_page(page);
|
__free_page(page);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __pte_free_tlb(tlb,pte) \
|
#define __pte_free_tlb(tlb,pte,addr) \
|
||||||
do { \
|
do { \
|
||||||
pgtable_page_dtor(pte); \
|
pgtable_page_dtor(pte); \
|
||||||
tlb_remove_page((tlb), pte); \
|
tlb_remove_page((tlb), pte); \
|
||||||
|
@ -80,7 +80,7 @@ static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, pgtable_t page
|
||||||
* inside the pgd, so has no extra memory associated with it.
|
* inside the pgd, so has no extra memory associated with it.
|
||||||
*/
|
*/
|
||||||
#define pmd_free(mm, x) do { } while (0)
|
#define pmd_free(mm, x) do { } while (0)
|
||||||
#define __pmd_free_tlb(tlb, x) do { } while (0)
|
#define __pmd_free_tlb(tlb, x, addr) do { } while (0)
|
||||||
|
|
||||||
static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
|
static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
|
||||||
{
|
{
|
||||||
|
|
|
@ -6,14 +6,16 @@ endif
|
||||||
|
|
||||||
# What CPU vesion are we building for, and crack it open
|
# What CPU vesion are we building for, and crack it open
|
||||||
# as major.minor.rev
|
# as major.minor.rev
|
||||||
CPU_VER=$(subst ",,$(CONFIG_XILINX_MICROBLAZE0_HW_VER) )
|
CPU_VER := $(shell echo $(CONFIG_XILINX_MICROBLAZE0_HW_VER))
|
||||||
CPU_MAJOR=$(shell echo $(CPU_VER) | cut -d '.' -f 1)
|
CPU_MAJOR := $(shell echo $(CPU_VER) | cut -d '.' -f 1)
|
||||||
CPU_MINOR=$(shell echo $(CPU_VER) | cut -d '.' -f 2)
|
CPU_MINOR := $(shell echo $(CPU_VER) | cut -d '.' -f 2)
|
||||||
CPU_REV=$(shell echo $(CPU_VER) | cut -d '.' -f 3)
|
CPU_REV := $(shell echo $(CPU_VER) | cut -d '.' -f 3)
|
||||||
|
|
||||||
export CPU_VER CPU_MAJOR CPU_MINOR CPU_REV
|
export CPU_VER CPU_MAJOR CPU_MINOR CPU_REV
|
||||||
|
|
||||||
# Use cpu-related CONFIG_ vars to set compile options.
|
# Use cpu-related CONFIG_ vars to set compile options.
|
||||||
|
# The various CONFIG_XILINX cpu features options are integers 0/1/2...
|
||||||
|
# rather than bools y/n
|
||||||
|
|
||||||
# Work out HW multipler support. This is icky.
|
# Work out HW multipler support. This is icky.
|
||||||
# 1. Spartan2 has no HW multiplers.
|
# 1. Spartan2 has no HW multiplers.
|
||||||
|
@ -34,30 +36,29 @@ CPUFLAGS-$(CONFIG_XILINX_MICROBLAZE0_USE_PCMP_INSTR) += -mxl-pattern-compare
|
||||||
|
|
||||||
CPUFLAGS-1 += $(call cc-option,-mcpu=v$(CPU_VER))
|
CPUFLAGS-1 += $(call cc-option,-mcpu=v$(CPU_VER))
|
||||||
|
|
||||||
# The various CONFIG_XILINX cpu features options are integers 0/1/2...
|
|
||||||
# rather than bools y/n
|
|
||||||
|
|
||||||
# r31 holds current when in kernel mode
|
# r31 holds current when in kernel mode
|
||||||
CFLAGS_KERNEL += -ffixed-r31 $(CPUFLAGS-1) $(CPUFLAGS-2)
|
KBUILD_KERNEL += -ffixed-r31 $(CPUFLAGS-1) $(CPUFLAGS-2)
|
||||||
|
|
||||||
LDFLAGS :=
|
LDFLAGS :=
|
||||||
LDFLAGS_vmlinux :=
|
LDFLAGS_vmlinux :=
|
||||||
LDFLAGS_BLOB := --format binary --oformat elf32-microblaze
|
|
||||||
|
|
||||||
LIBGCC := $(shell $(CC) $(CFLAGS_KERNEL) -print-libgcc-file-name)
|
LIBGCC := $(shell $(CC) $(KBUILD_KERNEL) -print-libgcc-file-name)
|
||||||
|
|
||||||
head-y := arch/microblaze/kernel/head.o
|
head-y := arch/microblaze/kernel/head.o
|
||||||
libs-y += arch/microblaze/lib/ $(LIBGCC)
|
libs-y += arch/microblaze/lib/
|
||||||
core-y += arch/microblaze/kernel/ arch/microblaze/mm/ \
|
libs-y += $(LIBGCC)
|
||||||
arch/microblaze/platform/
|
core-y += arch/microblaze/kernel/
|
||||||
|
core-y += arch/microblaze/mm/
|
||||||
|
core-y += arch/microblaze/platform/
|
||||||
|
|
||||||
boot := arch/$(ARCH)/boot
|
boot := arch/microblaze/boot
|
||||||
|
|
||||||
# defines filename extension depending memory management type
|
# defines filename extension depending memory management type
|
||||||
ifeq ($(CONFIG_MMU),)
|
ifeq ($(CONFIG_MMU),)
|
||||||
MMUEXT := -nommu
|
MMU := -nommu
|
||||||
endif
|
endif
|
||||||
export MMUEXT
|
|
||||||
|
export MMU
|
||||||
|
|
||||||
all: linux.bin
|
all: linux.bin
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
#include <asm/byteorder.h>
|
#include <asm/byteorder.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <asm/byteorder.h>
|
|
||||||
#include <linux/mm.h> /* Get struct page {...} */
|
#include <linux/mm.h> /* Get struct page {...} */
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -180,7 +180,7 @@ extern inline void pte_free(struct mm_struct *mm, struct page *ptepage)
|
||||||
__free_page(ptepage);
|
__free_page(ptepage);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, (pte))
|
#define __pte_free_tlb(tlb, pte, addr) pte_free((tlb)->mm, (pte))
|
||||||
|
|
||||||
#define pmd_populate(mm, pmd, pte) (pmd_val(*(pmd)) = page_address(pte))
|
#define pmd_populate(mm, pmd, pte) (pmd_val(*(pmd)) = page_address(pte))
|
||||||
|
|
||||||
|
@ -193,7 +193,7 @@ extern inline void pte_free(struct mm_struct *mm, struct page *ptepage)
|
||||||
*/
|
*/
|
||||||
#define pmd_alloc_one(mm, address) ({ BUG(); ((pmd_t *)2); })
|
#define pmd_alloc_one(mm, address) ({ BUG(); ((pmd_t *)2); })
|
||||||
/*#define pmd_free(mm, x) do { } while (0)*/
|
/*#define pmd_free(mm, x) do { } while (0)*/
|
||||||
#define __pmd_free_tlb(tlb, x) do { } while (0)
|
#define __pmd_free_tlb(tlb, x, addr) do { } while (0)
|
||||||
#define pgd_populate(mm, pmd, pte) BUG()
|
#define pgd_populate(mm, pmd, pte) BUG()
|
||||||
|
|
||||||
extern int do_check_pgt_cache(int, int);
|
extern int do_check_pgt_cache(int, int);
|
||||||
|
|
|
@ -185,6 +185,7 @@ static inline pte_t pte_mkspecial(pte_t pte) { return pte; }
|
||||||
|
|
||||||
/* Definitions for MicroBlaze. */
|
/* Definitions for MicroBlaze. */
|
||||||
#define _PAGE_GUARDED 0x001 /* G: page is guarded from prefetch */
|
#define _PAGE_GUARDED 0x001 /* G: page is guarded from prefetch */
|
||||||
|
#define _PAGE_FILE 0x001 /* when !present: nonlinear file mapping */
|
||||||
#define _PAGE_PRESENT 0x002 /* software: PTE contains a translation */
|
#define _PAGE_PRESENT 0x002 /* software: PTE contains a translation */
|
||||||
#define _PAGE_NO_CACHE 0x004 /* I: caching is inhibited */
|
#define _PAGE_NO_CACHE 0x004 /* I: caching is inhibited */
|
||||||
#define _PAGE_WRITETHRU 0x008 /* W: caching is write-through */
|
#define _PAGE_WRITETHRU 0x008 /* W: caching is write-through */
|
||||||
|
@ -320,8 +321,7 @@ static inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_RW; }
|
||||||
static inline int pte_exec(pte_t pte) { return pte_val(pte) & _PAGE_EXEC; }
|
static inline int pte_exec(pte_t pte) { return pte_val(pte) & _PAGE_EXEC; }
|
||||||
static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; }
|
static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; }
|
||||||
static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; }
|
static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; }
|
||||||
/* FIXME */
|
static inline int pte_file(pte_t pte) { return pte_val(pte) & _PAGE_FILE; }
|
||||||
static inline int pte_file(pte_t pte) { return 0; }
|
|
||||||
|
|
||||||
static inline void pte_uncache(pte_t pte) { pte_val(pte) |= _PAGE_NO_CACHE; }
|
static inline void pte_uncache(pte_t pte) { pte_val(pte) |= _PAGE_NO_CACHE; }
|
||||||
static inline void pte_cache(pte_t pte) { pte_val(pte) &= ~_PAGE_NO_CACHE; }
|
static inline void pte_cache(pte_t pte) { pte_val(pte) &= ~_PAGE_NO_CACHE; }
|
||||||
|
@ -488,7 +488,7 @@ static inline pmd_t *pmd_offset(pgd_t *dir, unsigned long address)
|
||||||
/* Encode and decode a nonlinear file mapping entry */
|
/* Encode and decode a nonlinear file mapping entry */
|
||||||
#define PTE_FILE_MAX_BITS 29
|
#define PTE_FILE_MAX_BITS 29
|
||||||
#define pte_to_pgoff(pte) (pte_val(pte) >> 3)
|
#define pte_to_pgoff(pte) (pte_val(pte) >> 3)
|
||||||
#define pgoff_to_pte(off) ((pte_t) { ((off) << 3) })
|
#define pgoff_to_pte(off) ((pte_t) { ((off) << 3) | _PAGE_FILE })
|
||||||
|
|
||||||
extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
|
extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,18 @@
|
||||||
#define _ASM_MICROBLAZE_PROM_H
|
#define _ASM_MICROBLAZE_PROM_H
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
|
/* Definitions used by the flattened device tree */
|
||||||
|
#define OF_DT_HEADER 0xd00dfeed /* marker */
|
||||||
|
#define OF_DT_BEGIN_NODE 0x1 /* Start of node, full name */
|
||||||
|
#define OF_DT_END_NODE 0x2 /* End node */
|
||||||
|
#define OF_DT_PROP 0x3 /* Property: name off, size, content */
|
||||||
|
#define OF_DT_NOP 0x4 /* nop */
|
||||||
|
#define OF_DT_END 0x9
|
||||||
|
|
||||||
|
#define OF_DT_VERSION 0x10
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/proc_fs.h>
|
#include <linux/proc_fs.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
@ -29,16 +41,6 @@
|
||||||
#define of_prop_cmp(s1, s2) strcmp((s1), (s2))
|
#define of_prop_cmp(s1, s2) strcmp((s1), (s2))
|
||||||
#define of_node_cmp(s1, s2) strcasecmp((s1), (s2))
|
#define of_node_cmp(s1, s2) strcasecmp((s1), (s2))
|
||||||
|
|
||||||
/* Definitions used by the flattened device tree */
|
|
||||||
#define OF_DT_HEADER 0xd00dfeed /* marker */
|
|
||||||
#define OF_DT_BEGIN_NODE 0x1 /* Start of node, full name */
|
|
||||||
#define OF_DT_END_NODE 0x2 /* End node */
|
|
||||||
#define OF_DT_PROP 0x3 /* Property: name off, size, content */
|
|
||||||
#define OF_DT_NOP 0x4 /* nop */
|
|
||||||
#define OF_DT_END 0x9
|
|
||||||
|
|
||||||
#define OF_DT_VERSION 0x10
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is what gets passed to the kernel by prom_init or kexec
|
* This is what gets passed to the kernel by prom_init or kexec
|
||||||
*
|
*
|
||||||
|
@ -309,5 +311,6 @@ extern void __iomem *of_iomap(struct device_node *device, int index);
|
||||||
*/
|
*/
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
|
|
||||||
|
#endif /* __ASSEMBLY__ */
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
#endif /* _ASM_MICROBLAZE_PROM_H */
|
#endif /* _ASM_MICROBLAZE_PROM_H */
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
#ifndef _ASM_MICROBLAZE_TLB_H
|
#ifndef _ASM_MICROBLAZE_TLB_H
|
||||||
#define _ASM_MICROBLAZE_TLB_H
|
#define _ASM_MICROBLAZE_TLB_H
|
||||||
|
|
||||||
#define tlb_flush(tlb) do {} while (0)
|
#define tlb_flush(tlb) flush_tlb_mm((tlb)->mm)
|
||||||
|
|
||||||
#include <asm-generic/tlb.h>
|
#include <asm-generic/tlb.h>
|
||||||
|
|
||||||
|
|
|
@ -189,7 +189,7 @@ extern long strnlen_user(const char *src, long count);
|
||||||
|
|
||||||
#define __put_user(x, ptr) \
|
#define __put_user(x, ptr) \
|
||||||
({ \
|
({ \
|
||||||
__typeof__(*(ptr)) __gu_val = x; \
|
__typeof__(*(ptr)) volatile __gu_val = (x); \
|
||||||
long __gu_err = 0; \
|
long __gu_err = 0; \
|
||||||
switch (sizeof(__gu_val)) { \
|
switch (sizeof(__gu_val)) { \
|
||||||
case 1: \
|
case 1: \
|
||||||
|
|
|
@ -17,4 +17,4 @@ obj-$(CONFIG_HEART_BEAT) += heartbeat.o
|
||||||
obj-$(CONFIG_MODULES) += microblaze_ksyms.o module.o
|
obj-$(CONFIG_MODULES) += microblaze_ksyms.o module.o
|
||||||
obj-$(CONFIG_MMU) += misc.o
|
obj-$(CONFIG_MMU) += misc.o
|
||||||
|
|
||||||
obj-y += entry$(MMUEXT).o
|
obj-y += entry$(MMU).o
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
|
|
||||||
#define CI(c, p) { ci->c = PVR_##p(pvr); }
|
#define CI(c, p) { ci->c = PVR_##p(pvr); }
|
||||||
#define err_printk(x) \
|
#define err_printk(x) \
|
||||||
early_printk("ERROR: Microblaze " x " - different for PVR and DTS\n");
|
early_printk("ERROR: Microblaze " x "-different for PVR and DTS\n");
|
||||||
|
|
||||||
void set_cpuinfo_pvr_full(struct cpuinfo *ci, struct device_node *cpu)
|
void set_cpuinfo_pvr_full(struct cpuinfo *ci, struct device_node *cpu)
|
||||||
{
|
{
|
||||||
|
|
|
@ -18,7 +18,7 @@ static const char family_string[] = CONFIG_XILINX_MICROBLAZE0_FAMILY;
|
||||||
static const char cpu_ver_string[] = CONFIG_XILINX_MICROBLAZE0_HW_VER;
|
static const char cpu_ver_string[] = CONFIG_XILINX_MICROBLAZE0_HW_VER;
|
||||||
|
|
||||||
#define err_printk(x) \
|
#define err_printk(x) \
|
||||||
early_printk("ERROR: Microblaze " x "- different for kernel and DTS\n");
|
early_printk("ERROR: Microblaze " x "-different for kernel and DTS\n");
|
||||||
|
|
||||||
void __init set_cpuinfo_static(struct cpuinfo *ci, struct device_node *cpu)
|
void __init set_cpuinfo_static(struct cpuinfo *ci, struct device_node *cpu)
|
||||||
{
|
{
|
||||||
|
|
|
@ -26,6 +26,8 @@ const struct cpu_ver_key cpu_ver_lookup[] = {
|
||||||
{"7.10.b", 0x09},
|
{"7.10.b", 0x09},
|
||||||
{"7.10.c", 0x0a},
|
{"7.10.c", 0x0a},
|
||||||
{"7.10.d", 0x0b},
|
{"7.10.d", 0x0b},
|
||||||
|
{"7.20.a", 0x0c},
|
||||||
|
{"7.20.b", 0x0d},
|
||||||
/* FIXME There is no keycode defined in MBV for these versions */
|
/* FIXME There is no keycode defined in MBV for these versions */
|
||||||
{"2.10.a", 0x10},
|
{"2.10.a", 0x10},
|
||||||
{"3.00.a", 0x20},
|
{"3.00.a", 0x20},
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <asm/thread_info.h>
|
#include <asm/thread_info.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
#include <asm/prom.h> /* for OF_DT_HEADER */
|
||||||
|
|
||||||
#ifdef CONFIG_MMU
|
#ifdef CONFIG_MMU
|
||||||
#include <asm/setup.h> /* COMMAND_LINE_SIZE */
|
#include <asm/setup.h> /* COMMAND_LINE_SIZE */
|
||||||
|
@ -54,11 +55,19 @@ ENTRY(_start)
|
||||||
andi r1, r1, ~2
|
andi r1, r1, ~2
|
||||||
mts rmsr, r1
|
mts rmsr, r1
|
||||||
|
|
||||||
/* save fdt to kernel location */
|
/* r7 may point to an FDT, or there may be one linked in.
|
||||||
/* r7 stores pointer to fdt blob */
|
if it's in r7, we've got to save it away ASAP.
|
||||||
beqi r7, no_fdt_arg
|
We ensure r7 points to a valid FDT, just in case the bootloader
|
||||||
|
is broken or non-existent */
|
||||||
|
beqi r7, no_fdt_arg /* NULL pointer? don't copy */
|
||||||
|
lw r11, r0, r7 /* Does r7 point to a */
|
||||||
|
rsubi r11, r11, OF_DT_HEADER /* valid FDT? */
|
||||||
|
beqi r11, _prepare_copy_fdt
|
||||||
|
or r7, r0, r0 /* clear R7 when not valid DTB */
|
||||||
|
bnei r11, no_fdt_arg /* No - get out of here */
|
||||||
|
_prepare_copy_fdt:
|
||||||
or r11, r0, r0 /* incremment */
|
or r11, r0, r0 /* incremment */
|
||||||
ori r4, r0, TOPHYS(_fdt_start) /* save bram context */
|
ori r4, r0, TOPHYS(_fdt_start)
|
||||||
ori r3, r0, (0x4000 - 4)
|
ori r3, r0, (0x4000 - 4)
|
||||||
_copy_fdt:
|
_copy_fdt:
|
||||||
lw r12, r7, r11 /* r12 = r7 + r11 */
|
lw r12, r7, r11 /* r12 = r7 + r11 */
|
||||||
|
|
|
@ -74,6 +74,7 @@
|
||||||
|
|
||||||
#include <asm/mmu.h>
|
#include <asm/mmu.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
|
#include <asm/signal.h>
|
||||||
#include <asm/asm-offsets.h>
|
#include <asm/asm-offsets.h>
|
||||||
|
|
||||||
/* Helpful Macros */
|
/* Helpful Macros */
|
||||||
|
@ -428,19 +429,9 @@ handle_unaligned_ex:
|
||||||
mfs r17, rbtr; /* ESR[DS] set - return address in BTR */
|
mfs r17, rbtr; /* ESR[DS] set - return address in BTR */
|
||||||
nop
|
nop
|
||||||
_no_delayslot:
|
_no_delayslot:
|
||||||
#endif
|
/* jump to high level unaligned handler */
|
||||||
|
RESTORE_STATE;
|
||||||
#ifdef CONFIG_MMU
|
bri unaligned_data_trap
|
||||||
/* Check if unaligned address is last on a 4k page */
|
|
||||||
andi r5, r4, 0xffc
|
|
||||||
xori r5, r5, 0xffc
|
|
||||||
bnei r5, _unaligned_ex2
|
|
||||||
_unaligned_ex1:
|
|
||||||
RESTORE_STATE;
|
|
||||||
/* Another page must be accessed or physical address not in page table */
|
|
||||||
bri unaligned_data_trap
|
|
||||||
|
|
||||||
_unaligned_ex2:
|
|
||||||
#endif
|
#endif
|
||||||
andi r6, r3, 0x3E0; /* Mask and extract the register operand */
|
andi r6, r3, 0x3E0; /* Mask and extract the register operand */
|
||||||
srl r6, r6; /* r6 >> 5 */
|
srl r6, r6; /* r6 >> 5 */
|
||||||
|
@ -450,45 +441,6 @@ _no_delayslot:
|
||||||
srl r6, r6;
|
srl r6, r6;
|
||||||
/* Store the register operand in a temporary location */
|
/* Store the register operand in a temporary location */
|
||||||
sbi r6, r0, TOPHYS(ex_reg_op);
|
sbi r6, r0, TOPHYS(ex_reg_op);
|
||||||
#ifdef CONFIG_MMU
|
|
||||||
/* Get physical address */
|
|
||||||
/* If we are faulting a kernel address, we have to use the
|
|
||||||
* kernel page tables.
|
|
||||||
*/
|
|
||||||
ori r5, r0, CONFIG_KERNEL_START
|
|
||||||
cmpu r5, r4, r5
|
|
||||||
bgti r5, _unaligned_ex3
|
|
||||||
ori r5, r0, swapper_pg_dir
|
|
||||||
bri _unaligned_ex4
|
|
||||||
|
|
||||||
/* Get the PGD for the current thread. */
|
|
||||||
_unaligned_ex3: /* user thread */
|
|
||||||
addi r5 ,CURRENT_TASK, TOPHYS(0); /* get current task address */
|
|
||||||
lwi r5, r5, TASK_THREAD + PGDIR
|
|
||||||
_unaligned_ex4:
|
|
||||||
tophys(r5,r5)
|
|
||||||
BSRLI(r6,r4,20) /* Create L1 (pgdir/pmd) address */
|
|
||||||
andi r6, r6, 0xffc
|
|
||||||
/* Assume pgdir aligned on 4K boundary, no need for "andi r5,r5,0xfffff003" */
|
|
||||||
or r5, r5, r6
|
|
||||||
lwi r6, r5, 0 /* Get L1 entry */
|
|
||||||
andi r5, r6, 0xfffff000 /* Extract L2 (pte) base address. */
|
|
||||||
beqi r5, _unaligned_ex1 /* Bail if no table */
|
|
||||||
|
|
||||||
tophys(r5,r5)
|
|
||||||
BSRLI(r6,r4,10) /* Compute PTE address */
|
|
||||||
andi r6, r6, 0xffc
|
|
||||||
andi r5, r5, 0xfffff003
|
|
||||||
or r5, r5, r6
|
|
||||||
lwi r5, r5, 0 /* Get Linux PTE */
|
|
||||||
|
|
||||||
andi r6, r5, _PAGE_PRESENT
|
|
||||||
beqi r6, _unaligned_ex1 /* Bail if no page */
|
|
||||||
|
|
||||||
andi r5, r5, 0xfffff000 /* Extract RPN */
|
|
||||||
andi r4, r4, 0x00000fff /* Extract offset */
|
|
||||||
or r4, r4, r5 /* Create physical address */
|
|
||||||
#endif /* CONFIG_MMU */
|
|
||||||
|
|
||||||
andi r6, r3, 0x400; /* Extract ESR[S] */
|
andi r6, r3, 0x400; /* Extract ESR[S] */
|
||||||
bnei r6, ex_sw;
|
bnei r6, ex_sw;
|
||||||
|
@ -959,15 +911,15 @@ _unaligned_data_exception:
|
||||||
andi r6, r3, 0x800; /* Extract ESR[W] - delay slot */
|
andi r6, r3, 0x800; /* Extract ESR[W] - delay slot */
|
||||||
ex_lw_vm:
|
ex_lw_vm:
|
||||||
beqid r6, ex_lhw_vm;
|
beqid r6, ex_lhw_vm;
|
||||||
lbui r5, r4, 0; /* Exception address in r4 - delay slot */
|
load1: lbui r5, r4, 0; /* Exception address in r4 - delay slot */
|
||||||
/* Load a word, byte-by-byte from destination address and save it in tmp space*/
|
/* Load a word, byte-by-byte from destination address and save it in tmp space*/
|
||||||
la r6, r0, ex_tmp_data_loc_0;
|
la r6, r0, ex_tmp_data_loc_0;
|
||||||
sbi r5, r6, 0;
|
sbi r5, r6, 0;
|
||||||
lbui r5, r4, 1;
|
load2: lbui r5, r4, 1;
|
||||||
sbi r5, r6, 1;
|
sbi r5, r6, 1;
|
||||||
lbui r5, r4, 2;
|
load3: lbui r5, r4, 2;
|
||||||
sbi r5, r6, 2;
|
sbi r5, r6, 2;
|
||||||
lbui r5, r4, 3;
|
load4: lbui r5, r4, 3;
|
||||||
sbi r5, r6, 3;
|
sbi r5, r6, 3;
|
||||||
brid ex_lw_tail_vm;
|
brid ex_lw_tail_vm;
|
||||||
/* Get the destination register value into r3 - delay slot */
|
/* Get the destination register value into r3 - delay slot */
|
||||||
|
@ -977,7 +929,7 @@ ex_lhw_vm:
|
||||||
* save it in tmp space */
|
* save it in tmp space */
|
||||||
la r6, r0, ex_tmp_data_loc_0;
|
la r6, r0, ex_tmp_data_loc_0;
|
||||||
sbi r5, r6, 0;
|
sbi r5, r6, 0;
|
||||||
lbui r5, r4, 1;
|
load5: lbui r5, r4, 1;
|
||||||
sbi r5, r6, 1;
|
sbi r5, r6, 1;
|
||||||
lhui r3, r6, 0; /* Get the destination register value into r3 */
|
lhui r3, r6, 0; /* Get the destination register value into r3 */
|
||||||
ex_lw_tail_vm:
|
ex_lw_tail_vm:
|
||||||
|
@ -996,22 +948,53 @@ ex_sw_tail_vm:
|
||||||
swi r3, r5, 0; /* Get the word - delay slot */
|
swi r3, r5, 0; /* Get the word - delay slot */
|
||||||
/* Store the word, byte-by-byte into destination address */
|
/* Store the word, byte-by-byte into destination address */
|
||||||
lbui r3, r5, 0;
|
lbui r3, r5, 0;
|
||||||
sbi r3, r4, 0;
|
store1: sbi r3, r4, 0;
|
||||||
lbui r3, r5, 1;
|
lbui r3, r5, 1;
|
||||||
sbi r3, r4, 1;
|
store2: sbi r3, r4, 1;
|
||||||
lbui r3, r5, 2;
|
lbui r3, r5, 2;
|
||||||
sbi r3, r4, 2;
|
store3: sbi r3, r4, 2;
|
||||||
lbui r3, r5, 3;
|
lbui r3, r5, 3;
|
||||||
brid ret_from_exc;
|
brid ret_from_exc;
|
||||||
sbi r3, r4, 3; /* Delay slot */
|
store4: sbi r3, r4, 3; /* Delay slot */
|
||||||
ex_shw_vm:
|
ex_shw_vm:
|
||||||
/* Store the lower half-word, byte-by-byte into destination address */
|
/* Store the lower half-word, byte-by-byte into destination address */
|
||||||
lbui r3, r5, 2;
|
lbui r3, r5, 2;
|
||||||
sbi r3, r4, 0;
|
store5: sbi r3, r4, 0;
|
||||||
lbui r3, r5, 3;
|
lbui r3, r5, 3;
|
||||||
brid ret_from_exc;
|
brid ret_from_exc;
|
||||||
sbi r3, r4, 1; /* Delay slot */
|
store6: sbi r3, r4, 1; /* Delay slot */
|
||||||
ex_sw_end_vm: /* Exception handling of store word, ends. */
|
ex_sw_end_vm: /* Exception handling of store word, ends. */
|
||||||
|
|
||||||
|
/* We have to prevent cases that get/put_user macros get unaligned pointer
|
||||||
|
* to bad page area. We have to find out which origin instruction caused it
|
||||||
|
* and called fixup for that origin instruction not instruction in unaligned
|
||||||
|
* handler */
|
||||||
|
ex_unaligned_fixup:
|
||||||
|
ori r5, r7, 0 /* setup pointer to pt_regs */
|
||||||
|
lwi r6, r7, PT_PC; /* faulting address is one instruction above */
|
||||||
|
addik r6, r6, -4 /* for finding proper fixup */
|
||||||
|
swi r6, r7, PT_PC; /* a save back it to PT_PC */
|
||||||
|
addik r7, r0, SIGSEGV
|
||||||
|
/* call bad_page_fault for finding aligned fixup, fixup address is saved
|
||||||
|
* in PT_PC which is used as return address from exception */
|
||||||
|
la r15, r0, ret_from_exc-8 /* setup return address */
|
||||||
|
brid bad_page_fault
|
||||||
|
nop
|
||||||
|
|
||||||
|
/* We prevent all load/store because it could failed any attempt to access */
|
||||||
|
.section __ex_table,"a";
|
||||||
|
.word load1,ex_unaligned_fixup;
|
||||||
|
.word load2,ex_unaligned_fixup;
|
||||||
|
.word load3,ex_unaligned_fixup;
|
||||||
|
.word load4,ex_unaligned_fixup;
|
||||||
|
.word load5,ex_unaligned_fixup;
|
||||||
|
.word store1,ex_unaligned_fixup;
|
||||||
|
.word store2,ex_unaligned_fixup;
|
||||||
|
.word store3,ex_unaligned_fixup;
|
||||||
|
.word store4,ex_unaligned_fixup;
|
||||||
|
.word store5,ex_unaligned_fixup;
|
||||||
|
.word store6,ex_unaligned_fixup;
|
||||||
|
.previous;
|
||||||
.end _unaligned_data_exception
|
.end _unaligned_data_exception
|
||||||
#endif /* CONFIG_MMU */
|
#endif /* CONFIG_MMU */
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
|
||||||
Elf32_Rela *rela = (void *)sechdrs[relsec].sh_addr;
|
Elf32_Rela *rela = (void *)sechdrs[relsec].sh_addr;
|
||||||
Elf32_Sym *sym;
|
Elf32_Sym *sym;
|
||||||
unsigned long int *location;
|
unsigned long int *location;
|
||||||
unsigned long int locoffs;
|
|
||||||
unsigned long int value;
|
unsigned long int value;
|
||||||
#if __GNUC__ < 4
|
#if __GNUC__ < 4
|
||||||
unsigned long int old_value;
|
unsigned long int old_value;
|
||||||
|
@ -113,10 +112,12 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_MICROBLAZE_64_PCREL:
|
case R_MICROBLAZE_64_PCREL:
|
||||||
locoffs = (location[0] & 0xFFFF) << 16 |
|
#if __GNUC__ < 4
|
||||||
|
old_value = (location[0] & 0xFFFF) << 16 |
|
||||||
(location[1] & 0xFFFF);
|
(location[1] & 0xFFFF);
|
||||||
value -= (unsigned long int)(location) + 4 +
|
value -= old_value;
|
||||||
locoffs;
|
#endif
|
||||||
|
value -= (unsigned long int)(location) + 4;
|
||||||
location[0] = (location[0] & 0xFFFF0000) |
|
location[0] = (location[0] & 0xFFFF0000) |
|
||||||
(value >> 16);
|
(value >> 16);
|
||||||
location[1] = (location[1] & 0xFFFF0000) |
|
location[1] = (location[1] & 0xFFFF0000) |
|
||||||
|
@ -125,6 +126,14 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
|
||||||
value);
|
value);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case R_MICROBLAZE_32_PCREL_LO:
|
||||||
|
pr_debug("R_MICROBLAZE_32_PCREL_LO\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case R_MICROBLAZE_64_NONE:
|
||||||
|
pr_debug("R_MICROBLAZE_NONE\n");
|
||||||
|
break;
|
||||||
|
|
||||||
case R_MICROBLAZE_NONE:
|
case R_MICROBLAZE_NONE:
|
||||||
pr_debug("R_MICROBLAZE_NONE\n");
|
pr_debug("R_MICROBLAZE_NONE\n");
|
||||||
break;
|
break;
|
||||||
|
@ -133,7 +142,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
|
||||||
printk(KERN_ERR "module %s: "
|
printk(KERN_ERR "module %s: "
|
||||||
"Unknown relocation: %u\n",
|
"Unknown relocation: %u\n",
|
||||||
module->name,
|
module->name,
|
||||||
ELF32_R_TYPE(rela->r_info));
|
ELF32_R_TYPE(rela[i].r_info));
|
||||||
return -ENOEXEC;
|
return -ENOEXEC;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -138,8 +138,12 @@ void __init machine_early_init(const char *cmdline, unsigned int ram,
|
||||||
setup_early_printk(NULL);
|
setup_early_printk(NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
early_printk("Ramdisk addr 0x%08x, FDT 0x%08x\n", ram, fdt);
|
early_printk("Ramdisk addr 0x%08x, ", ram);
|
||||||
printk(KERN_NOTICE "Found FDT at 0x%08x\n", fdt);
|
if (fdt)
|
||||||
|
early_printk("FDT at 0x%08x\n", fdt);
|
||||||
|
else
|
||||||
|
early_printk("Compiled-in FDT at 0x%08x\n",
|
||||||
|
(unsigned int)_fdt_start);
|
||||||
|
|
||||||
#ifdef CONFIG_MTD_UCLINUX
|
#ifdef CONFIG_MTD_UCLINUX
|
||||||
early_printk("Found romfs @ 0x%08x (0x%08x)\n",
|
early_printk("Found romfs @ 0x%08x (0x%08x)\n",
|
||||||
|
|
|
@ -33,105 +33,6 @@
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
|
|
||||||
#include <asm/syscalls.h>
|
#include <asm/syscalls.h>
|
||||||
/*
|
|
||||||
* sys_ipc() is the de-multiplexer for the SysV IPC calls..
|
|
||||||
*
|
|
||||||
* This is really horribly ugly. This will be remove with new toolchain.
|
|
||||||
*/
|
|
||||||
asmlinkage long
|
|
||||||
sys_ipc(uint call, int first, int second, int third, void *ptr, long fifth)
|
|
||||||
{
|
|
||||||
int version, ret;
|
|
||||||
|
|
||||||
version = call >> 16; /* hack for backward compatibility */
|
|
||||||
call &= 0xffff;
|
|
||||||
|
|
||||||
ret = -EINVAL;
|
|
||||||
switch (call) {
|
|
||||||
case SEMOP:
|
|
||||||
ret = sys_semop(first, (struct sembuf *)ptr, second);
|
|
||||||
break;
|
|
||||||
case SEMGET:
|
|
||||||
ret = sys_semget(first, second, third);
|
|
||||||
break;
|
|
||||||
case SEMCTL:
|
|
||||||
{
|
|
||||||
union semun fourth;
|
|
||||||
|
|
||||||
if (!ptr)
|
|
||||||
break;
|
|
||||||
ret = (access_ok(VERIFY_READ, ptr, sizeof(long)) ? 0 : -EFAULT)
|
|
||||||
|| (get_user(fourth.__pad, (void **)ptr)) ;
|
|
||||||
if (ret)
|
|
||||||
break;
|
|
||||||
ret = sys_semctl(first, second, third, fourth);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MSGSND:
|
|
||||||
ret = sys_msgsnd(first, (struct msgbuf *) ptr, second, third);
|
|
||||||
break;
|
|
||||||
case MSGRCV:
|
|
||||||
switch (version) {
|
|
||||||
case 0: {
|
|
||||||
struct ipc_kludge tmp;
|
|
||||||
|
|
||||||
if (!ptr)
|
|
||||||
break;
|
|
||||||
ret = (access_ok(VERIFY_READ, ptr, sizeof(tmp))
|
|
||||||
? 0 : -EFAULT) || copy_from_user(&tmp,
|
|
||||||
(struct ipc_kludge *) ptr, sizeof(tmp));
|
|
||||||
if (ret)
|
|
||||||
break;
|
|
||||||
ret = sys_msgrcv(first, tmp.msgp, second, tmp.msgtyp,
|
|
||||||
third);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
ret = sys_msgrcv(first, (struct msgbuf *) ptr,
|
|
||||||
second, fifth, third);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case MSGGET:
|
|
||||||
ret = sys_msgget((key_t) first, second);
|
|
||||||
break;
|
|
||||||
case MSGCTL:
|
|
||||||
ret = sys_msgctl(first, second, (struct msqid_ds *) ptr);
|
|
||||||
break;
|
|
||||||
case SHMAT:
|
|
||||||
switch (version) {
|
|
||||||
default: {
|
|
||||||
ulong raddr;
|
|
||||||
ret = access_ok(VERIFY_WRITE, (ulong *) third,
|
|
||||||
sizeof(ulong)) ? 0 : -EFAULT;
|
|
||||||
if (ret)
|
|
||||||
break;
|
|
||||||
ret = do_shmat(first, (char *) ptr, second, &raddr);
|
|
||||||
if (ret)
|
|
||||||
break;
|
|
||||||
ret = put_user(raddr, (ulong *) third);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1: /* iBCS2 emulator entry point */
|
|
||||||
if (!segment_eq(get_fs(), get_ds()))
|
|
||||||
break;
|
|
||||||
ret = do_shmat(first, (char *) ptr, second,
|
|
||||||
(ulong *) third);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SHMDT:
|
|
||||||
ret = sys_shmdt((char *)ptr);
|
|
||||||
break;
|
|
||||||
case SHMGET:
|
|
||||||
ret = sys_shmget(first, second, third);
|
|
||||||
break;
|
|
||||||
case SHMCTL:
|
|
||||||
ret = sys_shmctl(first, second, (struct shmid_ds *) ptr);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
asmlinkage long microblaze_vfork(struct pt_regs *regs)
|
asmlinkage long microblaze_vfork(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
|
|
@ -121,7 +121,7 @@ ENTRY(sys_call_table)
|
||||||
.long sys_wait4
|
.long sys_wait4
|
||||||
.long sys_swapoff /* 115 */
|
.long sys_swapoff /* 115 */
|
||||||
.long sys_sysinfo
|
.long sys_sysinfo
|
||||||
.long sys_ipc
|
.long sys_ni_syscall /* old sys_ipc */
|
||||||
.long sys_fsync
|
.long sys_fsync
|
||||||
.long sys_ni_syscall /* sys_sigreturn_wrapper */
|
.long sys_ni_syscall /* sys_sigreturn_wrapper */
|
||||||
.long sys_clone /* 120 */
|
.long sys_clone /* 120 */
|
||||||
|
|
|
@ -69,7 +69,7 @@ static int store_updates_sp(struct pt_regs *regs)
|
||||||
* It is called from do_page_fault above and from some of the procedures
|
* It is called from do_page_fault above and from some of the procedures
|
||||||
* in traps.c.
|
* in traps.c.
|
||||||
*/
|
*/
|
||||||
static void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)
|
void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)
|
||||||
{
|
{
|
||||||
const struct exception_table_entry *fixup;
|
const struct exception_table_entry *fixup;
|
||||||
/* MS: no context */
|
/* MS: no context */
|
||||||
|
@ -122,15 +122,10 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_KGDB */
|
#endif /* CONFIG_KGDB */
|
||||||
|
|
||||||
if (in_atomic() || mm == NULL) {
|
if (in_atomic() || !mm) {
|
||||||
/* FIXME */
|
if (kernel_mode(regs))
|
||||||
if (kernel_mode(regs)) {
|
goto bad_area_nosemaphore;
|
||||||
printk(KERN_EMERG
|
|
||||||
"Page fault in kernel mode - Oooou!!! pid %d\n",
|
|
||||||
current->pid);
|
|
||||||
_exception(SIGSEGV, regs, code, address);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/* in_atomic() in user mode is really bad,
|
/* in_atomic() in user mode is really bad,
|
||||||
as is current->mm == NULL. */
|
as is current->mm == NULL. */
|
||||||
printk(KERN_EMERG "Page fault in user mode with "
|
printk(KERN_EMERG "Page fault in user mode with "
|
||||||
|
|
|
@ -98,23 +98,12 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
|
||||||
__free_pages(pte, PTE_ORDER);
|
__free_pages(pte, PTE_ORDER);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __pte_free_tlb(tlb,pte) \
|
#define __pte_free_tlb(tlb,pte,address) \
|
||||||
do { \
|
do { \
|
||||||
pgtable_page_dtor(pte); \
|
pgtable_page_dtor(pte); \
|
||||||
tlb_remove_page((tlb), pte); \
|
tlb_remove_page((tlb), pte); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#ifdef CONFIG_32BIT
|
|
||||||
|
|
||||||
/*
|
|
||||||
* allocating and freeing a pmd is trivial: the 1-entry pmd is
|
|
||||||
* inside the pgd, so has no extra memory associated with it.
|
|
||||||
*/
|
|
||||||
#define pmd_free(mm, x) do { } while (0)
|
|
||||||
#define __pmd_free_tlb(tlb, x) do { } while (0)
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_64BIT
|
#ifdef CONFIG_64BIT
|
||||||
|
|
||||||
static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
|
static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
|
||||||
|
@ -132,7 +121,7 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
|
||||||
free_pages((unsigned long)pmd, PMD_ORDER);
|
free_pages((unsigned long)pmd, PMD_ORDER);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __pmd_free_tlb(tlb, x) pmd_free((tlb)->mm, x)
|
#define __pmd_free_tlb(tlb, x, addr) pmd_free((tlb)->mm, x)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,6 @@ static inline void pte_free(struct mm_struct *mm, struct page *pte)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#define __pte_free_tlb(tlb, pte) tlb_remove_page((tlb), (pte))
|
#define __pte_free_tlb(tlb, pte, addr) tlb_remove_page((tlb), (pte))
|
||||||
|
|
||||||
#endif /* _ASM_PGALLOC_H */
|
#endif /* _ASM_PGALLOC_H */
|
||||||
|
|
|
@ -21,7 +21,7 @@ do { if (!(tlb)->fullmm) \
|
||||||
|
|
||||||
#include <asm-generic/tlb.h>
|
#include <asm-generic/tlb.h>
|
||||||
|
|
||||||
#define __pmd_free_tlb(tlb, pmd) pmd_free((tlb)->mm, pmd)
|
#define __pmd_free_tlb(tlb, pmd, addr) pmd_free((tlb)->mm, pmd)
|
||||||
#define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, pte)
|
#define __pte_free_tlb(tlb, pte, addr) pte_free((tlb)->mm, pte)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -16,7 +16,7 @@ extern void pgd_free(struct mm_struct *mm, pgd_t *pgd);
|
||||||
*/
|
*/
|
||||||
/* #define pmd_alloc_one(mm,address) ({ BUG(); ((pmd_t *)2); }) */
|
/* #define pmd_alloc_one(mm,address) ({ BUG(); ((pmd_t *)2); }) */
|
||||||
#define pmd_free(mm, x) do { } while (0)
|
#define pmd_free(mm, x) do { } while (0)
|
||||||
#define __pmd_free_tlb(tlb,x) do { } while (0)
|
#define __pmd_free_tlb(tlb,x,a) do { } while (0)
|
||||||
/* #define pgd_populate(mm, pmd, pte) BUG() */
|
/* #define pgd_populate(mm, pmd, pte) BUG() */
|
||||||
|
|
||||||
#ifndef CONFIG_BOOKE
|
#ifndef CONFIG_BOOKE
|
||||||
|
|
|
@ -118,11 +118,11 @@ static inline void pgtable_free(pgtable_free_t pgf)
|
||||||
kmem_cache_free(pgtable_cache[cachenum], p);
|
kmem_cache_free(pgtable_cache[cachenum], p);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __pmd_free_tlb(tlb, pmd) \
|
#define __pmd_free_tlb(tlb, pmd,addr) \
|
||||||
pgtable_free_tlb(tlb, pgtable_free_cache(pmd, \
|
pgtable_free_tlb(tlb, pgtable_free_cache(pmd, \
|
||||||
PMD_CACHE_NUM, PMD_TABLE_SIZE-1))
|
PMD_CACHE_NUM, PMD_TABLE_SIZE-1))
|
||||||
#ifndef CONFIG_PPC_64K_PAGES
|
#ifndef CONFIG_PPC_64K_PAGES
|
||||||
#define __pud_free_tlb(tlb, pud) \
|
#define __pud_free_tlb(tlb, pud, addr) \
|
||||||
pgtable_free_tlb(tlb, pgtable_free_cache(pud, \
|
pgtable_free_tlb(tlb, pgtable_free_cache(pud, \
|
||||||
PUD_CACHE_NUM, PUD_TABLE_SIZE-1))
|
PUD_CACHE_NUM, PUD_TABLE_SIZE-1))
|
||||||
#endif /* CONFIG_PPC_64K_PAGES */
|
#endif /* CONFIG_PPC_64K_PAGES */
|
||||||
|
|
|
@ -38,14 +38,14 @@ static inline pgtable_free_t pgtable_free_cache(void *p, int cachenum,
|
||||||
extern void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf);
|
extern void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf);
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
#define __pte_free_tlb(tlb,ptepage) \
|
#define __pte_free_tlb(tlb,ptepage,address) \
|
||||||
do { \
|
do { \
|
||||||
pgtable_page_dtor(ptepage); \
|
pgtable_page_dtor(ptepage); \
|
||||||
pgtable_free_tlb(tlb, pgtable_free_cache(page_address(ptepage), \
|
pgtable_free_tlb(tlb, pgtable_free_cache(page_address(ptepage), \
|
||||||
PTE_NONCACHE_NUM, PTE_TABLE_SIZE-1)); \
|
PTE_NONCACHE_NUM, PTE_TABLE_SIZE-1)); \
|
||||||
} while (0)
|
} while (0)
|
||||||
#else
|
#else
|
||||||
#define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, (pte))
|
#define __pte_free_tlb(tlb, pte, address) pte_free((tlb)->mm, (pte))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -305,7 +305,7 @@ static void hugetlb_free_pmd_range(struct mmu_gather *tlb, pud_t *pud,
|
||||||
|
|
||||||
pmd = pmd_offset(pud, start);
|
pmd = pmd_offset(pud, start);
|
||||||
pud_clear(pud);
|
pud_clear(pud);
|
||||||
pmd_free_tlb(tlb, pmd);
|
pmd_free_tlb(tlb, pmd, start);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hugetlb_free_pud_range(struct mmu_gather *tlb, pgd_t *pgd,
|
static void hugetlb_free_pud_range(struct mmu_gather *tlb, pgd_t *pgd,
|
||||||
|
@ -348,7 +348,7 @@ static void hugetlb_free_pud_range(struct mmu_gather *tlb, pgd_t *pgd,
|
||||||
|
|
||||||
pud = pud_offset(pgd, start);
|
pud = pud_offset(pgd, start);
|
||||||
pgd_clear(pgd);
|
pgd_clear(pgd);
|
||||||
pud_free_tlb(tlb, pud);
|
pud_free_tlb(tlb, pud, start);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -96,7 +96,8 @@ static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page)
|
||||||
* pte_free_tlb frees a pte table and clears the CRSTE for the
|
* pte_free_tlb frees a pte table and clears the CRSTE for the
|
||||||
* page table from the tlb.
|
* page table from the tlb.
|
||||||
*/
|
*/
|
||||||
static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte)
|
static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,
|
||||||
|
unsigned long address)
|
||||||
{
|
{
|
||||||
if (!tlb->fullmm) {
|
if (!tlb->fullmm) {
|
||||||
tlb->array[tlb->nr_ptes++] = pte;
|
tlb->array[tlb->nr_ptes++] = pte;
|
||||||
|
@ -113,7 +114,8 @@ static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte)
|
||||||
* as the pgd. pmd_free_tlb checks the asce_limit against 2GB
|
* as the pgd. pmd_free_tlb checks the asce_limit against 2GB
|
||||||
* to avoid the double free of the pmd in this case.
|
* to avoid the double free of the pmd in this case.
|
||||||
*/
|
*/
|
||||||
static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd)
|
static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
|
||||||
|
unsigned long address)
|
||||||
{
|
{
|
||||||
#ifdef __s390x__
|
#ifdef __s390x__
|
||||||
if (tlb->mm->context.asce_limit <= (1UL << 31))
|
if (tlb->mm->context.asce_limit <= (1UL << 31))
|
||||||
|
@ -134,7 +136,8 @@ static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd)
|
||||||
* as the pgd. pud_free_tlb checks the asce_limit against 4TB
|
* as the pgd. pud_free_tlb checks the asce_limit against 4TB
|
||||||
* to avoid the double free of the pud in this case.
|
* to avoid the double free of the pud in this case.
|
||||||
*/
|
*/
|
||||||
static inline void pud_free_tlb(struct mmu_gather *tlb, pud_t *pud)
|
static inline void pud_free_tlb(struct mmu_gather *tlb, pud_t *pud,
|
||||||
|
unsigned long address)
|
||||||
{
|
{
|
||||||
#ifdef __s390x__
|
#ifdef __s390x__
|
||||||
if (tlb->mm->context.asce_limit <= (1UL << 42))
|
if (tlb->mm->context.asce_limit <= (1UL << 42))
|
||||||
|
|
|
@ -210,7 +210,7 @@ static noinline __init void detect_machine_type(void)
|
||||||
machine_flags |= MACHINE_FLAG_VM;
|
machine_flags |= MACHINE_FLAG_VM;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void early_pgm_check_handler(void)
|
static __init void early_pgm_check_handler(void)
|
||||||
{
|
{
|
||||||
unsigned long addr;
|
unsigned long addr;
|
||||||
const struct exception_table_entry *fixup;
|
const struct exception_table_entry *fixup;
|
||||||
|
@ -222,7 +222,7 @@ static void early_pgm_check_handler(void)
|
||||||
S390_lowcore.program_old_psw.addr = fixup->fixup | PSW_ADDR_AMODE;
|
S390_lowcore.program_old_psw.addr = fixup->fixup | PSW_ADDR_AMODE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup_lowcore_early(void)
|
static noinline __init void setup_lowcore_early(void)
|
||||||
{
|
{
|
||||||
psw_t psw;
|
psw_t psw;
|
||||||
|
|
||||||
|
|
|
@ -687,13 +687,14 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
||||||
#ifndef CONFIG_64BIT
|
#ifndef CONFIG_64BIT
|
||||||
if (MACHINE_HAS_IEEE)
|
if (MACHINE_HAS_IEEE)
|
||||||
lowcore->extended_save_area_addr = (u32) save_area;
|
lowcore->extended_save_area_addr = (u32) save_area;
|
||||||
#else
|
|
||||||
if (vdso_alloc_per_cpu(smp_processor_id(), lowcore))
|
|
||||||
BUG();
|
|
||||||
#endif
|
#endif
|
||||||
set_prefix((u32)(unsigned long) lowcore);
|
set_prefix((u32)(unsigned long) lowcore);
|
||||||
local_mcck_enable();
|
local_mcck_enable();
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
|
#ifdef CONFIG_64BIT
|
||||||
|
if (vdso_alloc_per_cpu(smp_processor_id(), &S390_lowcore))
|
||||||
|
BUG();
|
||||||
|
#endif
|
||||||
for_each_possible_cpu(cpu)
|
for_each_possible_cpu(cpu)
|
||||||
if (cpu != smp_processor_id())
|
if (cpu != smp_processor_id())
|
||||||
smp_create_idle(cpu);
|
smp_create_idle(cpu);
|
||||||
|
|
|
@ -88,10 +88,17 @@ __kernel_clock_gettime:
|
||||||
llilh %r4,0x0100
|
llilh %r4,0x0100
|
||||||
sar %a4,%r4
|
sar %a4,%r4
|
||||||
lghi %r4,0
|
lghi %r4,0
|
||||||
|
epsw %r5,0
|
||||||
sacf 512 /* Magic ectg instruction */
|
sacf 512 /* Magic ectg instruction */
|
||||||
.insn ssf,0xc80100000000,__VDSO_ECTG_BASE(4),__VDSO_ECTG_USER(4),4
|
.insn ssf,0xc80100000000,__VDSO_ECTG_BASE(4),__VDSO_ECTG_USER(4),4
|
||||||
sacf 0
|
tml %r5,0x4000
|
||||||
sar %a4,%r2
|
jo 11f
|
||||||
|
tml %r5,0x8000
|
||||||
|
jno 10f
|
||||||
|
sacf 256
|
||||||
|
j 11f
|
||||||
|
10: sacf 0
|
||||||
|
11: sar %a4,%r2
|
||||||
algr %r1,%r0 /* r1 = cputime as TOD value */
|
algr %r1,%r0 /* r1 = cputime as TOD value */
|
||||||
mghi %r1,1000 /* convert to nanoseconds */
|
mghi %r1,1000 /* convert to nanoseconds */
|
||||||
srlg %r1,%r1,12 /* r1 = cputime in nanosec */
|
srlg %r1,%r1,12 /* r1 = cputime in nanosec */
|
||||||
|
|
|
@ -7,24 +7,36 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <asm/system.h>
|
||||||
|
|
||||||
/*
|
|
||||||
* save CPU registers before creating a hibernation image and before
|
|
||||||
* restoring the memory state from it
|
|
||||||
*/
|
|
||||||
void save_processor_state(void)
|
void save_processor_state(void)
|
||||||
{
|
{
|
||||||
/* implentation contained in the
|
/* swsusp_arch_suspend() actually saves all cpu register contents.
|
||||||
* swsusp_arch_suspend function
|
* Machine checks must be disabled since swsusp_arch_suspend() stores
|
||||||
|
* register contents to their lowcore save areas. That's the same
|
||||||
|
* place where register contents on machine checks would be saved.
|
||||||
|
* To avoid register corruption disable machine checks.
|
||||||
|
* We must also disable machine checks in the new psw mask for
|
||||||
|
* program checks, since swsusp_arch_suspend() may generate program
|
||||||
|
* checks. Disabling machine checks for all other new psw masks is
|
||||||
|
* just paranoia.
|
||||||
*/
|
*/
|
||||||
|
local_mcck_disable();
|
||||||
|
/* Disable lowcore protection */
|
||||||
|
__ctl_clear_bit(0,28);
|
||||||
|
S390_lowcore.external_new_psw.mask &= ~PSW_MASK_MCHECK;
|
||||||
|
S390_lowcore.svc_new_psw.mask &= ~PSW_MASK_MCHECK;
|
||||||
|
S390_lowcore.io_new_psw.mask &= ~PSW_MASK_MCHECK;
|
||||||
|
S390_lowcore.program_new_psw.mask &= ~PSW_MASK_MCHECK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* restore the contents of CPU registers
|
|
||||||
*/
|
|
||||||
void restore_processor_state(void)
|
void restore_processor_state(void)
|
||||||
{
|
{
|
||||||
/* implentation contained in the
|
S390_lowcore.external_new_psw.mask |= PSW_MASK_MCHECK;
|
||||||
* swsusp_arch_resume function
|
S390_lowcore.svc_new_psw.mask |= PSW_MASK_MCHECK;
|
||||||
*/
|
S390_lowcore.io_new_psw.mask |= PSW_MASK_MCHECK;
|
||||||
|
S390_lowcore.program_new_psw.mask |= PSW_MASK_MCHECK;
|
||||||
|
/* Enable lowcore protection */
|
||||||
|
__ctl_set_bit(0,28);
|
||||||
|
local_mcck_enable();
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,19 +32,14 @@ swsusp_arch_suspend:
|
||||||
/* Deactivate DAT */
|
/* Deactivate DAT */
|
||||||
stnsm __SF_EMPTY(%r15),0xfb
|
stnsm __SF_EMPTY(%r15),0xfb
|
||||||
|
|
||||||
/* Switch off lowcore protection */
|
|
||||||
stctg %c0,%c0,__SF_EMPTY(%r15)
|
|
||||||
ni __SF_EMPTY+4(%r15),0xef
|
|
||||||
lctlg %c0,%c0,__SF_EMPTY(%r15)
|
|
||||||
|
|
||||||
/* Store prefix register on stack */
|
/* Store prefix register on stack */
|
||||||
stpx __SF_EMPTY(%r15)
|
stpx __SF_EMPTY(%r15)
|
||||||
|
|
||||||
/* Setup base register for lowcore (absolute 0) */
|
/* Save prefix register contents for lowcore */
|
||||||
llgf %r1,__SF_EMPTY(%r15)
|
llgf %r4,__SF_EMPTY(%r15)
|
||||||
|
|
||||||
/* Get pointer to save area */
|
/* Get pointer to save area */
|
||||||
aghi %r1,0x1000
|
lghi %r1,0x1000
|
||||||
|
|
||||||
/* Store registers */
|
/* Store registers */
|
||||||
mvc 0x318(4,%r1),__SF_EMPTY(%r15) /* move prefix to lowcore */
|
mvc 0x318(4,%r1),__SF_EMPTY(%r15) /* move prefix to lowcore */
|
||||||
|
@ -79,17 +74,15 @@ swsusp_arch_suspend:
|
||||||
xc __SF_EMPTY(4,%r15),__SF_EMPTY(%r15)
|
xc __SF_EMPTY(4,%r15),__SF_EMPTY(%r15)
|
||||||
spx __SF_EMPTY(%r15)
|
spx __SF_EMPTY(%r15)
|
||||||
|
|
||||||
/* Setup lowcore */
|
lghi %r2,0
|
||||||
brasl %r14,setup_lowcore_early
|
lghi %r3,2*PAGE_SIZE
|
||||||
|
lghi %r5,2*PAGE_SIZE
|
||||||
|
1: mvcle %r2,%r4,0
|
||||||
|
jo 1b
|
||||||
|
|
||||||
/* Save image */
|
/* Save image */
|
||||||
brasl %r14,swsusp_save
|
brasl %r14,swsusp_save
|
||||||
|
|
||||||
/* Switch on lowcore protection */
|
|
||||||
stctg %c0,%c0,__SF_EMPTY(%r15)
|
|
||||||
oi __SF_EMPTY+4(%r15),0x10
|
|
||||||
lctlg %c0,%c0,__SF_EMPTY(%r15)
|
|
||||||
|
|
||||||
/* Restore prefix register and return */
|
/* Restore prefix register and return */
|
||||||
lghi %r1,0x1000
|
lghi %r1,0x1000
|
||||||
spx 0x318(%r1)
|
spx 0x318(%r1)
|
||||||
|
@ -117,11 +110,6 @@ swsusp_arch_resume:
|
||||||
/* Deactivate DAT */
|
/* Deactivate DAT */
|
||||||
stnsm __SF_EMPTY(%r15),0xfb
|
stnsm __SF_EMPTY(%r15),0xfb
|
||||||
|
|
||||||
/* Switch off lowcore protection */
|
|
||||||
stctg %c0,%c0,__SF_EMPTY(%r15)
|
|
||||||
ni __SF_EMPTY+4(%r15),0xef
|
|
||||||
lctlg %c0,%c0,__SF_EMPTY(%r15)
|
|
||||||
|
|
||||||
/* Set prefix page to zero */
|
/* Set prefix page to zero */
|
||||||
xc __SF_EMPTY(4,%r15),__SF_EMPTY(%r15)
|
xc __SF_EMPTY(4,%r15),__SF_EMPTY(%r15)
|
||||||
spx __SF_EMPTY(%r15)
|
spx __SF_EMPTY(%r15)
|
||||||
|
@ -175,7 +163,7 @@ swsusp_arch_resume:
|
||||||
/* Load old stack */
|
/* Load old stack */
|
||||||
lg %r15,0x2f8(%r13)
|
lg %r15,0x2f8(%r13)
|
||||||
|
|
||||||
/* Pointer to save arae */
|
/* Pointer to save area */
|
||||||
lghi %r13,0x1000
|
lghi %r13,0x1000
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
@ -187,11 +175,6 @@ swsusp_arch_resume:
|
||||||
/* Restore prefix register */
|
/* Restore prefix register */
|
||||||
spx 0x318(%r13)
|
spx 0x318(%r13)
|
||||||
|
|
||||||
/* Switch on lowcore protection */
|
|
||||||
stctg %c0,%c0,__SF_EMPTY(%r15)
|
|
||||||
oi __SF_EMPTY+4(%r15),0x10
|
|
||||||
lctlg %c0,%c0,__SF_EMPTY(%r15)
|
|
||||||
|
|
||||||
/* Activate DAT */
|
/* Activate DAT */
|
||||||
stosm __SF_EMPTY(%r15),0x04
|
stosm __SF_EMPTY(%r15),0x04
|
||||||
|
|
||||||
|
|
|
@ -73,20 +73,12 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
|
||||||
quicklist_free_page(QUICK_PT, NULL, pte);
|
quicklist_free_page(QUICK_PT, NULL, pte);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __pte_free_tlb(tlb,pte) \
|
#define __pte_free_tlb(tlb,pte,addr) \
|
||||||
do { \
|
do { \
|
||||||
pgtable_page_dtor(pte); \
|
pgtable_page_dtor(pte); \
|
||||||
tlb_remove_page((tlb), (pte)); \
|
tlb_remove_page((tlb), (pte)); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/*
|
|
||||||
* allocating and freeing a pmd is trivial: the 1-entry pmd is
|
|
||||||
* inside the pgd, so has no extra memory associated with it.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define pmd_free(mm, x) do { } while (0)
|
|
||||||
#define __pmd_free_tlb(tlb,x) do { } while (0)
|
|
||||||
|
|
||||||
static inline void check_pgt_cache(void)
|
static inline void check_pgt_cache(void)
|
||||||
{
|
{
|
||||||
quicklist_trim(QUICK_PGD, NULL, 25, 16);
|
quicklist_trim(QUICK_PGD, NULL, 25, 16);
|
||||||
|
|
|
@ -91,9 +91,9 @@ tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define tlb_remove_page(tlb,page) free_page_and_swap_cache(page)
|
#define tlb_remove_page(tlb,page) free_page_and_swap_cache(page)
|
||||||
#define pte_free_tlb(tlb, ptep) pte_free((tlb)->mm, ptep)
|
#define pte_free_tlb(tlb, ptep, addr) pte_free((tlb)->mm, ptep)
|
||||||
#define pmd_free_tlb(tlb, pmdp) pmd_free((tlb)->mm, pmdp)
|
#define pmd_free_tlb(tlb, pmdp, addr) pmd_free((tlb)->mm, pmdp)
|
||||||
#define pud_free_tlb(tlb, pudp) pud_free((tlb)->mm, pudp)
|
#define pud_free_tlb(tlb, pudp, addr) pud_free((tlb)->mm, pudp)
|
||||||
|
|
||||||
#define tlb_migrate_finish(mm) do { } while (0)
|
#define tlb_migrate_finish(mm) do { } while (0)
|
||||||
|
|
||||||
|
|
|
@ -44,8 +44,8 @@ BTFIXUPDEF_CALL(pmd_t *, pmd_alloc_one, struct mm_struct *, unsigned long)
|
||||||
BTFIXUPDEF_CALL(void, free_pmd_fast, pmd_t *)
|
BTFIXUPDEF_CALL(void, free_pmd_fast, pmd_t *)
|
||||||
#define free_pmd_fast(pmd) BTFIXUP_CALL(free_pmd_fast)(pmd)
|
#define free_pmd_fast(pmd) BTFIXUP_CALL(free_pmd_fast)(pmd)
|
||||||
|
|
||||||
#define pmd_free(mm, pmd) free_pmd_fast(pmd)
|
#define pmd_free(mm, pmd) free_pmd_fast(pmd)
|
||||||
#define __pmd_free_tlb(tlb, pmd) pmd_free((tlb)->mm, pmd)
|
#define __pmd_free_tlb(tlb, pmd, addr) pmd_free((tlb)->mm, pmd)
|
||||||
|
|
||||||
BTFIXUPDEF_CALL(void, pmd_populate, pmd_t *, struct page *)
|
BTFIXUPDEF_CALL(void, pmd_populate, pmd_t *, struct page *)
|
||||||
#define pmd_populate(MM, PMD, PTE) BTFIXUP_CALL(pmd_populate)(PMD, PTE)
|
#define pmd_populate(MM, PMD, PTE) BTFIXUP_CALL(pmd_populate)(PMD, PTE)
|
||||||
|
@ -62,7 +62,7 @@ BTFIXUPDEF_CALL(void, free_pte_fast, pte_t *)
|
||||||
#define pte_free_kernel(mm, pte) BTFIXUP_CALL(free_pte_fast)(pte)
|
#define pte_free_kernel(mm, pte) BTFIXUP_CALL(free_pte_fast)(pte)
|
||||||
|
|
||||||
BTFIXUPDEF_CALL(void, pte_free, pgtable_t )
|
BTFIXUPDEF_CALL(void, pte_free, pgtable_t )
|
||||||
#define pte_free(mm, pte) BTFIXUP_CALL(pte_free)(pte)
|
#define pte_free(mm, pte) BTFIXUP_CALL(pte_free)(pte)
|
||||||
#define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, pte)
|
#define __pte_free_tlb(tlb, pte, addr) pte_free((tlb)->mm, pte)
|
||||||
|
|
||||||
#endif /* _SPARC_PGALLOC_H */
|
#endif /* _SPARC_PGALLOC_H */
|
||||||
|
|
|
@ -100,9 +100,9 @@ static inline void tlb_remove_page(struct mmu_gather *mp, struct page *page)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define tlb_remove_tlb_entry(mp,ptep,addr) do { } while (0)
|
#define tlb_remove_tlb_entry(mp,ptep,addr) do { } while (0)
|
||||||
#define pte_free_tlb(mp, ptepage) pte_free((mp)->mm, ptepage)
|
#define pte_free_tlb(mp, ptepage, addr) pte_free((mp)->mm, ptepage)
|
||||||
#define pmd_free_tlb(mp, pmdp) pmd_free((mp)->mm, pmdp)
|
#define pmd_free_tlb(mp, pmdp, addr) pmd_free((mp)->mm, pmdp)
|
||||||
#define pud_free_tlb(tlb,pudp) __pud_free_tlb(tlb,pudp)
|
#define pud_free_tlb(tlb,pudp, addr) __pud_free_tlb(tlb,pudp,addr)
|
||||||
|
|
||||||
#define tlb_migrate_finish(mm) do { } while (0)
|
#define tlb_migrate_finish(mm) do { } while (0)
|
||||||
#define tlb_start_vma(tlb, vma) do { } while (0)
|
#define tlb_start_vma(tlb, vma) do { } while (0)
|
||||||
|
|
|
@ -40,7 +40,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
|
||||||
__free_page(pte);
|
__free_page(pte);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __pte_free_tlb(tlb,pte) \
|
#define __pte_free_tlb(tlb,pte, address) \
|
||||||
do { \
|
do { \
|
||||||
pgtable_page_dtor(pte); \
|
pgtable_page_dtor(pte); \
|
||||||
tlb_remove_page((tlb),(pte)); \
|
tlb_remove_page((tlb),(pte)); \
|
||||||
|
@ -53,7 +53,7 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
|
||||||
free_page((unsigned long)pmd);
|
free_page((unsigned long)pmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __pmd_free_tlb(tlb,x) tlb_remove_page((tlb),virt_to_page(x))
|
#define __pmd_free_tlb(tlb,x, address) tlb_remove_page((tlb),virt_to_page(x))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define check_pgt_cache() do { } while (0)
|
#define check_pgt_cache() do { } while (0)
|
||||||
|
|
|
@ -116,11 +116,11 @@ static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page)
|
||||||
__tlb_remove_tlb_entry(tlb, ptep, address); \
|
__tlb_remove_tlb_entry(tlb, ptep, address); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define pte_free_tlb(tlb, ptep) __pte_free_tlb(tlb, ptep)
|
#define pte_free_tlb(tlb, ptep, addr) __pte_free_tlb(tlb, ptep, addr)
|
||||||
|
|
||||||
#define pud_free_tlb(tlb, pudp) __pud_free_tlb(tlb, pudp)
|
#define pud_free_tlb(tlb, pudp, addr) __pud_free_tlb(tlb, pudp, addr)
|
||||||
|
|
||||||
#define pmd_free_tlb(tlb, pmdp) __pmd_free_tlb(tlb, pmdp)
|
#define pmd_free_tlb(tlb, pmdp, addr) __pmd_free_tlb(tlb, pmdp, addr)
|
||||||
|
|
||||||
#define tlb_migrate_finish(mm) do {} while (0)
|
#define tlb_migrate_finish(mm) do {} while (0)
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,13 @@ static inline void pte_free(struct mm_struct *mm, struct page *pte)
|
||||||
__free_page(pte);
|
__free_page(pte);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void __pte_free_tlb(struct mmu_gather *tlb, struct page *pte);
|
extern void ___pte_free_tlb(struct mmu_gather *tlb, struct page *pte);
|
||||||
|
|
||||||
|
static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *pte,
|
||||||
|
unsigned long address)
|
||||||
|
{
|
||||||
|
___pte_free_tlb(tlb, pte);
|
||||||
|
}
|
||||||
|
|
||||||
static inline void pmd_populate_kernel(struct mm_struct *mm,
|
static inline void pmd_populate_kernel(struct mm_struct *mm,
|
||||||
pmd_t *pmd, pte_t *pte)
|
pmd_t *pmd, pte_t *pte)
|
||||||
|
@ -78,7 +84,13 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
|
||||||
free_page((unsigned long)pmd);
|
free_page((unsigned long)pmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd);
|
extern void ___pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd);
|
||||||
|
|
||||||
|
static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
|
||||||
|
unsigned long adddress)
|
||||||
|
{
|
||||||
|
___pmd_free_tlb(tlb, pmd);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_X86_PAE
|
#ifdef CONFIG_X86_PAE
|
||||||
extern void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd);
|
extern void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd);
|
||||||
|
@ -108,7 +120,14 @@ static inline void pud_free(struct mm_struct *mm, pud_t *pud)
|
||||||
free_page((unsigned long)pud);
|
free_page((unsigned long)pud);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pud);
|
extern void ___pud_free_tlb(struct mmu_gather *tlb, pud_t *pud);
|
||||||
|
|
||||||
|
static inline void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pud,
|
||||||
|
unsigned long address)
|
||||||
|
{
|
||||||
|
___pud_free_tlb(tlb, pud);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* PAGETABLE_LEVELS > 3 */
|
#endif /* PAGETABLE_LEVELS > 3 */
|
||||||
#endif /* PAGETABLE_LEVELS > 2 */
|
#endif /* PAGETABLE_LEVELS > 2 */
|
||||||
|
|
||||||
|
|
|
@ -212,9 +212,9 @@ extern int __get_user_bad(void);
|
||||||
: "A" ((typeof(*(ptr)))(x)), "c" (ptr) : "ebx")
|
: "A" ((typeof(*(ptr)))(x)), "c" (ptr) : "ebx")
|
||||||
#else
|
#else
|
||||||
#define __put_user_asm_u64(x, ptr, retval, errret) \
|
#define __put_user_asm_u64(x, ptr, retval, errret) \
|
||||||
__put_user_asm(x, ptr, retval, "q", "", "Zr", errret)
|
__put_user_asm(x, ptr, retval, "q", "", "er", errret)
|
||||||
#define __put_user_asm_ex_u64(x, addr) \
|
#define __put_user_asm_ex_u64(x, addr) \
|
||||||
__put_user_asm_ex(x, addr, "q", "", "Zr")
|
__put_user_asm_ex(x, addr, "q", "", "er")
|
||||||
#define __put_user_x8(x, ptr, __ret_pu) __put_user_x(8, x, ptr, __ret_pu)
|
#define __put_user_x8(x, ptr, __ret_pu) __put_user_x(8, x, ptr, __ret_pu)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -88,11 +88,11 @@ int __copy_to_user(void __user *dst, const void *src, unsigned size)
|
||||||
ret, "l", "k", "ir", 4);
|
ret, "l", "k", "ir", 4);
|
||||||
return ret;
|
return ret;
|
||||||
case 8:__put_user_asm(*(u64 *)src, (u64 __user *)dst,
|
case 8:__put_user_asm(*(u64 *)src, (u64 __user *)dst,
|
||||||
ret, "q", "", "ir", 8);
|
ret, "q", "", "er", 8);
|
||||||
return ret;
|
return ret;
|
||||||
case 10:
|
case 10:
|
||||||
__put_user_asm(*(u64 *)src, (u64 __user *)dst,
|
__put_user_asm(*(u64 *)src, (u64 __user *)dst,
|
||||||
ret, "q", "", "ir", 10);
|
ret, "q", "", "er", 10);
|
||||||
if (unlikely(ret))
|
if (unlikely(ret))
|
||||||
return ret;
|
return ret;
|
||||||
asm("":::"memory");
|
asm("":::"memory");
|
||||||
|
@ -101,12 +101,12 @@ int __copy_to_user(void __user *dst, const void *src, unsigned size)
|
||||||
return ret;
|
return ret;
|
||||||
case 16:
|
case 16:
|
||||||
__put_user_asm(*(u64 *)src, (u64 __user *)dst,
|
__put_user_asm(*(u64 *)src, (u64 __user *)dst,
|
||||||
ret, "q", "", "ir", 16);
|
ret, "q", "", "er", 16);
|
||||||
if (unlikely(ret))
|
if (unlikely(ret))
|
||||||
return ret;
|
return ret;
|
||||||
asm("":::"memory");
|
asm("":::"memory");
|
||||||
__put_user_asm(1[(u64 *)src], 1 + (u64 __user *)dst,
|
__put_user_asm(1[(u64 *)src], 1 + (u64 __user *)dst,
|
||||||
ret, "q", "", "ir", 8);
|
ret, "q", "", "er", 8);
|
||||||
return ret;
|
return ret;
|
||||||
default:
|
default:
|
||||||
return copy_user_generic((__force void *)dst, src, size);
|
return copy_user_generic((__force void *)dst, src, size);
|
||||||
|
@ -157,7 +157,7 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
|
||||||
ret, "q", "", "=r", 8);
|
ret, "q", "", "=r", 8);
|
||||||
if (likely(!ret))
|
if (likely(!ret))
|
||||||
__put_user_asm(tmp, (u64 __user *)dst,
|
__put_user_asm(tmp, (u64 __user *)dst,
|
||||||
ret, "q", "", "ir", 8);
|
ret, "q", "", "er", 8);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -356,7 +356,7 @@ static void __cpuinit early_init_amd(struct cpuinfo_x86 *c)
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_PCI)
|
#if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_PCI)
|
||||||
/* check CPU config space for extended APIC ID */
|
/* check CPU config space for extended APIC ID */
|
||||||
if (c->x86 >= 0xf) {
|
if (cpu_has_apic && c->x86 >= 0xf) {
|
||||||
unsigned int val;
|
unsigned int val;
|
||||||
val = read_pci_config(0, 24, 0, 0x68);
|
val = read_pci_config(0, 24, 0, 0x68);
|
||||||
if ((val & ((1 << 17) | (1 << 18))) == ((1 << 17) | (1 << 18)))
|
if ((val & ((1 << 17) | (1 << 18))) == ((1 << 17) | (1 << 18)))
|
||||||
|
|
|
@ -1692,17 +1692,15 @@ static ssize_t set_trigger(struct sys_device *s, struct sysdev_attribute *attr,
|
||||||
const char *buf, size_t siz)
|
const char *buf, size_t siz)
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
int len;
|
|
||||||
|
|
||||||
strncpy(mce_helper, buf, sizeof(mce_helper));
|
strncpy(mce_helper, buf, sizeof(mce_helper));
|
||||||
mce_helper[sizeof(mce_helper)-1] = 0;
|
mce_helper[sizeof(mce_helper)-1] = 0;
|
||||||
len = strlen(mce_helper);
|
|
||||||
p = strchr(mce_helper, '\n');
|
p = strchr(mce_helper, '\n');
|
||||||
|
|
||||||
if (*p)
|
if (p)
|
||||||
*p = 0;
|
*p = 0;
|
||||||
|
|
||||||
return len;
|
return strlen(mce_helper) + !!p;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t set_ignore_ce(struct sys_device *s,
|
static ssize_t set_ignore_ce(struct sys_device *s,
|
||||||
|
|
|
@ -65,6 +65,52 @@ static DEFINE_PER_CPU(struct cpu_hw_counters, cpu_hw_counters) = {
|
||||||
.enabled = 1,
|
.enabled = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Not sure about some of these
|
||||||
|
*/
|
||||||
|
static const u64 p6_perfmon_event_map[] =
|
||||||
|
{
|
||||||
|
[PERF_COUNT_HW_CPU_CYCLES] = 0x0079,
|
||||||
|
[PERF_COUNT_HW_INSTRUCTIONS] = 0x00c0,
|
||||||
|
[PERF_COUNT_HW_CACHE_REFERENCES] = 0x0000,
|
||||||
|
[PERF_COUNT_HW_CACHE_MISSES] = 0x0000,
|
||||||
|
[PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = 0x00c4,
|
||||||
|
[PERF_COUNT_HW_BRANCH_MISSES] = 0x00c5,
|
||||||
|
[PERF_COUNT_HW_BUS_CYCLES] = 0x0062,
|
||||||
|
};
|
||||||
|
|
||||||
|
static u64 p6_pmu_event_map(int event)
|
||||||
|
{
|
||||||
|
return p6_perfmon_event_map[event];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Counter setting that is specified not to count anything.
|
||||||
|
* We use this to effectively disable a counter.
|
||||||
|
*
|
||||||
|
* L2_RQSTS with 0 MESI unit mask.
|
||||||
|
*/
|
||||||
|
#define P6_NOP_COUNTER 0x0000002EULL
|
||||||
|
|
||||||
|
static u64 p6_pmu_raw_event(u64 event)
|
||||||
|
{
|
||||||
|
#define P6_EVNTSEL_EVENT_MASK 0x000000FFULL
|
||||||
|
#define P6_EVNTSEL_UNIT_MASK 0x0000FF00ULL
|
||||||
|
#define P6_EVNTSEL_EDGE_MASK 0x00040000ULL
|
||||||
|
#define P6_EVNTSEL_INV_MASK 0x00800000ULL
|
||||||
|
#define P6_EVNTSEL_COUNTER_MASK 0xFF000000ULL
|
||||||
|
|
||||||
|
#define P6_EVNTSEL_MASK \
|
||||||
|
(P6_EVNTSEL_EVENT_MASK | \
|
||||||
|
P6_EVNTSEL_UNIT_MASK | \
|
||||||
|
P6_EVNTSEL_EDGE_MASK | \
|
||||||
|
P6_EVNTSEL_INV_MASK | \
|
||||||
|
P6_EVNTSEL_COUNTER_MASK)
|
||||||
|
|
||||||
|
return event & P6_EVNTSEL_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Intel PerfMon v3. Used on Core2 and later.
|
* Intel PerfMon v3. Used on Core2 and later.
|
||||||
*/
|
*/
|
||||||
|
@ -666,6 +712,7 @@ static int __hw_perf_counter_init(struct perf_counter *counter)
|
||||||
{
|
{
|
||||||
struct perf_counter_attr *attr = &counter->attr;
|
struct perf_counter_attr *attr = &counter->attr;
|
||||||
struct hw_perf_counter *hwc = &counter->hw;
|
struct hw_perf_counter *hwc = &counter->hw;
|
||||||
|
u64 config;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (!x86_pmu_initialized())
|
if (!x86_pmu_initialized())
|
||||||
|
@ -718,14 +765,40 @@ static int __hw_perf_counter_init(struct perf_counter *counter)
|
||||||
|
|
||||||
if (attr->config >= x86_pmu.max_events)
|
if (attr->config >= x86_pmu.max_events)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The generic map:
|
* The generic map:
|
||||||
*/
|
*/
|
||||||
hwc->config |= x86_pmu.event_map(attr->config);
|
config = x86_pmu.event_map(attr->config);
|
||||||
|
|
||||||
|
if (config == 0)
|
||||||
|
return -ENOENT;
|
||||||
|
|
||||||
|
if (config == -1LL)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
hwc->config |= config;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void p6_pmu_disable_all(void)
|
||||||
|
{
|
||||||
|
struct cpu_hw_counters *cpuc = &__get_cpu_var(cpu_hw_counters);
|
||||||
|
u64 val;
|
||||||
|
|
||||||
|
if (!cpuc->enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cpuc->enabled = 0;
|
||||||
|
barrier();
|
||||||
|
|
||||||
|
/* p6 only has one enable register */
|
||||||
|
rdmsrl(MSR_P6_EVNTSEL0, val);
|
||||||
|
val &= ~ARCH_PERFMON_EVENTSEL0_ENABLE;
|
||||||
|
wrmsrl(MSR_P6_EVNTSEL0, val);
|
||||||
|
}
|
||||||
|
|
||||||
static void intel_pmu_disable_all(void)
|
static void intel_pmu_disable_all(void)
|
||||||
{
|
{
|
||||||
wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, 0);
|
wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, 0);
|
||||||
|
@ -767,6 +840,23 @@ void hw_perf_disable(void)
|
||||||
return x86_pmu.disable_all();
|
return x86_pmu.disable_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void p6_pmu_enable_all(void)
|
||||||
|
{
|
||||||
|
struct cpu_hw_counters *cpuc = &__get_cpu_var(cpu_hw_counters);
|
||||||
|
unsigned long val;
|
||||||
|
|
||||||
|
if (cpuc->enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cpuc->enabled = 1;
|
||||||
|
barrier();
|
||||||
|
|
||||||
|
/* p6 only has one enable register */
|
||||||
|
rdmsrl(MSR_P6_EVNTSEL0, val);
|
||||||
|
val |= ARCH_PERFMON_EVENTSEL0_ENABLE;
|
||||||
|
wrmsrl(MSR_P6_EVNTSEL0, val);
|
||||||
|
}
|
||||||
|
|
||||||
static void intel_pmu_enable_all(void)
|
static void intel_pmu_enable_all(void)
|
||||||
{
|
{
|
||||||
wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, x86_pmu.intel_ctrl);
|
wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, x86_pmu.intel_ctrl);
|
||||||
|
@ -784,13 +874,13 @@ static void amd_pmu_enable_all(void)
|
||||||
barrier();
|
barrier();
|
||||||
|
|
||||||
for (idx = 0; idx < x86_pmu.num_counters; idx++) {
|
for (idx = 0; idx < x86_pmu.num_counters; idx++) {
|
||||||
|
struct perf_counter *counter = cpuc->counters[idx];
|
||||||
u64 val;
|
u64 val;
|
||||||
|
|
||||||
if (!test_bit(idx, cpuc->active_mask))
|
if (!test_bit(idx, cpuc->active_mask))
|
||||||
continue;
|
continue;
|
||||||
rdmsrl(MSR_K7_EVNTSEL0 + idx, val);
|
|
||||||
if (val & ARCH_PERFMON_EVENTSEL0_ENABLE)
|
val = counter->hw.config;
|
||||||
continue;
|
|
||||||
val |= ARCH_PERFMON_EVENTSEL0_ENABLE;
|
val |= ARCH_PERFMON_EVENTSEL0_ENABLE;
|
||||||
wrmsrl(MSR_K7_EVNTSEL0 + idx, val);
|
wrmsrl(MSR_K7_EVNTSEL0 + idx, val);
|
||||||
}
|
}
|
||||||
|
@ -819,16 +909,13 @@ static inline void intel_pmu_ack_status(u64 ack)
|
||||||
|
|
||||||
static inline void x86_pmu_enable_counter(struct hw_perf_counter *hwc, int idx)
|
static inline void x86_pmu_enable_counter(struct hw_perf_counter *hwc, int idx)
|
||||||
{
|
{
|
||||||
int err;
|
(void)checking_wrmsrl(hwc->config_base + idx,
|
||||||
err = checking_wrmsrl(hwc->config_base + idx,
|
|
||||||
hwc->config | ARCH_PERFMON_EVENTSEL0_ENABLE);
|
hwc->config | ARCH_PERFMON_EVENTSEL0_ENABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void x86_pmu_disable_counter(struct hw_perf_counter *hwc, int idx)
|
static inline void x86_pmu_disable_counter(struct hw_perf_counter *hwc, int idx)
|
||||||
{
|
{
|
||||||
int err;
|
(void)checking_wrmsrl(hwc->config_base + idx, hwc->config);
|
||||||
err = checking_wrmsrl(hwc->config_base + idx,
|
|
||||||
hwc->config);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@ -836,13 +923,24 @@ intel_pmu_disable_fixed(struct hw_perf_counter *hwc, int __idx)
|
||||||
{
|
{
|
||||||
int idx = __idx - X86_PMC_IDX_FIXED;
|
int idx = __idx - X86_PMC_IDX_FIXED;
|
||||||
u64 ctrl_val, mask;
|
u64 ctrl_val, mask;
|
||||||
int err;
|
|
||||||
|
|
||||||
mask = 0xfULL << (idx * 4);
|
mask = 0xfULL << (idx * 4);
|
||||||
|
|
||||||
rdmsrl(hwc->config_base, ctrl_val);
|
rdmsrl(hwc->config_base, ctrl_val);
|
||||||
ctrl_val &= ~mask;
|
ctrl_val &= ~mask;
|
||||||
err = checking_wrmsrl(hwc->config_base, ctrl_val);
|
(void)checking_wrmsrl(hwc->config_base, ctrl_val);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
p6_pmu_disable_counter(struct hw_perf_counter *hwc, int idx)
|
||||||
|
{
|
||||||
|
struct cpu_hw_counters *cpuc = &__get_cpu_var(cpu_hw_counters);
|
||||||
|
u64 val = P6_NOP_COUNTER;
|
||||||
|
|
||||||
|
if (cpuc->enabled)
|
||||||
|
val |= ARCH_PERFMON_EVENTSEL0_ENABLE;
|
||||||
|
|
||||||
|
(void)checking_wrmsrl(hwc->config_base + idx, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@ -943,6 +1041,19 @@ intel_pmu_enable_fixed(struct hw_perf_counter *hwc, int __idx)
|
||||||
err = checking_wrmsrl(hwc->config_base, ctrl_val);
|
err = checking_wrmsrl(hwc->config_base, ctrl_val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void p6_pmu_enable_counter(struct hw_perf_counter *hwc, int idx)
|
||||||
|
{
|
||||||
|
struct cpu_hw_counters *cpuc = &__get_cpu_var(cpu_hw_counters);
|
||||||
|
u64 val;
|
||||||
|
|
||||||
|
val = hwc->config;
|
||||||
|
if (cpuc->enabled)
|
||||||
|
val |= ARCH_PERFMON_EVENTSEL0_ENABLE;
|
||||||
|
|
||||||
|
(void)checking_wrmsrl(hwc->config_base + idx, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void intel_pmu_enable_counter(struct hw_perf_counter *hwc, int idx)
|
static void intel_pmu_enable_counter(struct hw_perf_counter *hwc, int idx)
|
||||||
{
|
{
|
||||||
if (unlikely(hwc->config_base == MSR_ARCH_PERFMON_FIXED_CTR_CTRL)) {
|
if (unlikely(hwc->config_base == MSR_ARCH_PERFMON_FIXED_CTR_CTRL)) {
|
||||||
|
@ -959,8 +1070,6 @@ static void amd_pmu_enable_counter(struct hw_perf_counter *hwc, int idx)
|
||||||
|
|
||||||
if (cpuc->enabled)
|
if (cpuc->enabled)
|
||||||
x86_pmu_enable_counter(hwc, idx);
|
x86_pmu_enable_counter(hwc, idx);
|
||||||
else
|
|
||||||
x86_pmu_disable_counter(hwc, idx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -1176,6 +1285,49 @@ static void intel_pmu_reset(void)
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int p6_pmu_handle_irq(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
struct perf_sample_data data;
|
||||||
|
struct cpu_hw_counters *cpuc;
|
||||||
|
struct perf_counter *counter;
|
||||||
|
struct hw_perf_counter *hwc;
|
||||||
|
int idx, handled = 0;
|
||||||
|
u64 val;
|
||||||
|
|
||||||
|
data.regs = regs;
|
||||||
|
data.addr = 0;
|
||||||
|
|
||||||
|
cpuc = &__get_cpu_var(cpu_hw_counters);
|
||||||
|
|
||||||
|
for (idx = 0; idx < x86_pmu.num_counters; idx++) {
|
||||||
|
if (!test_bit(idx, cpuc->active_mask))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
counter = cpuc->counters[idx];
|
||||||
|
hwc = &counter->hw;
|
||||||
|
|
||||||
|
val = x86_perf_counter_update(counter, hwc, idx);
|
||||||
|
if (val & (1ULL << (x86_pmu.counter_bits - 1)))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* counter overflow
|
||||||
|
*/
|
||||||
|
handled = 1;
|
||||||
|
data.period = counter->hw.last_period;
|
||||||
|
|
||||||
|
if (!x86_perf_counter_set_period(counter, hwc, idx))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (perf_counter_overflow(counter, 1, &data))
|
||||||
|
p6_pmu_disable_counter(hwc, idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (handled)
|
||||||
|
inc_irq_stat(apic_perf_irqs);
|
||||||
|
|
||||||
|
return handled;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This handler is triggered by the local APIC, so the APIC IRQ handling
|
* This handler is triggered by the local APIC, so the APIC IRQ handling
|
||||||
|
@ -1185,14 +1337,13 @@ static int intel_pmu_handle_irq(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct perf_sample_data data;
|
struct perf_sample_data data;
|
||||||
struct cpu_hw_counters *cpuc;
|
struct cpu_hw_counters *cpuc;
|
||||||
int bit, cpu, loops;
|
int bit, loops;
|
||||||
u64 ack, status;
|
u64 ack, status;
|
||||||
|
|
||||||
data.regs = regs;
|
data.regs = regs;
|
||||||
data.addr = 0;
|
data.addr = 0;
|
||||||
|
|
||||||
cpu = smp_processor_id();
|
cpuc = &__get_cpu_var(cpu_hw_counters);
|
||||||
cpuc = &per_cpu(cpu_hw_counters, cpu);
|
|
||||||
|
|
||||||
perf_disable();
|
perf_disable();
|
||||||
status = intel_pmu_get_status();
|
status = intel_pmu_get_status();
|
||||||
|
@ -1249,14 +1400,13 @@ static int amd_pmu_handle_irq(struct pt_regs *regs)
|
||||||
struct cpu_hw_counters *cpuc;
|
struct cpu_hw_counters *cpuc;
|
||||||
struct perf_counter *counter;
|
struct perf_counter *counter;
|
||||||
struct hw_perf_counter *hwc;
|
struct hw_perf_counter *hwc;
|
||||||
int cpu, idx, handled = 0;
|
int idx, handled = 0;
|
||||||
u64 val;
|
u64 val;
|
||||||
|
|
||||||
data.regs = regs;
|
data.regs = regs;
|
||||||
data.addr = 0;
|
data.addr = 0;
|
||||||
|
|
||||||
cpu = smp_processor_id();
|
cpuc = &__get_cpu_var(cpu_hw_counters);
|
||||||
cpuc = &per_cpu(cpu_hw_counters, cpu);
|
|
||||||
|
|
||||||
for (idx = 0; idx < x86_pmu.num_counters; idx++) {
|
for (idx = 0; idx < x86_pmu.num_counters; idx++) {
|
||||||
if (!test_bit(idx, cpuc->active_mask))
|
if (!test_bit(idx, cpuc->active_mask))
|
||||||
|
@ -1353,6 +1503,32 @@ static __read_mostly struct notifier_block perf_counter_nmi_notifier = {
|
||||||
.priority = 1
|
.priority = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct x86_pmu p6_pmu = {
|
||||||
|
.name = "p6",
|
||||||
|
.handle_irq = p6_pmu_handle_irq,
|
||||||
|
.disable_all = p6_pmu_disable_all,
|
||||||
|
.enable_all = p6_pmu_enable_all,
|
||||||
|
.enable = p6_pmu_enable_counter,
|
||||||
|
.disable = p6_pmu_disable_counter,
|
||||||
|
.eventsel = MSR_P6_EVNTSEL0,
|
||||||
|
.perfctr = MSR_P6_PERFCTR0,
|
||||||
|
.event_map = p6_pmu_event_map,
|
||||||
|
.raw_event = p6_pmu_raw_event,
|
||||||
|
.max_events = ARRAY_SIZE(p6_perfmon_event_map),
|
||||||
|
.max_period = (1ULL << 31) - 1,
|
||||||
|
.version = 0,
|
||||||
|
.num_counters = 2,
|
||||||
|
/*
|
||||||
|
* Counters have 40 bits implemented. However they are designed such
|
||||||
|
* that bits [32-39] are sign extensions of bit 31. As such the
|
||||||
|
* effective width of a counter for P6-like PMU is 32 bits only.
|
||||||
|
*
|
||||||
|
* See IA-32 Intel Architecture Software developer manual Vol 3B
|
||||||
|
*/
|
||||||
|
.counter_bits = 32,
|
||||||
|
.counter_mask = (1ULL << 32) - 1,
|
||||||
|
};
|
||||||
|
|
||||||
static struct x86_pmu intel_pmu = {
|
static struct x86_pmu intel_pmu = {
|
||||||
.name = "Intel",
|
.name = "Intel",
|
||||||
.handle_irq = intel_pmu_handle_irq,
|
.handle_irq = intel_pmu_handle_irq,
|
||||||
|
@ -1392,6 +1568,37 @@ static struct x86_pmu amd_pmu = {
|
||||||
.max_period = (1ULL << 47) - 1,
|
.max_period = (1ULL << 47) - 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int p6_pmu_init(void)
|
||||||
|
{
|
||||||
|
switch (boot_cpu_data.x86_model) {
|
||||||
|
case 1:
|
||||||
|
case 3: /* Pentium Pro */
|
||||||
|
case 5:
|
||||||
|
case 6: /* Pentium II */
|
||||||
|
case 7:
|
||||||
|
case 8:
|
||||||
|
case 11: /* Pentium III */
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
case 13:
|
||||||
|
/* Pentium M */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
pr_cont("unsupported p6 CPU model %d ",
|
||||||
|
boot_cpu_data.x86_model);
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cpu_has_apic) {
|
||||||
|
pr_info("no Local APIC, try rebooting with lapic");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
x86_pmu = p6_pmu;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int intel_pmu_init(void)
|
static int intel_pmu_init(void)
|
||||||
{
|
{
|
||||||
union cpuid10_edx edx;
|
union cpuid10_edx edx;
|
||||||
|
@ -1400,8 +1607,14 @@ static int intel_pmu_init(void)
|
||||||
unsigned int ebx;
|
unsigned int ebx;
|
||||||
int version;
|
int version;
|
||||||
|
|
||||||
if (!cpu_has(&boot_cpu_data, X86_FEATURE_ARCH_PERFMON))
|
if (!cpu_has(&boot_cpu_data, X86_FEATURE_ARCH_PERFMON)) {
|
||||||
|
/* check for P6 processor family */
|
||||||
|
if (boot_cpu_data.x86 == 6) {
|
||||||
|
return p6_pmu_init();
|
||||||
|
} else {
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check whether the Architectural PerfMon supports
|
* Check whether the Architectural PerfMon supports
|
||||||
|
|
|
@ -187,7 +187,7 @@ static void __init apic_intr_init(void)
|
||||||
#ifdef CONFIG_X86_THERMAL_VECTOR
|
#ifdef CONFIG_X86_THERMAL_VECTOR
|
||||||
alloc_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt);
|
alloc_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt);
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_X86_THRESHOLD
|
#ifdef CONFIG_X86_MCE_THRESHOLD
|
||||||
alloc_intr_gate(THRESHOLD_APIC_VECTOR, threshold_interrupt);
|
alloc_intr_gate(THRESHOLD_APIC_VECTOR, threshold_interrupt);
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_X86_NEW_MCE) && defined(CONFIG_X86_LOCAL_APIC)
|
#if defined(CONFIG_X86_NEW_MCE) && defined(CONFIG_X86_LOCAL_APIC)
|
||||||
|
|
|
@ -347,7 +347,7 @@ static irqreturn_t mfgpt_tick(int irq, void *dev_id)
|
||||||
|
|
||||||
static struct irqaction mfgptirq = {
|
static struct irqaction mfgptirq = {
|
||||||
.handler = mfgpt_tick,
|
.handler = mfgpt_tick,
|
||||||
.flags = IRQF_DISABLED | IRQF_NOBALANCING,
|
.flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_TIMER,
|
||||||
.name = "mfgpt-timer"
|
.name = "mfgpt-timer"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -249,6 +249,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
|
||||||
DMI_MATCH(DMI_PRODUCT_NAME, "VGN-Z540N"),
|
DMI_MATCH(DMI_PRODUCT_NAME, "VGN-Z540N"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{ /* Handle problems with rebooting on CompuLab SBC-FITPC2 */
|
||||||
|
.callback = set_bios_reboot,
|
||||||
|
.ident = "CompuLab SBC-FITPC2",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "CompuLab"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "SBC-FITPC2"),
|
||||||
|
},
|
||||||
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -672,6 +672,19 @@ static struct dmi_system_id __initdata bad_bios_dmi_table[] = {
|
||||||
DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies"),
|
DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* AMI BIOS with low memory corruption was found on Intel DG45ID board.
|
||||||
|
* It hase different DMI_BIOS_VENDOR = "Intel Corp.", for now we will
|
||||||
|
* match only DMI_BOARD_NAME and see if there is more bad products
|
||||||
|
* with this vendor.
|
||||||
|
*/
|
||||||
|
.callback = dmi_low_memory_corruption,
|
||||||
|
.ident = "AMI BIOS",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_BOARD_NAME, "DG45ID"),
|
||||||
|
},
|
||||||
|
},
|
||||||
#endif
|
#endif
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
|
@ -112,11 +112,6 @@ SECTIONS
|
||||||
_sdata = .;
|
_sdata = .;
|
||||||
DATA_DATA
|
DATA_DATA
|
||||||
CONSTRUCTORS
|
CONSTRUCTORS
|
||||||
|
|
||||||
#ifdef CONFIG_X86_64
|
|
||||||
/* End of data section */
|
|
||||||
_edata = .;
|
|
||||||
#endif
|
|
||||||
} :data
|
} :data
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
|
@ -156,10 +151,8 @@ SECTIONS
|
||||||
.data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) {
|
.data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) {
|
||||||
*(.data.read_mostly)
|
*(.data.read_mostly)
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
|
||||||
/* End of data section */
|
/* End of data section */
|
||||||
_edata = .;
|
_edata = .;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
|
|
|
@ -25,7 +25,7 @@ pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address)
|
||||||
return pte;
|
return pte;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __pte_free_tlb(struct mmu_gather *tlb, struct page *pte)
|
void ___pte_free_tlb(struct mmu_gather *tlb, struct page *pte)
|
||||||
{
|
{
|
||||||
pgtable_page_dtor(pte);
|
pgtable_page_dtor(pte);
|
||||||
paravirt_release_pte(page_to_pfn(pte));
|
paravirt_release_pte(page_to_pfn(pte));
|
||||||
|
@ -33,14 +33,14 @@ void __pte_free_tlb(struct mmu_gather *tlb, struct page *pte)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if PAGETABLE_LEVELS > 2
|
#if PAGETABLE_LEVELS > 2
|
||||||
void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd)
|
void ___pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd)
|
||||||
{
|
{
|
||||||
paravirt_release_pmd(__pa(pmd) >> PAGE_SHIFT);
|
paravirt_release_pmd(__pa(pmd) >> PAGE_SHIFT);
|
||||||
tlb_remove_page(tlb, virt_to_page(pmd));
|
tlb_remove_page(tlb, virt_to_page(pmd));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if PAGETABLE_LEVELS > 3
|
#if PAGETABLE_LEVELS > 3
|
||||||
void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pud)
|
void ___pud_free_tlb(struct mmu_gather *tlb, pud_t *pud)
|
||||||
{
|
{
|
||||||
paravirt_release_pud(__pa(pud) >> PAGE_SHIFT);
|
paravirt_release_pud(__pa(pud) >> PAGE_SHIFT);
|
||||||
tlb_remove_page(tlb, virt_to_page(pud));
|
tlb_remove_page(tlb, virt_to_page(pud));
|
||||||
|
|
|
@ -79,8 +79,10 @@ static __init void bad_srat(void)
|
||||||
acpi_numa = -1;
|
acpi_numa = -1;
|
||||||
for (i = 0; i < MAX_LOCAL_APIC; i++)
|
for (i = 0; i < MAX_LOCAL_APIC; i++)
|
||||||
apicid_to_node[i] = NUMA_NO_NODE;
|
apicid_to_node[i] = NUMA_NO_NODE;
|
||||||
for (i = 0; i < MAX_NUMNODES; i++)
|
for (i = 0; i < MAX_NUMNODES; i++) {
|
||||||
nodes_add[i].start = nodes[i].end = 0;
|
nodes[i].start = nodes[i].end = 0;
|
||||||
|
nodes_add[i].start = nodes_add[i].end = 0;
|
||||||
|
}
|
||||||
remove_all_active_ranges();
|
remove_all_active_ranges();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,6 @@
|
||||||
|
|
||||||
#include <asm-generic/tlb.h>
|
#include <asm-generic/tlb.h>
|
||||||
|
|
||||||
#define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, pte)
|
#define __pte_free_tlb(tlb, pte, address) pte_free((tlb)->mm, pte)
|
||||||
|
|
||||||
#endif /* _XTENSA_TLB_H */
|
#endif /* _XTENSA_TLB_H */
|
||||||
|
|
|
@ -16,9 +16,9 @@ struct queue_sysfs_entry {
|
||||||
};
|
};
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
queue_var_show(unsigned int var, char *page)
|
queue_var_show(unsigned long var, char *page)
|
||||||
{
|
{
|
||||||
return sprintf(page, "%d\n", var);
|
return sprintf(page, "%lu\n", var);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
|
@ -77,7 +77,8 @@ queue_requests_store(struct request_queue *q, const char *page, size_t count)
|
||||||
|
|
||||||
static ssize_t queue_ra_show(struct request_queue *q, char *page)
|
static ssize_t queue_ra_show(struct request_queue *q, char *page)
|
||||||
{
|
{
|
||||||
int ra_kb = q->backing_dev_info.ra_pages << (PAGE_CACHE_SHIFT - 10);
|
unsigned long ra_kb = q->backing_dev_info.ra_pages <<
|
||||||
|
(PAGE_CACHE_SHIFT - 10);
|
||||||
|
|
||||||
return queue_var_show(ra_kb, (page));
|
return queue_var_show(ra_kb, (page));
|
||||||
}
|
}
|
||||||
|
@ -189,9 +190,9 @@ static ssize_t queue_nomerges_store(struct request_queue *q, const char *page,
|
||||||
|
|
||||||
static ssize_t queue_rq_affinity_show(struct request_queue *q, char *page)
|
static ssize_t queue_rq_affinity_show(struct request_queue *q, char *page)
|
||||||
{
|
{
|
||||||
unsigned int set = test_bit(QUEUE_FLAG_SAME_COMP, &q->queue_flags);
|
bool set = test_bit(QUEUE_FLAG_SAME_COMP, &q->queue_flags);
|
||||||
|
|
||||||
return queue_var_show(set != 0, page);
|
return queue_var_show(set, page);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
|
|
|
@ -101,11 +101,16 @@ int elv_rq_merge_ok(struct request *rq, struct bio *bio)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Don't merge if failfast settings don't match
|
* Don't merge if failfast settings don't match.
|
||||||
|
*
|
||||||
|
* FIXME: The negation in front of each condition is necessary
|
||||||
|
* because bio and request flags use different bit positions
|
||||||
|
* and the accessors return those bits directly. This
|
||||||
|
* ugliness will soon go away.
|
||||||
*/
|
*/
|
||||||
if (bio_failfast_dev(bio) != blk_failfast_dev(rq) ||
|
if (!bio_failfast_dev(bio) != !blk_failfast_dev(rq) ||
|
||||||
bio_failfast_transport(bio) != blk_failfast_transport(rq) ||
|
!bio_failfast_transport(bio) != !blk_failfast_transport(rq) ||
|
||||||
bio_failfast_driver(bio) != blk_failfast_driver(rq))
|
!bio_failfast_driver(bio) != !blk_failfast_driver(rq))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!elv_iosched_allow_merge(rq, bio))
|
if (!elv_iosched_allow_merge(rq, bio))
|
||||||
|
|
|
@ -1627,7 +1627,7 @@ static int fd_ioctl(struct block_device *bdev, fmode_t mode,
|
||||||
drive, dtp->blocks, dtp->spt, dtp->stretch);
|
drive, dtp->blocks, dtp->spt, dtp->stretch);
|
||||||
|
|
||||||
/* sanity check */
|
/* sanity check */
|
||||||
if (!dtp || setprm.track != dtp->blocks/dtp->spt/2 ||
|
if (setprm.track != dtp->blocks/dtp->spt/2 ||
|
||||||
setprm.head != 2) {
|
setprm.head != 2) {
|
||||||
redo_fd_request();
|
redo_fd_request();
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
@ -427,7 +427,12 @@ static unsigned int features[] = {
|
||||||
VIRTIO_BLK_F_SCSI, VIRTIO_BLK_F_IDENTIFY
|
VIRTIO_BLK_F_SCSI, VIRTIO_BLK_F_IDENTIFY
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct virtio_driver virtio_blk = {
|
/*
|
||||||
|
* virtio_blk causes spurious section mismatch warning by
|
||||||
|
* simultaneously referring to a __devinit and a __devexit function.
|
||||||
|
* Use __refdata to avoid this warning.
|
||||||
|
*/
|
||||||
|
static struct virtio_driver __refdata virtio_blk = {
|
||||||
.feature_table = features,
|
.feature_table = features,
|
||||||
.feature_table_size = ARRAY_SIZE(features),
|
.feature_table_size = ARRAY_SIZE(features),
|
||||||
.driver.name = KBUILD_MODNAME,
|
.driver.name = KBUILD_MODNAME,
|
||||||
|
|
|
@ -374,7 +374,7 @@ z2_init(void)
|
||||||
static void __exit z2_exit(void)
|
static void __exit z2_exit(void)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
blk_unregister_region(MKDEV(Z2RAM_MAJOR, 0), 256);
|
blk_unregister_region(MKDEV(Z2RAM_MAJOR, 0), Z2MINOR_COUNT);
|
||||||
unregister_blkdev(Z2RAM_MAJOR, DEVICE_NAME);
|
unregister_blkdev(Z2RAM_MAJOR, DEVICE_NAME);
|
||||||
del_gendisk(z2ram_gendisk);
|
del_gendisk(z2ram_gendisk);
|
||||||
put_disk(z2ram_gendisk);
|
put_disk(z2ram_gendisk);
|
||||||
|
|
|
@ -52,6 +52,7 @@ static void pty_close(struct tty_struct *tty, struct file *filp)
|
||||||
return;
|
return;
|
||||||
tty->link->packet = 0;
|
tty->link->packet = 0;
|
||||||
set_bit(TTY_OTHER_CLOSED, &tty->link->flags);
|
set_bit(TTY_OTHER_CLOSED, &tty->link->flags);
|
||||||
|
tty_flip_buffer_push(tty->link);
|
||||||
wake_up_interruptible(&tty->link->read_wait);
|
wake_up_interruptible(&tty->link->read_wait);
|
||||||
wake_up_interruptible(&tty->link->write_wait);
|
wake_up_interruptible(&tty->link->write_wait);
|
||||||
if (tty->driver->subtype == PTY_TYPE_MASTER) {
|
if (tty->driver->subtype == PTY_TYPE_MASTER) {
|
||||||
|
@ -207,6 +208,7 @@ static int pty_open(struct tty_struct *tty, struct file *filp)
|
||||||
clear_bit(TTY_OTHER_CLOSED, &tty->link->flags);
|
clear_bit(TTY_OTHER_CLOSED, &tty->link->flags);
|
||||||
set_bit(TTY_THROTTLED, &tty->flags);
|
set_bit(TTY_THROTTLED, &tty->flags);
|
||||||
retval = 0;
|
retval = 0;
|
||||||
|
tty->low_latency = 1;
|
||||||
out:
|
out:
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* cn_queue.c
|
* cn_queue.c
|
||||||
*
|
*
|
||||||
* 2004-2005 Copyright (c) Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
* 2004+ Copyright (c) Evgeniy Polyakov <zbr@ioremap.net>
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* connector.c
|
* connector.c
|
||||||
*
|
*
|
||||||
* 2004-2005 Copyright (c) Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
* 2004+ Copyright (c) Evgeniy Polyakov <zbr@ioremap.net>
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
#include <net/sock.h>
|
#include <net/sock.h>
|
||||||
|
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_AUTHOR("Evgeniy Polyakov <johnpol@2ka.mipt.ru>");
|
MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>");
|
||||||
MODULE_DESCRIPTION("Generic userspace <-> kernelspace connector.");
|
MODULE_DESCRIPTION("Generic userspace <-> kernelspace connector.");
|
||||||
|
|
||||||
static u32 cn_idx = CN_IDX_CONNECTOR;
|
static u32 cn_idx = CN_IDX_CONNECTOR;
|
||||||
|
|
|
@ -970,7 +970,7 @@ static void amd64_read_dct_base_mask(struct amd64_pvt *pvt)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (cs = 0; cs < pvt->num_dcsm; cs++) {
|
for (cs = 0; cs < pvt->num_dcsm; cs++) {
|
||||||
reg = K8_DCSB0 + (cs * 4);
|
reg = K8_DCSM0 + (cs * 4);
|
||||||
err = pci_read_config_dword(pvt->dram_f2_ctl, reg,
|
err = pci_read_config_dword(pvt->dram_f2_ctl, reg,
|
||||||
&pvt->dcsm0[cs]);
|
&pvt->dcsm0[cs]);
|
||||||
if (unlikely(err))
|
if (unlikely(err))
|
||||||
|
|
|
@ -1075,14 +1075,16 @@ EXPORT_SYMBOL_GPL(hid_report_raw_event);
|
||||||
*/
|
*/
|
||||||
int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int interrupt)
|
int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int interrupt)
|
||||||
{
|
{
|
||||||
struct hid_report_enum *report_enum = hid->report_enum + type;
|
struct hid_report_enum *report_enum;
|
||||||
struct hid_driver *hdrv = hid->driver;
|
struct hid_driver *hdrv;
|
||||||
struct hid_report *report;
|
struct hid_report *report;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!hid || !hid->driver)
|
if (!hid || !hid->driver)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
report_enum = hid->report_enum + type;
|
||||||
|
hdrv = hid->driver;
|
||||||
|
|
||||||
if (!size) {
|
if (!size) {
|
||||||
dbg_hid("empty report\n");
|
dbg_hid("empty report\n");
|
||||||
|
|
|
@ -527,8 +527,10 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd,
|
||||||
goto goodreturn;
|
goto goodreturn;
|
||||||
|
|
||||||
case HIDIOCGCOLLECTIONINDEX:
|
case HIDIOCGCOLLECTIONINDEX:
|
||||||
|
i = field->usage[uref->usage_index].collection_index;
|
||||||
|
unlock_kernel();
|
||||||
kfree(uref_multi);
|
kfree(uref_multi);
|
||||||
return field->usage[uref->usage_index].collection_index;
|
return i;
|
||||||
case HIDIOCGUSAGES:
|
case HIDIOCGUSAGES:
|
||||||
for (i = 0; i < uref_multi->num_values; i++)
|
for (i = 0; i < uref_multi->num_values; i++)
|
||||||
uref_multi->values[i] =
|
uref_multi->values[i] =
|
||||||
|
|
|
@ -593,7 +593,11 @@ static int atk_add_sensor(struct atk_data *data, union acpi_object *obj)
|
||||||
sensor->data = data;
|
sensor->data = data;
|
||||||
sensor->id = flags->integer.value;
|
sensor->id = flags->integer.value;
|
||||||
sensor->limit1 = limit1->integer.value;
|
sensor->limit1 = limit1->integer.value;
|
||||||
sensor->limit2 = limit2->integer.value;
|
if (data->old_interface)
|
||||||
|
sensor->limit2 = limit2->integer.value;
|
||||||
|
else
|
||||||
|
/* The upper limit is expressed as delta from lower limit */
|
||||||
|
sensor->limit2 = sensor->limit1 + limit2->integer.value;
|
||||||
|
|
||||||
snprintf(sensor->input_attr_name, ATTR_NAME_SIZE,
|
snprintf(sensor->input_attr_name, ATTR_NAME_SIZE,
|
||||||
"%s%d_input", base_name, start + *num);
|
"%s%d_input", base_name, start + *num);
|
||||||
|
|
|
@ -86,6 +86,7 @@ superio_exit(void)
|
||||||
#define SUPERIO_REG_ACT 0x30
|
#define SUPERIO_REG_ACT 0x30
|
||||||
#define SUPERIO_REG_BASE 0x60
|
#define SUPERIO_REG_BASE 0x60
|
||||||
#define SUPERIO_REG_DEVID 0x20
|
#define SUPERIO_REG_DEVID 0x20
|
||||||
|
#define SUPERIO_REG_DEVREV 0x21
|
||||||
|
|
||||||
/* Logical device registers */
|
/* Logical device registers */
|
||||||
|
|
||||||
|
@ -429,6 +430,9 @@ static int __init smsc47m1_find(unsigned short *addr,
|
||||||
* The LPC47M292 (device id 0x6B) is somewhat compatible, but it
|
* The LPC47M292 (device id 0x6B) is somewhat compatible, but it
|
||||||
* supports a 3rd fan, and the pin configuration registers are
|
* supports a 3rd fan, and the pin configuration registers are
|
||||||
* unfortunately different.
|
* unfortunately different.
|
||||||
|
* The LPC47M233 has the same device id (0x6B) but is not compatible.
|
||||||
|
* We check the high bit of the device revision register to
|
||||||
|
* differentiate them.
|
||||||
*/
|
*/
|
||||||
switch (val) {
|
switch (val) {
|
||||||
case 0x51:
|
case 0x51:
|
||||||
|
@ -448,6 +452,13 @@ static int __init smsc47m1_find(unsigned short *addr,
|
||||||
sio_data->type = smsc47m1;
|
sio_data->type = smsc47m1;
|
||||||
break;
|
break;
|
||||||
case 0x6B:
|
case 0x6B:
|
||||||
|
if (superio_inb(SUPERIO_REG_DEVREV) & 0x80) {
|
||||||
|
pr_debug(DRVNAME ": "
|
||||||
|
"Found SMSC LPC47M233, unsupported\n");
|
||||||
|
superio_exit();
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
pr_info(DRVNAME ": Found SMSC LPC47M292\n");
|
pr_info(DRVNAME ": Found SMSC LPC47M292\n");
|
||||||
sio_data->type = smsc47m2;
|
sio_data->type = smsc47m2;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
|
||||||
#define TSL2550_DRV_NAME "tsl2550"
|
#define TSL2550_DRV_NAME "tsl2550"
|
||||||
#define DRIVER_VERSION "1.1.1"
|
#define DRIVER_VERSION "1.1.2"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Defines
|
* Defines
|
||||||
|
@ -189,13 +189,16 @@ static int tsl2550_calculate_lux(u8 ch0, u8 ch1)
|
||||||
u8 r = 128;
|
u8 r = 128;
|
||||||
|
|
||||||
/* Avoid division by 0 and count 1 cannot be greater than count 0 */
|
/* Avoid division by 0 and count 1 cannot be greater than count 0 */
|
||||||
if (c0 && (c1 <= c0))
|
if (c1 <= c0)
|
||||||
r = c1 * 128 / c0;
|
if (c0) {
|
||||||
else
|
r = c1 * 128 / c0;
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* Calculate LUX */
|
/* Calculate LUX */
|
||||||
lux = ((c0 - c1) * ratio_lut[r]) / 256;
|
lux = ((c0 - c1) * ratio_lut[r]) / 256;
|
||||||
|
} else
|
||||||
|
lux = 0;
|
||||||
|
else
|
||||||
|
return -EAGAIN;
|
||||||
|
|
||||||
/* LUX range check */
|
/* LUX range check */
|
||||||
return lux > TSL2550_MAX_LUX ? TSL2550_MAX_LUX : lux;
|
return lux > TSL2550_MAX_LUX ? TSL2550_MAX_LUX : lux;
|
||||||
|
|
|
@ -455,6 +455,7 @@ static void idedisk_prepare_flush(struct request_queue *q, struct request *rq)
|
||||||
|
|
||||||
rq->cmd_type = REQ_TYPE_ATA_TASKFILE;
|
rq->cmd_type = REQ_TYPE_ATA_TASKFILE;
|
||||||
rq->special = cmd;
|
rq->special = cmd;
|
||||||
|
cmd->rq = rq;
|
||||||
}
|
}
|
||||||
|
|
||||||
ide_devset_get(multcount, mult_count);
|
ide_devset_get(multcount, mult_count);
|
||||||
|
|
|
@ -1064,6 +1064,7 @@ static int idetape_blkdev_ioctl(ide_drive_t *drive, unsigned int cmd,
|
||||||
tape->best_dsc_rw_freq = config.dsc_rw_frequency;
|
tape->best_dsc_rw_freq = config.dsc_rw_frequency;
|
||||||
break;
|
break;
|
||||||
case 0x0350:
|
case 0x0350:
|
||||||
|
memset(&config, 0, sizeof(config));
|
||||||
config.dsc_rw_frequency = (int) tape->best_dsc_rw_freq;
|
config.dsc_rw_frequency = (int) tape->best_dsc_rw_freq;
|
||||||
config.nr_stages = 1;
|
config.nr_stages = 1;
|
||||||
if (copy_to_user(argp, &config, sizeof(config)))
|
if (copy_to_user(argp, &config, sizeof(config)))
|
||||||
|
|
|
@ -608,8 +608,7 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd,
|
||||||
p, compat_mode);
|
p, compat_mode);
|
||||||
|
|
||||||
if (_IOC_NR(cmd) == _IOC_NR(EVIOCGNAME(0)))
|
if (_IOC_NR(cmd) == _IOC_NR(EVIOCGNAME(0)))
|
||||||
return str_to_user(dev_name(&evdev->dev),
|
return str_to_user(dev->name, _IOC_SIZE(cmd), p);
|
||||||
_IOC_SIZE(cmd), p);
|
|
||||||
|
|
||||||
if (_IOC_NR(cmd) == _IOC_NR(EVIOCGPHYS(0)))
|
if (_IOC_NR(cmd) == _IOC_NR(EVIOCGPHYS(0)))
|
||||||
return str_to_user(dev->phys, _IOC_SIZE(cmd), p);
|
return str_to_user(dev->phys, _IOC_SIZE(cmd), p);
|
||||||
|
|
|
@ -536,7 +536,7 @@ static int joydev_ioctl_common(struct joydev *joydev,
|
||||||
default:
|
default:
|
||||||
if ((cmd & ~IOCSIZE_MASK) == JSIOCGNAME(0)) {
|
if ((cmd & ~IOCSIZE_MASK) == JSIOCGNAME(0)) {
|
||||||
int len;
|
int len;
|
||||||
const char *name = dev_name(&dev->dev);
|
const char *name = dev->name;
|
||||||
|
|
||||||
if (!name)
|
if (!name)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -470,20 +470,20 @@ static void xpad_irq_out(struct urb *urb)
|
||||||
status = urb->status;
|
status = urb->status;
|
||||||
|
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case 0:
|
case 0:
|
||||||
/* success */
|
/* success */
|
||||||
break;
|
return;
|
||||||
case -ECONNRESET:
|
|
||||||
case -ENOENT:
|
case -ECONNRESET:
|
||||||
case -ESHUTDOWN:
|
case -ENOENT:
|
||||||
/* this urb is terminated, clean up */
|
case -ESHUTDOWN:
|
||||||
dbg("%s - urb shutting down with status: %d",
|
/* this urb is terminated, clean up */
|
||||||
__func__, status);
|
dbg("%s - urb shutting down with status: %d", __func__, status);
|
||||||
return;
|
return;
|
||||||
default:
|
|
||||||
dbg("%s - nonzero urb status received: %d",
|
default:
|
||||||
__func__, status);
|
dbg("%s - nonzero urb status received: %d", __func__, status);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
|
|
|
@ -894,6 +894,13 @@ static unsigned int atkbd_amilo_pa1510_forced_release_keys[] = {
|
||||||
0xb0, 0xae, -1U
|
0xb0, 0xae, -1U
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Amilo Pi 3525 key release for Fn+Volume keys not working
|
||||||
|
*/
|
||||||
|
static unsigned int atkbd_amilo_pi3525_forced_release_keys[] = {
|
||||||
|
0x20, 0xa0, 0x2e, 0xae, 0x30, 0xb0, -1U
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Amilo Xi 3650 key release for light touch bar not working
|
* Amilo Xi 3650 key release for light touch bar not working
|
||||||
*/
|
*/
|
||||||
|
@ -901,6 +908,13 @@ static unsigned int atkbd_amilo_xi3650_forced_release_keys[] = {
|
||||||
0x67, 0xed, 0x90, 0xa2, 0x99, 0xa4, 0xae, 0xb0, -1U
|
0x67, 0xed, 0x90, 0xa2, 0x99, 0xa4, 0xae, 0xb0, -1U
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Soltech TA12 system with broken key release on volume keys and mute key
|
||||||
|
*/
|
||||||
|
static unsigned int atkdb_soltech_ta12_forced_release_keys[] = {
|
||||||
|
0xa0, 0xae, 0xb0, -1U
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* atkbd_set_keycode_table() initializes keyboard's keycode table
|
* atkbd_set_keycode_table() initializes keyboard's keycode table
|
||||||
* according to the selected scancode set
|
* according to the selected scancode set
|
||||||
|
@ -1567,6 +1581,15 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
|
||||||
.callback = atkbd_setup_forced_release,
|
.callback = atkbd_setup_forced_release,
|
||||||
.driver_data = atkbd_amilo_pa1510_forced_release_keys,
|
.driver_data = atkbd_amilo_pa1510_forced_release_keys,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.ident = "Fujitsu Amilo Pi 3525",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 3525"),
|
||||||
|
},
|
||||||
|
.callback = atkbd_setup_forced_release,
|
||||||
|
.driver_data = atkbd_amilo_pi3525_forced_release_keys,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.ident = "Fujitsu Amilo Xi 3650",
|
.ident = "Fujitsu Amilo Xi 3650",
|
||||||
.matches = {
|
.matches = {
|
||||||
|
@ -1576,6 +1599,15 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
|
||||||
.callback = atkbd_setup_forced_release,
|
.callback = atkbd_setup_forced_release,
|
||||||
.driver_data = atkbd_amilo_xi3650_forced_release_keys,
|
.driver_data = atkbd_amilo_xi3650_forced_release_keys,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.ident = "Soltech Corporation TA12",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "Soltech Corporation"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "TA12"),
|
||||||
|
},
|
||||||
|
.callback = atkbd_setup_forced_release,
|
||||||
|
.driver_data = atkdb_soltech_ta12_forced_release_keys,
|
||||||
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -114,7 +114,7 @@ static int __devexit pcspkr_remove(struct platform_device *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pcspkr_suspend(struct platform_device *dev, pm_message_t state)
|
static int pcspkr_suspend(struct device *dev)
|
||||||
{
|
{
|
||||||
pcspkr_event(NULL, EV_SND, SND_BELL, 0);
|
pcspkr_event(NULL, EV_SND, SND_BELL, 0);
|
||||||
|
|
||||||
|
@ -127,14 +127,18 @@ static void pcspkr_shutdown(struct platform_device *dev)
|
||||||
pcspkr_event(NULL, EV_SND, SND_BELL, 0);
|
pcspkr_event(NULL, EV_SND, SND_BELL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct dev_pm_ops pcspkr_pm_ops = {
|
||||||
|
.suspend = pcspkr_suspend,
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_driver pcspkr_platform_driver = {
|
static struct platform_driver pcspkr_platform_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "pcspkr",
|
.name = "pcspkr",
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
|
.pm = &pcspkr_pm_ops,
|
||||||
},
|
},
|
||||||
.probe = pcspkr_probe,
|
.probe = pcspkr_probe,
|
||||||
.remove = __devexit_p(pcspkr_remove),
|
.remove = __devexit_p(pcspkr_remove),
|
||||||
.suspend = pcspkr_suspend,
|
|
||||||
.shutdown = pcspkr_shutdown,
|
.shutdown = pcspkr_shutdown,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -644,6 +644,15 @@ static struct dmi_system_id dmi_ids[] __initdata = {
|
||||||
},
|
},
|
||||||
.driver_data = keymap_fs_amilo_pro_v2000
|
.driver_data = keymap_fs_amilo_pro_v2000
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.callback = dmi_matched,
|
||||||
|
.ident = "Maxdata Pro 7000 DX",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "MAXDATA"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "Pro 7000"),
|
||||||
|
},
|
||||||
|
.driver_data = keymap_fs_amilo_pro_v2000
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.callback = dmi_matched,
|
.callback = dmi_matched,
|
||||||
.ident = "Fujitsu N3510",
|
.ident = "Fujitsu N3510",
|
||||||
|
|
|
@ -731,10 +731,10 @@ l1oip_socket_thread(void *data)
|
||||||
while (!signal_pending(current)) {
|
while (!signal_pending(current)) {
|
||||||
struct kvec iov = {
|
struct kvec iov = {
|
||||||
.iov_base = recvbuf,
|
.iov_base = recvbuf,
|
||||||
.iov_len = sizeof(recvbuf),
|
.iov_len = recvbuf_size,
|
||||||
};
|
};
|
||||||
recvlen = kernel_recvmsg(socket, &msg, &iov, 1,
|
recvlen = kernel_recvmsg(socket, &msg, &iov, 1,
|
||||||
sizeof(recvbuf), 0);
|
recvbuf_size, 0);
|
||||||
if (recvlen > 0) {
|
if (recvlen > 0) {
|
||||||
l1oip_socket_parse(hc, &sin_rx, recvbuf, recvlen);
|
l1oip_socket_parse(hc, &sin_rx, recvbuf, recvlen);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1318,7 +1318,7 @@ static int crypt_iterate_devices(struct dm_target *ti,
|
||||||
{
|
{
|
||||||
struct crypt_config *cc = ti->private;
|
struct crypt_config *cc = ti->private;
|
||||||
|
|
||||||
return fn(ti, cc->dev, cc->start, data);
|
return fn(ti, cc->dev, cc->start, ti->len, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct target_type crypt_target = {
|
static struct target_type crypt_target = {
|
||||||
|
|
|
@ -324,12 +324,12 @@ static int delay_iterate_devices(struct dm_target *ti,
|
||||||
struct delay_c *dc = ti->private;
|
struct delay_c *dc = ti->private;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
ret = fn(ti, dc->dev_read, dc->start_read, data);
|
ret = fn(ti, dc->dev_read, dc->start_read, ti->len, data);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (dc->dev_write)
|
if (dc->dev_write)
|
||||||
ret = fn(ti, dc->dev_write, dc->start_write, data);
|
ret = fn(ti, dc->dev_write, dc->start_write, ti->len, data);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -139,7 +139,7 @@ static int linear_iterate_devices(struct dm_target *ti,
|
||||||
{
|
{
|
||||||
struct linear_c *lc = ti->private;
|
struct linear_c *lc = ti->private;
|
||||||
|
|
||||||
return fn(ti, lc->dev, lc->start, data);
|
return fn(ti, lc->dev, lc->start, ti->len, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct target_type linear_target = {
|
static struct target_type linear_target = {
|
||||||
|
|
|
@ -1453,7 +1453,7 @@ static int multipath_iterate_devices(struct dm_target *ti,
|
||||||
|
|
||||||
list_for_each_entry(pg, &m->priority_groups, list) {
|
list_for_each_entry(pg, &m->priority_groups, list) {
|
||||||
list_for_each_entry(p, &pg->pgpaths, list) {
|
list_for_each_entry(p, &pg->pgpaths, list) {
|
||||||
ret = fn(ti, p->path.dev, ti->begin, data);
|
ret = fn(ti, p->path.dev, ti->begin, ti->len, data);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
|
@ -638,6 +638,7 @@ static void do_writes(struct mirror_set *ms, struct bio_list *writes)
|
||||||
spin_lock_irq(&ms->lock);
|
spin_lock_irq(&ms->lock);
|
||||||
bio_list_merge(&ms->writes, &requeue);
|
bio_list_merge(&ms->writes, &requeue);
|
||||||
spin_unlock_irq(&ms->lock);
|
spin_unlock_irq(&ms->lock);
|
||||||
|
delayed_wake(ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1292,7 +1293,7 @@ static int mirror_iterate_devices(struct dm_target *ti,
|
||||||
|
|
||||||
for (i = 0; !ret && i < ms->nr_mirrors; i++)
|
for (i = 0; !ret && i < ms->nr_mirrors; i++)
|
||||||
ret = fn(ti, ms->mirror[i].dev,
|
ret = fn(ti, ms->mirror[i].dev,
|
||||||
ms->mirror[i].offset, data);
|
ms->mirror[i].offset, ti->len, data);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue