diff options
-rw-r--r-- | arch/powerpc/Makefile | 1 | ||||
-rw-r--r-- | arch/powerpc/configs/pseries_le_defconfig | 352 | ||||
-rw-r--r-- | arch/powerpc/include/asm/elf.h | 4 | ||||
-rw-r--r-- | arch/powerpc/include/asm/hvcall.h | 2 | ||||
-rw-r--r-- | arch/powerpc/include/asm/plpar_wrappers.h | 26 | ||||
-rw-r--r-- | arch/powerpc/include/asm/thread_info.h | 9 | ||||
-rw-r--r-- | arch/powerpc/kernel/process.c | 50 | ||||
-rw-r--r-- | arch/powerpc/kernel/signal_64.c | 25 | ||||
-rw-r--r-- | arch/powerpc/kernel/vdso64/sigtramp.S | 16 | ||||
-rw-r--r-- | arch/powerpc/platforms/Kconfig.cputype | 11 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/eeh_pseries.c | 21 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/lpar.c | 17 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/setup.c | 42 |
13 files changed, 542 insertions, 34 deletions
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index 607acf54a425..8a2463670a5b 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile | |||
@@ -111,6 +111,7 @@ endif | |||
111 | endif | 111 | endif |
112 | 112 | ||
113 | CFLAGS-$(CONFIG_PPC64) := -mtraceback=no -mcall-aixdesc | 113 | CFLAGS-$(CONFIG_PPC64) := -mtraceback=no -mcall-aixdesc |
114 | CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv1) | ||
114 | CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mcmodel=medium,-mminimal-toc) | 115 | CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mcmodel=medium,-mminimal-toc) |
115 | CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mno-pointers-to-nested-functions) | 116 | CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mno-pointers-to-nested-functions) |
116 | CFLAGS-$(CONFIG_PPC32) := -ffixed-r2 $(MULTIPLEWORD) | 117 | CFLAGS-$(CONFIG_PPC32) := -ffixed-r2 $(MULTIPLEWORD) |
diff --git a/arch/powerpc/configs/pseries_le_defconfig b/arch/powerpc/configs/pseries_le_defconfig new file mode 100644 index 000000000000..62771e0adb7c --- /dev/null +++ b/arch/powerpc/configs/pseries_le_defconfig | |||
@@ -0,0 +1,352 @@ | |||
1 | CONFIG_PPC64=y | ||
2 | CONFIG_ALTIVEC=y | ||
3 | CONFIG_VSX=y | ||
4 | CONFIG_SMP=y | ||
5 | CONFIG_NR_CPUS=2048 | ||
6 | CONFIG_CPU_LITTLE_ENDIAN=y | ||
7 | CONFIG_SYSVIPC=y | ||
8 | CONFIG_POSIX_MQUEUE=y | ||
9 | CONFIG_AUDIT=y | ||
10 | CONFIG_AUDITSYSCALL=y | ||
11 | CONFIG_IRQ_DOMAIN_DEBUG=y | ||
12 | CONFIG_NO_HZ=y | ||
13 | CONFIG_HIGH_RES_TIMERS=y | ||
14 | CONFIG_TASKSTATS=y | ||
15 | CONFIG_TASK_DELAY_ACCT=y | ||
16 | CONFIG_TASK_XACCT=y | ||
17 | CONFIG_TASK_IO_ACCOUNTING=y | ||
18 | CONFIG_IKCONFIG=y | ||
19 | CONFIG_IKCONFIG_PROC=y | ||
20 | CONFIG_CGROUPS=y | ||
21 | CONFIG_CGROUP_FREEZER=y | ||
22 | CONFIG_CGROUP_DEVICE=y | ||
23 | CONFIG_CPUSETS=y | ||
24 | CONFIG_CGROUP_CPUACCT=y | ||
25 | CONFIG_BLK_DEV_INITRD=y | ||
26 | # CONFIG_COMPAT_BRK is not set | ||
27 | CONFIG_PROFILING=y | ||
28 | CONFIG_OPROFILE=y | ||
29 | CONFIG_KPROBES=y | ||
30 | CONFIG_JUMP_LABEL=y | ||
31 | CONFIG_MODULES=y | ||
32 | CONFIG_MODULE_UNLOAD=y | ||
33 | CONFIG_MODVERSIONS=y | ||
34 | CONFIG_MODULE_SRCVERSION_ALL=y | ||
35 | CONFIG_PARTITION_ADVANCED=y | ||
36 | CONFIG_PPC_SPLPAR=y | ||
37 | CONFIG_SCANLOG=m | ||
38 | CONFIG_PPC_SMLPAR=y | ||
39 | CONFIG_DTL=y | ||
40 | # CONFIG_PPC_PMAC is not set | ||
41 | CONFIG_RTAS_FLASH=m | ||
42 | CONFIG_IBMEBUS=y | ||
43 | CONFIG_HZ_100=y | ||
44 | CONFIG_BINFMT_MISC=m | ||
45 | CONFIG_PPC_TRANSACTIONAL_MEM=y | ||
46 | CONFIG_KEXEC=y | ||
47 | CONFIG_IRQ_ALL_CPUS=y | ||
48 | CONFIG_MEMORY_HOTPLUG=y | ||
49 | CONFIG_MEMORY_HOTREMOVE=y | ||
50 | CONFIG_CMA=y | ||
51 | CONFIG_PPC_64K_PAGES=y | ||
52 | CONFIG_PPC_SUBPAGE_PROT=y | ||
53 | CONFIG_SCHED_SMT=y | ||
54 | CONFIG_HOTPLUG_PCI=y | ||
55 | CONFIG_HOTPLUG_PCI_RPA=m | ||
56 | CONFIG_HOTPLUG_PCI_RPA_DLPAR=m | ||
57 | CONFIG_PACKET=y | ||
58 | CONFIG_UNIX=y | ||
59 | CONFIG_XFRM_USER=m | ||
60 | CONFIG_NET_KEY=m | ||
61 | CONFIG_INET=y | ||
62 | CONFIG_IP_MULTICAST=y | ||
63 | CONFIG_NET_IPIP=y | ||
64 | CONFIG_SYN_COOKIES=y | ||
65 | CONFIG_INET_AH=m | ||
66 | CONFIG_INET_ESP=m | ||
67 | CONFIG_INET_IPCOMP=m | ||
68 | # CONFIG_IPV6 is not set | ||
69 | CONFIG_NETFILTER=y | ||
70 | CONFIG_NF_CONNTRACK=m | ||
71 | CONFIG_NF_CONNTRACK_EVENTS=y | ||
72 | CONFIG_NF_CT_PROTO_UDPLITE=m | ||
73 | CONFIG_NF_CONNTRACK_FTP=m | ||
74 | CONFIG_NF_CONNTRACK_IRC=m | ||
75 | CONFIG_NF_CONNTRACK_TFTP=m | ||
76 | CONFIG_NF_CT_NETLINK=m | ||
77 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m | ||
78 | CONFIG_NETFILTER_XT_TARGET_CONNMARK=m | ||
79 | CONFIG_NETFILTER_XT_TARGET_MARK=m | ||
80 | CONFIG_NETFILTER_XT_TARGET_NFLOG=m | ||
81 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m | ||
82 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m | ||
83 | CONFIG_NETFILTER_XT_MATCH_COMMENT=m | ||
84 | CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m | ||
85 | CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m | ||
86 | CONFIG_NETFILTER_XT_MATCH_CONNMARK=m | ||
87 | CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m | ||
88 | CONFIG_NETFILTER_XT_MATCH_DCCP=m | ||
89 | CONFIG_NETFILTER_XT_MATCH_DSCP=m | ||
90 | CONFIG_NETFILTER_XT_MATCH_ESP=m | ||
91 | CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m | ||
92 | CONFIG_NETFILTER_XT_MATCH_HELPER=m | ||
93 | CONFIG_NETFILTER_XT_MATCH_IPRANGE=m | ||
94 | CONFIG_NETFILTER_XT_MATCH_LENGTH=m | ||
95 | CONFIG_NETFILTER_XT_MATCH_LIMIT=m | ||
96 | CONFIG_NETFILTER_XT_MATCH_MAC=m | ||
97 | CONFIG_NETFILTER_XT_MATCH_MARK=m | ||
98 | CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m | ||
99 | CONFIG_NETFILTER_XT_MATCH_OWNER=m | ||
100 | CONFIG_NETFILTER_XT_MATCH_POLICY=m | ||
101 | CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m | ||
102 | CONFIG_NETFILTER_XT_MATCH_QUOTA=m | ||
103 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m | ||
104 | CONFIG_NETFILTER_XT_MATCH_REALM=m | ||
105 | CONFIG_NETFILTER_XT_MATCH_RECENT=m | ||
106 | CONFIG_NETFILTER_XT_MATCH_SCTP=m | ||
107 | CONFIG_NETFILTER_XT_MATCH_STATE=m | ||
108 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m | ||
109 | CONFIG_NETFILTER_XT_MATCH_STRING=m | ||
110 | CONFIG_NETFILTER_XT_MATCH_TCPMSS=m | ||
111 | CONFIG_NETFILTER_XT_MATCH_TIME=m | ||
112 | CONFIG_NETFILTER_XT_MATCH_U32=m | ||
113 | CONFIG_NF_CONNTRACK_IPV4=m | ||
114 | CONFIG_IP_NF_IPTABLES=m | ||
115 | CONFIG_IP_NF_MATCH_AH=m | ||
116 | CONFIG_IP_NF_MATCH_ECN=m | ||
117 | CONFIG_IP_NF_MATCH_TTL=m | ||
118 | CONFIG_IP_NF_FILTER=m | ||
119 | CONFIG_IP_NF_TARGET_REJECT=m | ||
120 | CONFIG_IP_NF_TARGET_ULOG=m | ||
121 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
122 | CONFIG_DEVTMPFS=y | ||
123 | CONFIG_DEVTMPFS_MOUNT=y | ||
124 | CONFIG_PROC_DEVICETREE=y | ||
125 | CONFIG_PARPORT=m | ||
126 | CONFIG_PARPORT_PC=m | ||
127 | CONFIG_BLK_DEV_FD=m | ||
128 | CONFIG_BLK_DEV_LOOP=y | ||
129 | CONFIG_BLK_DEV_NBD=m | ||
130 | CONFIG_BLK_DEV_RAM=y | ||
131 | CONFIG_BLK_DEV_RAM_SIZE=65536 | ||
132 | CONFIG_VIRTIO_BLK=m | ||
133 | CONFIG_IDE=y | ||
134 | CONFIG_BLK_DEV_IDECD=y | ||
135 | CONFIG_BLK_DEV_GENERIC=y | ||
136 | CONFIG_BLK_DEV_AMD74XX=y | ||
137 | CONFIG_BLK_DEV_SD=y | ||
138 | CONFIG_CHR_DEV_ST=y | ||
139 | CONFIG_BLK_DEV_SR=y | ||
140 | CONFIG_BLK_DEV_SR_VENDOR=y | ||
141 | CONFIG_CHR_DEV_SG=y | ||
142 | CONFIG_SCSI_MULTI_LUN=y | ||
143 | CONFIG_SCSI_CONSTANTS=y | ||
144 | CONFIG_SCSI_FC_ATTRS=y | ||
145 | CONFIG_SCSI_CXGB3_ISCSI=m | ||
146 | CONFIG_SCSI_CXGB4_ISCSI=m | ||
147 | CONFIG_SCSI_BNX2_ISCSI=m | ||
148 | CONFIG_BE2ISCSI=m | ||
149 | CONFIG_SCSI_MPT2SAS=m | ||
150 | CONFIG_SCSI_IBMVSCSI=y | ||
151 | CONFIG_SCSI_IBMVFC=m | ||
152 | CONFIG_SCSI_SYM53C8XX_2=y | ||
153 | CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 | ||
154 | CONFIG_SCSI_IPR=y | ||
155 | CONFIG_SCSI_QLA_FC=m | ||
156 | CONFIG_SCSI_QLA_ISCSI=m | ||
157 | CONFIG_SCSI_LPFC=m | ||
158 | CONFIG_SCSI_VIRTIO=m | ||
159 | CONFIG_SCSI_DH=m | ||
160 | CONFIG_SCSI_DH_RDAC=m | ||
161 | CONFIG_SCSI_DH_ALUA=m | ||
162 | CONFIG_ATA=y | ||
163 | # CONFIG_ATA_SFF is not set | ||
164 | CONFIG_MD=y | ||
165 | CONFIG_BLK_DEV_MD=y | ||
166 | CONFIG_MD_LINEAR=y | ||
167 | CONFIG_MD_RAID0=y | ||
168 | CONFIG_MD_RAID1=y | ||
169 | CONFIG_MD_RAID10=m | ||
170 | CONFIG_MD_RAID456=m | ||
171 | CONFIG_MD_MULTIPATH=m | ||
172 | CONFIG_MD_FAULTY=m | ||
173 | CONFIG_BLK_DEV_DM=y | ||
174 | CONFIG_DM_CRYPT=m | ||
175 | CONFIG_DM_SNAPSHOT=m | ||
176 | CONFIG_DM_MIRROR=m | ||
177 | CONFIG_DM_ZERO=m | ||
178 | CONFIG_DM_MULTIPATH=m | ||
179 | CONFIG_DM_MULTIPATH_QL=m | ||
180 | CONFIG_DM_MULTIPATH_ST=m | ||
181 | CONFIG_DM_UEVENT=y | ||
182 | CONFIG_BONDING=m | ||
183 | CONFIG_DUMMY=m | ||
184 | CONFIG_NETCONSOLE=y | ||
185 | CONFIG_NETPOLL_TRAP=y | ||
186 | CONFIG_TUN=m | ||
187 | CONFIG_VIRTIO_NET=m | ||
188 | CONFIG_VORTEX=y | ||
189 | CONFIG_ACENIC=m | ||
190 | CONFIG_ACENIC_OMIT_TIGON_I=y | ||
191 | CONFIG_PCNET32=y | ||
192 | CONFIG_TIGON3=y | ||
193 | CONFIG_CHELSIO_T1=m | ||
194 | CONFIG_BE2NET=m | ||
195 | CONFIG_S2IO=m | ||
196 | CONFIG_IBMVETH=y | ||
197 | CONFIG_EHEA=y | ||
198 | CONFIG_E100=y | ||
199 | CONFIG_E1000=y | ||
200 | CONFIG_E1000E=y | ||
201 | CONFIG_IXGB=m | ||
202 | CONFIG_IXGBE=m | ||
203 | CONFIG_MLX4_EN=m | ||
204 | CONFIG_MYRI10GE=m | ||
205 | CONFIG_QLGE=m | ||
206 | CONFIG_NETXEN_NIC=m | ||
207 | CONFIG_PPP=m | ||
208 | CONFIG_PPP_BSDCOMP=m | ||
209 | CONFIG_PPP_DEFLATE=m | ||
210 | CONFIG_PPPOE=m | ||
211 | CONFIG_PPP_ASYNC=m | ||
212 | CONFIG_PPP_SYNC_TTY=m | ||
213 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
214 | CONFIG_INPUT_EVDEV=m | ||
215 | CONFIG_INPUT_MISC=y | ||
216 | CONFIG_INPUT_PCSPKR=m | ||
217 | # CONFIG_SERIO_SERPORT is not set | ||
218 | CONFIG_SERIAL_8250=y | ||
219 | CONFIG_SERIAL_8250_CONSOLE=y | ||
220 | CONFIG_SERIAL_ICOM=m | ||
221 | CONFIG_SERIAL_JSM=m | ||
222 | CONFIG_HVC_CONSOLE=y | ||
223 | CONFIG_HVC_RTAS=y | ||
224 | CONFIG_HVCS=m | ||
225 | CONFIG_VIRTIO_CONSOLE=m | ||
226 | CONFIG_IBM_BSR=m | ||
227 | CONFIG_GEN_RTC=y | ||
228 | CONFIG_RAW_DRIVER=y | ||
229 | CONFIG_MAX_RAW_DEVS=1024 | ||
230 | CONFIG_FB=y | ||
231 | CONFIG_FIRMWARE_EDID=y | ||
232 | CONFIG_FB_OF=y | ||
233 | CONFIG_FB_MATROX=y | ||
234 | CONFIG_FB_MATROX_MILLENIUM=y | ||
235 | CONFIG_FB_MATROX_MYSTIQUE=y | ||
236 | CONFIG_FB_MATROX_G=y | ||
237 | CONFIG_FB_RADEON=y | ||
238 | CONFIG_FB_IBM_GXT4500=y | ||
239 | CONFIG_LCD_PLATFORM=m | ||
240 | # CONFIG_VGA_CONSOLE is not set | ||
241 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
242 | CONFIG_LOGO=y | ||
243 | CONFIG_HID_GYRATION=y | ||
244 | CONFIG_HID_PANTHERLORD=y | ||
245 | CONFIG_HID_PETALYNX=y | ||
246 | CONFIG_HID_SAMSUNG=y | ||
247 | CONFIG_HID_SUNPLUS=y | ||
248 | CONFIG_USB_HIDDEV=y | ||
249 | CONFIG_USB=y | ||
250 | CONFIG_USB_MON=m | ||
251 | CONFIG_USB_EHCI_HCD=y | ||
252 | # CONFIG_USB_EHCI_HCD_PPC_OF is not set | ||
253 | CONFIG_USB_OHCI_HCD=y | ||
254 | CONFIG_USB_STORAGE=m | ||
255 | CONFIG_INFINIBAND=m | ||
256 | CONFIG_INFINIBAND_USER_MAD=m | ||
257 | CONFIG_INFINIBAND_USER_ACCESS=m | ||
258 | CONFIG_INFINIBAND_MTHCA=m | ||
259 | CONFIG_INFINIBAND_EHCA=m | ||
260 | CONFIG_INFINIBAND_CXGB3=m | ||
261 | CONFIG_INFINIBAND_CXGB4=m | ||
262 | CONFIG_MLX4_INFINIBAND=m | ||
263 | CONFIG_INFINIBAND_IPOIB=m | ||
264 | CONFIG_INFINIBAND_IPOIB_CM=y | ||
265 | CONFIG_INFINIBAND_SRP=m | ||
266 | CONFIG_INFINIBAND_ISER=m | ||
267 | CONFIG_VIRTIO_PCI=m | ||
268 | CONFIG_VIRTIO_BALLOON=m | ||
269 | CONFIG_EXT2_FS=y | ||
270 | CONFIG_EXT2_FS_XATTR=y | ||
271 | CONFIG_EXT2_FS_POSIX_ACL=y | ||
272 | CONFIG_EXT2_FS_SECURITY=y | ||
273 | CONFIG_EXT2_FS_XIP=y | ||
274 | CONFIG_EXT3_FS=y | ||
275 | CONFIG_EXT3_FS_POSIX_ACL=y | ||
276 | CONFIG_EXT3_FS_SECURITY=y | ||
277 | CONFIG_EXT4_FS=y | ||
278 | CONFIG_EXT4_FS_POSIX_ACL=y | ||
279 | CONFIG_EXT4_FS_SECURITY=y | ||
280 | CONFIG_REISERFS_FS=y | ||
281 | CONFIG_REISERFS_FS_XATTR=y | ||
282 | CONFIG_REISERFS_FS_POSIX_ACL=y | ||
283 | CONFIG_REISERFS_FS_SECURITY=y | ||
284 | CONFIG_JFS_FS=m | ||
285 | CONFIG_JFS_POSIX_ACL=y | ||
286 | CONFIG_JFS_SECURITY=y | ||
287 | CONFIG_XFS_FS=m | ||
288 | CONFIG_XFS_POSIX_ACL=y | ||
289 | CONFIG_BTRFS_FS=m | ||
290 | CONFIG_BTRFS_FS_POSIX_ACL=y | ||
291 | CONFIG_NILFS2_FS=m | ||
292 | CONFIG_AUTOFS4_FS=m | ||
293 | CONFIG_FUSE_FS=m | ||
294 | CONFIG_ISO9660_FS=y | ||
295 | CONFIG_UDF_FS=m | ||
296 | CONFIG_MSDOS_FS=y | ||
297 | CONFIG_VFAT_FS=y | ||
298 | CONFIG_PROC_KCORE=y | ||
299 | CONFIG_TMPFS=y | ||
300 | CONFIG_TMPFS_POSIX_ACL=y | ||
301 | CONFIG_HUGETLBFS=y | ||
302 | CONFIG_CRAMFS=m | ||
303 | CONFIG_SQUASHFS=m | ||
304 | CONFIG_SQUASHFS_XATTR=y | ||
305 | CONFIG_SQUASHFS_LZO=y | ||
306 | CONFIG_SQUASHFS_XZ=y | ||
307 | CONFIG_PSTORE=y | ||
308 | CONFIG_NFS_FS=y | ||
309 | CONFIG_NFS_V3_ACL=y | ||
310 | CONFIG_NFS_V4=y | ||
311 | CONFIG_NFSD=m | ||
312 | CONFIG_NFSD_V3_ACL=y | ||
313 | CONFIG_NFSD_V4=y | ||
314 | CONFIG_CIFS=m | ||
315 | CONFIG_CIFS_XATTR=y | ||
316 | CONFIG_CIFS_POSIX=y | ||
317 | CONFIG_NLS_DEFAULT="utf8" | ||
318 | CONFIG_NLS_CODEPAGE_437=y | ||
319 | CONFIG_NLS_ASCII=y | ||
320 | CONFIG_NLS_ISO8859_1=y | ||
321 | CONFIG_NLS_UTF8=y | ||
322 | CONFIG_CRC_T10DIF=y | ||
323 | CONFIG_MAGIC_SYSRQ=y | ||
324 | CONFIG_DEBUG_KERNEL=y | ||
325 | CONFIG_DEBUG_STACK_USAGE=y | ||
326 | CONFIG_DEBUG_STACKOVERFLOW=y | ||
327 | CONFIG_LOCKUP_DETECTOR=y | ||
328 | CONFIG_LATENCYTOP=y | ||
329 | CONFIG_SCHED_TRACER=y | ||
330 | CONFIG_BLK_DEV_IO_TRACE=y | ||
331 | CONFIG_CODE_PATCHING_SELFTEST=y | ||
332 | CONFIG_FTR_FIXUP_SELFTEST=y | ||
333 | CONFIG_MSI_BITMAP_SELFTEST=y | ||
334 | CONFIG_XMON=y | ||
335 | CONFIG_CRYPTO_TEST=m | ||
336 | CONFIG_CRYPTO_PCBC=m | ||
337 | CONFIG_CRYPTO_HMAC=y | ||
338 | CONFIG_CRYPTO_MICHAEL_MIC=m | ||
339 | CONFIG_CRYPTO_TGR192=m | ||
340 | CONFIG_CRYPTO_WP512=m | ||
341 | CONFIG_CRYPTO_ANUBIS=m | ||
342 | CONFIG_CRYPTO_BLOWFISH=m | ||
343 | CONFIG_CRYPTO_CAST6=m | ||
344 | CONFIG_CRYPTO_KHAZAD=m | ||
345 | CONFIG_CRYPTO_SALSA20=m | ||
346 | CONFIG_CRYPTO_SERPENT=m | ||
347 | CONFIG_CRYPTO_TEA=m | ||
348 | CONFIG_CRYPTO_TWOFISH=m | ||
349 | CONFIG_CRYPTO_LZO=m | ||
350 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
351 | CONFIG_CRYPTO_DEV_NX=y | ||
352 | CONFIG_CRYPTO_DEV_NX_ENCRYPT=m | ||
diff --git a/arch/powerpc/include/asm/elf.h b/arch/powerpc/include/asm/elf.h index cc0655a702a7..935b5e7a1436 100644 --- a/arch/powerpc/include/asm/elf.h +++ b/arch/powerpc/include/asm/elf.h | |||
@@ -31,6 +31,8 @@ | |||
31 | extern unsigned long randomize_et_dyn(unsigned long base); | 31 | extern unsigned long randomize_et_dyn(unsigned long base); |
32 | #define ELF_ET_DYN_BASE (randomize_et_dyn(0x20000000)) | 32 | #define ELF_ET_DYN_BASE (randomize_et_dyn(0x20000000)) |
33 | 33 | ||
34 | #define ELF_CORE_EFLAGS (is_elf2_task() ? 2 : 0) | ||
35 | |||
34 | /* | 36 | /* |
35 | * Our registers are always unsigned longs, whether we're a 32 bit | 37 | * Our registers are always unsigned longs, whether we're a 32 bit |
36 | * process or 64 bit, on either a 64 bit or 32 bit kernel. | 38 | * process or 64 bit, on either a 64 bit or 32 bit kernel. |
@@ -86,6 +88,8 @@ typedef elf_vrregset_t elf_fpxregset_t; | |||
86 | #ifdef __powerpc64__ | 88 | #ifdef __powerpc64__ |
87 | # define SET_PERSONALITY(ex) \ | 89 | # define SET_PERSONALITY(ex) \ |
88 | do { \ | 90 | do { \ |
91 | if (((ex).e_flags & 0x3) == 2) \ | ||
92 | set_thread_flag(TIF_ELF2ABI); \ | ||
89 | if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \ | 93 | if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \ |
90 | set_thread_flag(TIF_32BIT); \ | 94 | set_thread_flag(TIF_32BIT); \ |
91 | else \ | 95 | else \ |
diff --git a/arch/powerpc/include/asm/hvcall.h b/arch/powerpc/include/asm/hvcall.h index 0c7f2bfcf134..d8b600b3f058 100644 --- a/arch/powerpc/include/asm/hvcall.h +++ b/arch/powerpc/include/asm/hvcall.h | |||
@@ -403,6 +403,8 @@ static inline unsigned long cmo_get_page_size(void) | |||
403 | extern long pSeries_enable_reloc_on_exc(void); | 403 | extern long pSeries_enable_reloc_on_exc(void); |
404 | extern long pSeries_disable_reloc_on_exc(void); | 404 | extern long pSeries_disable_reloc_on_exc(void); |
405 | 405 | ||
406 | extern long pseries_big_endian_exceptions(void); | ||
407 | |||
406 | #else | 408 | #else |
407 | 409 | ||
408 | #define pSeries_enable_reloc_on_exc() do {} while (0) | 410 | #define pSeries_enable_reloc_on_exc() do {} while (0) |
diff --git a/arch/powerpc/include/asm/plpar_wrappers.h b/arch/powerpc/include/asm/plpar_wrappers.h index a63b045e707c..12c32c5f533d 100644 --- a/arch/powerpc/include/asm/plpar_wrappers.h +++ b/arch/powerpc/include/asm/plpar_wrappers.h | |||
@@ -287,6 +287,32 @@ static inline long disable_reloc_on_exceptions(void) { | |||
287 | return plpar_set_mode(0, 3, 0, 0); | 287 | return plpar_set_mode(0, 3, 0, 0); |
288 | } | 288 | } |
289 | 289 | ||
290 | /* | ||
291 | * Take exceptions in big endian mode on this partition | ||
292 | * | ||
293 | * Note: this call has a partition wide scope and can take a while to complete. | ||
294 | * If it returns H_LONG_BUSY_* it should be retried periodically until it | ||
295 | * returns H_SUCCESS. | ||
296 | */ | ||
297 | static inline long enable_big_endian_exceptions(void) | ||
298 | { | ||
299 | /* mflags = 0: big endian exceptions */ | ||
300 | return plpar_set_mode(0, 4, 0, 0); | ||
301 | } | ||
302 | |||
303 | /* | ||
304 | * Take exceptions in little endian mode on this partition | ||
305 | * | ||
306 | * Note: this call has a partition wide scope and can take a while to complete. | ||
307 | * If it returns H_LONG_BUSY_* it should be retried periodically until it | ||
308 | * returns H_SUCCESS. | ||
309 | */ | ||
310 | static inline long enable_little_endian_exceptions(void) | ||
311 | { | ||
312 | /* mflags = 1: little endian exceptions */ | ||
313 | return plpar_set_mode(1, 4, 0, 0); | ||
314 | } | ||
315 | |||
290 | static inline long plapr_set_ciabr(unsigned long ciabr) | 316 | static inline long plapr_set_ciabr(unsigned long ciabr) |
291 | { | 317 | { |
292 | return plpar_set_mode(0, 1, ciabr, 0); | 318 | return plpar_set_mode(0, 1, ciabr, 0); |
diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h index 8fd6cf6dcee8..9854c564ac52 100644 --- a/arch/powerpc/include/asm/thread_info.h +++ b/arch/powerpc/include/asm/thread_info.h | |||
@@ -105,6 +105,9 @@ static inline struct thread_info *current_thread_info(void) | |||
105 | #define TIF_EMULATE_STACK_STORE 16 /* Is an instruction emulation | 105 | #define TIF_EMULATE_STACK_STORE 16 /* Is an instruction emulation |
106 | for stack store? */ | 106 | for stack store? */ |
107 | #define TIF_MEMDIE 17 /* is terminating due to OOM killer */ | 107 | #define TIF_MEMDIE 17 /* is terminating due to OOM killer */ |
108 | #if defined(CONFIG_PPC64) | ||
109 | #define TIF_ELF2ABI 18 /* function descriptors must die! */ | ||
110 | #endif | ||
108 | 111 | ||
109 | /* as above, but as bit values */ | 112 | /* as above, but as bit values */ |
110 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) | 113 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) |
@@ -183,6 +186,12 @@ static inline bool test_thread_local_flags(unsigned int flags) | |||
183 | #define is_32bit_task() (1) | 186 | #define is_32bit_task() (1) |
184 | #endif | 187 | #endif |
185 | 188 | ||
189 | #if defined(CONFIG_PPC64) | ||
190 | #define is_elf2_task() (test_thread_flag(TIF_ELF2ABI)) | ||
191 | #else | ||
192 | #define is_elf2_task() (0) | ||
193 | #endif | ||
194 | |||
186 | #endif /* !__ASSEMBLY__ */ | 195 | #endif /* !__ASSEMBLY__ */ |
187 | 196 | ||
188 | #endif /* __KERNEL__ */ | 197 | #endif /* __KERNEL__ */ |
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 75c2d1009985..0650e18169f8 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
@@ -1086,25 +1086,45 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp) | |||
1086 | regs->msr = MSR_USER; | 1086 | regs->msr = MSR_USER; |
1087 | #else | 1087 | #else |
1088 | if (!is_32bit_task()) { | 1088 | if (!is_32bit_task()) { |
1089 | unsigned long entry, toc; | 1089 | unsigned long entry; |
1090 | 1090 | ||
1091 | /* start is a relocated pointer to the function descriptor for | 1091 | if (is_elf2_task()) { |
1092 | * the elf _start routine. The first entry in the function | 1092 | /* Look ma, no function descriptors! */ |
1093 | * descriptor is the entry address of _start and the second | 1093 | entry = start; |
1094 | * entry is the TOC value we need to use. | ||
1095 | */ | ||
1096 | __get_user(entry, (unsigned long __user *)start); | ||
1097 | __get_user(toc, (unsigned long __user *)start+1); | ||
1098 | 1094 | ||
1099 | /* Check whether the e_entry function descriptor entries | 1095 | /* |
1100 | * need to be relocated before we can use them. | 1096 | * Ulrich says: |
1101 | */ | 1097 | * The latest iteration of the ABI requires that when |
1102 | if (load_addr != 0) { | 1098 | * calling a function (at its global entry point), |
1103 | entry += load_addr; | 1099 | * the caller must ensure r12 holds the entry point |
1104 | toc += load_addr; | 1100 | * address (so that the function can quickly |
1101 | * establish addressability). | ||
1102 | */ | ||
1103 | regs->gpr[12] = start; | ||
1104 | /* Make sure that's restored on entry to userspace. */ | ||
1105 | set_thread_flag(TIF_RESTOREALL); | ||
1106 | } else { | ||
1107 | unsigned long toc; | ||
1108 | |||
1109 | /* start is a relocated pointer to the function | ||
1110 | * descriptor for the elf _start routine. The first | ||
1111 | * entry in the function descriptor is the entry | ||
1112 | * address of _start and the second entry is the TOC | ||
1113 | * value we need to use. | ||
1114 | */ | ||
1115 | __get_user(entry, (unsigned long __user *)start); | ||
1116 | __get_user(toc, (unsigned long __user *)start+1); | ||
1117 | |||
1118 | /* Check whether the e_entry function descriptor entries | ||
1119 | * need to be relocated before we can use them. | ||
1120 | */ | ||
1121 | if (load_addr != 0) { | ||
1122 | entry += load_addr; | ||
1123 | toc += load_addr; | ||
1124 | } | ||
1125 | regs->gpr[2] = toc; | ||
1105 | } | 1126 | } |
1106 | regs->nip = entry; | 1127 | regs->nip = entry; |
1107 | regs->gpr[2] = toc; | ||
1108 | regs->msr = MSR_USER64; | 1128 | regs->msr = MSR_USER64; |
1109 | } else { | 1129 | } else { |
1110 | regs->nip = start; | 1130 | regs->nip = start; |
diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index b3c615764c9b..e66f67b8b9e6 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c | |||
@@ -701,12 +701,6 @@ badframe: | |||
701 | int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info, | 701 | int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info, |
702 | sigset_t *set, struct pt_regs *regs) | 702 | sigset_t *set, struct pt_regs *regs) |
703 | { | 703 | { |
704 | /* Handler is *really* a pointer to the function descriptor for | ||
705 | * the signal routine. The first entry in the function | ||
706 | * descriptor is the entry address of signal and the second | ||
707 | * entry is the TOC value we need to use. | ||
708 | */ | ||
709 | func_descr_t __user *funct_desc_ptr; | ||
710 | struct rt_sigframe __user *frame; | 704 | struct rt_sigframe __user *frame; |
711 | unsigned long newsp = 0; | 705 | unsigned long newsp = 0; |
712 | long err = 0; | 706 | long err = 0; |
@@ -766,19 +760,32 @@ int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info, | |||
766 | goto badframe; | 760 | goto badframe; |
767 | regs->link = (unsigned long) &frame->tramp[0]; | 761 | regs->link = (unsigned long) &frame->tramp[0]; |
768 | } | 762 | } |
769 | funct_desc_ptr = (func_descr_t __user *) ka->sa.sa_handler; | ||
770 | 763 | ||
771 | /* Allocate a dummy caller frame for the signal handler. */ | 764 | /* Allocate a dummy caller frame for the signal handler. */ |
772 | newsp = ((unsigned long)frame) - __SIGNAL_FRAMESIZE; | 765 | newsp = ((unsigned long)frame) - __SIGNAL_FRAMESIZE; |
773 | err |= put_user(regs->gpr[1], (unsigned long __user *)newsp); | 766 | err |= put_user(regs->gpr[1], (unsigned long __user *)newsp); |
774 | 767 | ||
775 | /* Set up "regs" so we "return" to the signal handler. */ | 768 | /* Set up "regs" so we "return" to the signal handler. */ |
776 | err |= get_user(regs->nip, &funct_desc_ptr->entry); | 769 | if (is_elf2_task()) { |
770 | regs->nip = (unsigned long) ka->sa.sa_handler; | ||
771 | regs->gpr[12] = regs->nip; | ||
772 | } else { | ||
773 | /* Handler is *really* a pointer to the function descriptor for | ||
774 | * the signal routine. The first entry in the function | ||
775 | * descriptor is the entry address of signal and the second | ||
776 | * entry is the TOC value we need to use. | ||
777 | */ | ||
778 | func_descr_t __user *funct_desc_ptr = | ||
779 | (func_descr_t __user *) ka->sa.sa_handler; | ||
780 | |||
781 | err |= get_user(regs->nip, &funct_desc_ptr->entry); | ||
782 | err |= get_user(regs->gpr[2], &funct_desc_ptr->toc); | ||
783 | } | ||
784 | |||
777 | /* enter the signal handler in native-endian mode */ | 785 | /* enter the signal handler in native-endian mode */ |
778 | regs->msr &= ~MSR_LE; | 786 | regs->msr &= ~MSR_LE; |
779 | regs->msr |= (MSR_KERNEL & MSR_LE); | 787 | regs->msr |= (MSR_KERNEL & MSR_LE); |
780 | regs->gpr[1] = newsp; | 788 | regs->gpr[1] = newsp; |
781 | err |= get_user(regs->gpr[2], &funct_desc_ptr->toc); | ||
782 | regs->gpr[3] = signr; | 789 | regs->gpr[3] = signr; |
783 | regs->result = 0; | 790 | regs->result = 0; |
784 | if (ka->sa.sa_flags & SA_SIGINFO) { | 791 | if (ka->sa.sa_flags & SA_SIGINFO) { |
diff --git a/arch/powerpc/kernel/vdso64/sigtramp.S b/arch/powerpc/kernel/vdso64/sigtramp.S index 45ea281e9a21..542c6f422e4d 100644 --- a/arch/powerpc/kernel/vdso64/sigtramp.S +++ b/arch/powerpc/kernel/vdso64/sigtramp.S | |||
@@ -142,6 +142,13 @@ V_FUNCTION_END(__kernel_sigtramp_rt64) | |||
142 | /* Size of CR reg in DWARF unwind info. */ | 142 | /* Size of CR reg in DWARF unwind info. */ |
143 | #define CRSIZE 4 | 143 | #define CRSIZE 4 |
144 | 144 | ||
145 | /* Offset of CR reg within a full word. */ | ||
146 | #ifdef __LITTLE_ENDIAN__ | ||
147 | #define CROFF 0 | ||
148 | #else | ||
149 | #define CROFF (RSIZE - CRSIZE) | ||
150 | #endif | ||
151 | |||
145 | /* This is the offset of the VMX reg pointer. */ | 152 | /* This is the offset of the VMX reg pointer. */ |
146 | #define VREGS 48*RSIZE+33*8 | 153 | #define VREGS 48*RSIZE+33*8 |
147 | 154 | ||
@@ -181,7 +188,14 @@ V_FUNCTION_END(__kernel_sigtramp_rt64) | |||
181 | rsave (31, 31*RSIZE); \ | 188 | rsave (31, 31*RSIZE); \ |
182 | rsave (67, 32*RSIZE); /* ap, used as temp for nip */ \ | 189 | rsave (67, 32*RSIZE); /* ap, used as temp for nip */ \ |
183 | rsave (65, 36*RSIZE); /* lr */ \ | 190 | rsave (65, 36*RSIZE); /* lr */ \ |
184 | rsave (70, 38*RSIZE + (RSIZE - CRSIZE)) /* cr */ | 191 | rsave (68, 38*RSIZE + CROFF); /* cr fields */ \ |
192 | rsave (69, 38*RSIZE + CROFF); \ | ||
193 | rsave (70, 38*RSIZE + CROFF); \ | ||
194 | rsave (71, 38*RSIZE + CROFF); \ | ||
195 | rsave (72, 38*RSIZE + CROFF); \ | ||
196 | rsave (73, 38*RSIZE + CROFF); \ | ||
197 | rsave (74, 38*RSIZE + CROFF); \ | ||
198 | rsave (75, 38*RSIZE + CROFF) | ||
185 | 199 | ||
186 | /* Describe where the FP regs are saved. */ | 200 | /* Describe where the FP regs are saved. */ |
187 | #define EH_FRAME_FP \ | 201 | #define EH_FRAME_FP \ |
diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index c2a566fb8bb8..132f8726a257 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype | |||
@@ -403,3 +403,14 @@ config PPC_DOORBELL | |||
403 | default n | 403 | default n |
404 | 404 | ||
405 | endmenu | 405 | endmenu |
406 | |||
407 | config CPU_LITTLE_ENDIAN | ||
408 | bool "Build little endian kernel" | ||
409 | default n | ||
410 | help | ||
411 | This option selects whether a big endian or little endian kernel will | ||
412 | be built. | ||
413 | |||
414 | Note that if cross compiling a little endian kernel, | ||
415 | CROSS_COMPILE must point to a toolchain capable of targeting | ||
416 | little endian powerpc. | ||
diff --git a/arch/powerpc/platforms/pseries/eeh_pseries.c b/arch/powerpc/platforms/pseries/eeh_pseries.c index 7fbc25b1813f..ccb633e077b1 100644 --- a/arch/powerpc/platforms/pseries/eeh_pseries.c +++ b/arch/powerpc/platforms/pseries/eeh_pseries.c | |||
@@ -189,8 +189,9 @@ static void *pseries_eeh_of_probe(struct device_node *dn, void *flag) | |||
189 | struct eeh_dev *edev; | 189 | struct eeh_dev *edev; |
190 | struct eeh_pe pe; | 190 | struct eeh_pe pe; |
191 | struct pci_dn *pdn = PCI_DN(dn); | 191 | struct pci_dn *pdn = PCI_DN(dn); |
192 | const u32 *class_code, *vendor_id, *device_id; | 192 | const __be32 *classp, *vendorp, *devicep; |
193 | const u32 *regs; | 193 | u32 class_code; |
194 | const __be32 *regs; | ||
194 | u32 pcie_flags; | 195 | u32 pcie_flags; |
195 | int enable = 0; | 196 | int enable = 0; |
196 | int ret; | 197 | int ret; |
@@ -201,22 +202,24 @@ static void *pseries_eeh_of_probe(struct device_node *dn, void *flag) | |||
201 | return NULL; | 202 | return NULL; |
202 | 203 | ||
203 | /* Retrieve class/vendor/device IDs */ | 204 | /* Retrieve class/vendor/device IDs */ |
204 | class_code = of_get_property(dn, "class-code", NULL); | 205 | classp = of_get_property(dn, "class-code", NULL); |
205 | vendor_id = of_get_property(dn, "vendor-id", NULL); | 206 | vendorp = of_get_property(dn, "vendor-id", NULL); |
206 | device_id = of_get_property(dn, "device-id", NULL); | 207 | devicep = of_get_property(dn, "device-id", NULL); |
207 | 208 | ||
208 | /* Skip for bad OF node or PCI-ISA bridge */ | 209 | /* Skip for bad OF node or PCI-ISA bridge */ |
209 | if (!class_code || !vendor_id || !device_id) | 210 | if (!classp || !vendorp || !devicep) |
210 | return NULL; | 211 | return NULL; |
211 | if (dn->type && !strcmp(dn->type, "isa")) | 212 | if (dn->type && !strcmp(dn->type, "isa")) |
212 | return NULL; | 213 | return NULL; |
213 | 214 | ||
215 | class_code = of_read_number(classp, 1); | ||
216 | |||
214 | /* | 217 | /* |
215 | * Update class code and mode of eeh device. We need | 218 | * Update class code and mode of eeh device. We need |
216 | * correctly reflects that current device is root port | 219 | * correctly reflects that current device is root port |
217 | * or PCIe switch downstream port. | 220 | * or PCIe switch downstream port. |
218 | */ | 221 | */ |
219 | edev->class_code = *class_code; | 222 | edev->class_code = class_code; |
220 | edev->pcie_cap = pseries_eeh_find_cap(dn, PCI_CAP_ID_EXP); | 223 | edev->pcie_cap = pseries_eeh_find_cap(dn, PCI_CAP_ID_EXP); |
221 | edev->mode &= 0xFFFFFF00; | 224 | edev->mode &= 0xFFFFFF00; |
222 | if ((edev->class_code >> 8) == PCI_CLASS_BRIDGE_PCI) { | 225 | if ((edev->class_code >> 8) == PCI_CLASS_BRIDGE_PCI) { |
@@ -243,12 +246,12 @@ static void *pseries_eeh_of_probe(struct device_node *dn, void *flag) | |||
243 | /* Initialize the fake PE */ | 246 | /* Initialize the fake PE */ |
244 | memset(&pe, 0, sizeof(struct eeh_pe)); | 247 | memset(&pe, 0, sizeof(struct eeh_pe)); |
245 | pe.phb = edev->phb; | 248 | pe.phb = edev->phb; |
246 | pe.config_addr = regs[0]; | 249 | pe.config_addr = of_read_number(regs, 1); |
247 | 250 | ||
248 | /* Enable EEH on the device */ | 251 | /* Enable EEH on the device */ |
249 | ret = eeh_ops->set_option(&pe, EEH_OPT_ENABLE); | 252 | ret = eeh_ops->set_option(&pe, EEH_OPT_ENABLE); |
250 | if (!ret) { | 253 | if (!ret) { |
251 | edev->config_addr = regs[0]; | 254 | edev->config_addr = of_read_number(regs, 1); |
252 | /* Retrieve PE address */ | 255 | /* Retrieve PE address */ |
253 | edev->pe_config_addr = eeh_ops->get_pe_addr(&pe); | 256 | edev->pe_config_addr = eeh_ops->get_pe_addr(&pe); |
254 | pe.addr = edev->pe_config_addr; | 257 | pe.addr = edev->pe_config_addr; |
diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c index 356bc75ca74f..4fca3def9db9 100644 --- a/arch/powerpc/platforms/pseries/lpar.c +++ b/arch/powerpc/platforms/pseries/lpar.c | |||
@@ -245,6 +245,23 @@ static void pSeries_lpar_hptab_clear(void) | |||
245 | &(ptes[j].pteh), &(ptes[j].ptel)); | 245 | &(ptes[j].pteh), &(ptes[j].ptel)); |
246 | } | 246 | } |
247 | } | 247 | } |
248 | |||
249 | #ifdef __LITTLE_ENDIAN__ | ||
250 | /* Reset exceptions to big endian */ | ||
251 | if (firmware_has_feature(FW_FEATURE_SET_MODE)) { | ||
252 | long rc; | ||
253 | |||
254 | rc = pseries_big_endian_exceptions(); | ||
255 | /* | ||
256 | * At this point it is unlikely panic() will get anything | ||
257 | * out to the user, but at least this will stop us from | ||
258 | * continuing on further and creating an even more | ||
259 | * difficult to debug situation. | ||
260 | */ | ||
261 | if (rc) | ||
262 | panic("Could not enable big endian exceptions"); | ||
263 | } | ||
264 | #endif | ||
248 | } | 265 | } |
249 | 266 | ||
250 | /* | 267 | /* |
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index 1f97e2b87a62..c1f190858701 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
@@ -442,6 +442,32 @@ static void pSeries_machine_kexec(struct kimage *image) | |||
442 | } | 442 | } |
443 | #endif | 443 | #endif |
444 | 444 | ||
445 | #ifdef __LITTLE_ENDIAN__ | ||
446 | long pseries_big_endian_exceptions(void) | ||
447 | { | ||
448 | long rc; | ||
449 | |||
450 | while (1) { | ||
451 | rc = enable_big_endian_exceptions(); | ||
452 | if (!H_IS_LONG_BUSY(rc)) | ||
453 | return rc; | ||
454 | mdelay(get_longbusy_msecs(rc)); | ||
455 | } | ||
456 | } | ||
457 | |||
458 | static long pseries_little_endian_exceptions(void) | ||
459 | { | ||
460 | long rc; | ||
461 | |||
462 | while (1) { | ||
463 | rc = enable_little_endian_exceptions(); | ||
464 | if (!H_IS_LONG_BUSY(rc)) | ||
465 | return rc; | ||
466 | mdelay(get_longbusy_msecs(rc)); | ||
467 | } | ||
468 | } | ||
469 | #endif | ||
470 | |||
445 | static void __init pSeries_setup_arch(void) | 471 | static void __init pSeries_setup_arch(void) |
446 | { | 472 | { |
447 | panic_timeout = 10; | 473 | panic_timeout = 10; |
@@ -698,6 +724,22 @@ static int __init pSeries_probe(void) | |||
698 | /* Now try to figure out if we are running on LPAR */ | 724 | /* Now try to figure out if we are running on LPAR */ |
699 | of_scan_flat_dt(pseries_probe_fw_features, NULL); | 725 | of_scan_flat_dt(pseries_probe_fw_features, NULL); |
700 | 726 | ||
727 | #ifdef __LITTLE_ENDIAN__ | ||
728 | if (firmware_has_feature(FW_FEATURE_SET_MODE)) { | ||
729 | long rc; | ||
730 | /* | ||
731 | * Tell the hypervisor that we want our exceptions to | ||
732 | * be taken in little endian mode. If this fails we don't | ||
733 | * want to use BUG() because it will trigger an exception. | ||
734 | */ | ||
735 | rc = pseries_little_endian_exceptions(); | ||
736 | if (rc) { | ||
737 | ppc_md.progress("H_SET_MODE LE exception fail", 0); | ||
738 | panic("Could not enable little endian exceptions"); | ||
739 | } | ||
740 | } | ||
741 | #endif | ||
742 | |||
701 | if (firmware_has_feature(FW_FEATURE_LPAR)) | 743 | if (firmware_has_feature(FW_FEATURE_LPAR)) |
702 | hpte_init_lpar(); | 744 | hpte_init_lpar(); |
703 | else | 745 | else |