diff options
Diffstat (limited to 'arch/sparc64')
49 files changed, 450 insertions, 405 deletions
diff --git a/arch/sparc64/Makefile b/arch/sparc64/Makefile index 9cb75c852b45..4b8f2b084c21 100644 --- a/arch/sparc64/Makefile +++ b/arch/sparc64/Makefile | |||
@@ -1,4 +1,3 @@ | |||
1 | # $Id: Makefile,v 1.52 2002/02/09 19:49:31 davem Exp $ | ||
2 | # sparc64/Makefile | 1 | # sparc64/Makefile |
3 | # | 2 | # |
4 | # Makefile for the architecture dependent flags and dependencies on the | 3 | # Makefile for the architecture dependent flags and dependencies on the |
diff --git a/arch/sparc64/boot/Makefile b/arch/sparc64/boot/Makefile index 6968a6da57da..0458b5244f09 100644 --- a/arch/sparc64/boot/Makefile +++ b/arch/sparc64/boot/Makefile | |||
@@ -1,4 +1,3 @@ | |||
1 | # $Id: Makefile,v 1.4 1997/12/15 20:08:56 ecd Exp $ | ||
2 | # Makefile for the Sparc64 boot stuff. | 1 | # Makefile for the Sparc64 boot stuff. |
3 | # | 2 | # |
4 | # Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | 3 | # Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc64/boot/piggyback.c b/arch/sparc64/boot/piggyback.c index 36f907408c60..de364bfed0bb 100644 --- a/arch/sparc64/boot/piggyback.c +++ b/arch/sparc64/boot/piggyback.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: piggyback.c,v 1.2 2000/09/19 14:34:39 anton Exp $ | 1 | /* |
2 | Simple utility to make a single-image install kernel with initial ramdisk | 2 | Simple utility to make a single-image install kernel with initial ramdisk |
3 | for Sparc64 tftpbooting without need to set up nfs. | 3 | for Sparc64 tftpbooting without need to set up nfs. |
4 | 4 | ||
diff --git a/arch/sparc64/defconfig b/arch/sparc64/defconfig index aff93c9d13f4..76eb832527f2 100644 --- a/arch/sparc64/defconfig +++ b/arch/sparc64/defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.25 | 3 | # Linux kernel version: 2.6.26-rc2 |
4 | # Sat Apr 26 03:11:06 2008 | 4 | # Fri May 16 13:36:07 2008 |
5 | # | 5 | # |
6 | CONFIG_SPARC=y | 6 | CONFIG_SPARC=y |
7 | CONFIG_SPARC64=y | 7 | CONFIG_SPARC64=y |
@@ -74,6 +74,7 @@ CONFIG_SYSCTL=y | |||
74 | # CONFIG_EMBEDDED is not set | 74 | # CONFIG_EMBEDDED is not set |
75 | CONFIG_UID16=y | 75 | CONFIG_UID16=y |
76 | CONFIG_SYSCTL_SYSCALL=y | 76 | CONFIG_SYSCTL_SYSCALL=y |
77 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
77 | CONFIG_KALLSYMS=y | 78 | CONFIG_KALLSYMS=y |
78 | # CONFIG_KALLSYMS_ALL is not set | 79 | # CONFIG_KALLSYMS_ALL is not set |
79 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | 80 | # CONFIG_KALLSYMS_EXTRA_PASS is not set |
@@ -103,12 +104,14 @@ CONFIG_KPROBES=y | |||
103 | CONFIG_KRETPROBES=y | 104 | CONFIG_KRETPROBES=y |
104 | CONFIG_HAVE_KPROBES=y | 105 | CONFIG_HAVE_KPROBES=y |
105 | CONFIG_HAVE_KRETPROBES=y | 106 | CONFIG_HAVE_KRETPROBES=y |
107 | # CONFIG_HAVE_DMA_ATTRS is not set | ||
106 | CONFIG_PROC_PAGE_MONITOR=y | 108 | CONFIG_PROC_PAGE_MONITOR=y |
107 | CONFIG_SLABINFO=y | 109 | CONFIG_SLABINFO=y |
108 | CONFIG_RT_MUTEXES=y | 110 | CONFIG_RT_MUTEXES=y |
109 | # CONFIG_TINY_SHMEM is not set | 111 | # CONFIG_TINY_SHMEM is not set |
110 | CONFIG_BASE_SMALL=0 | 112 | CONFIG_BASE_SMALL=0 |
111 | CONFIG_MODULES=y | 113 | CONFIG_MODULES=y |
114 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
112 | CONFIG_MODULE_UNLOAD=y | 115 | CONFIG_MODULE_UNLOAD=y |
113 | CONFIG_MODULE_FORCE_UNLOAD=y | 116 | CONFIG_MODULE_FORCE_UNLOAD=y |
114 | CONFIG_MODVERSIONS=y | 117 | CONFIG_MODVERSIONS=y |
@@ -170,6 +173,7 @@ CONFIG_HAVE_MEMORY_PRESENT=y | |||
170 | CONFIG_SPARSEMEM_EXTREME=y | 173 | CONFIG_SPARSEMEM_EXTREME=y |
171 | CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y | 174 | CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y |
172 | CONFIG_SPARSEMEM_VMEMMAP=y | 175 | CONFIG_SPARSEMEM_VMEMMAP=y |
176 | CONFIG_PAGEFLAGS_EXTENDED=y | ||
173 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 177 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
174 | CONFIG_MIGRATION=y | 178 | CONFIG_MIGRATION=y |
175 | CONFIG_RESOURCES_64BIT=y | 179 | CONFIG_RESOURCES_64BIT=y |
@@ -402,7 +406,6 @@ CONFIG_IDEPCI_PCIBUS_ORDER=y | |||
402 | CONFIG_BLK_DEV_IDEDMA_PCI=y | 406 | CONFIG_BLK_DEV_IDEDMA_PCI=y |
403 | # CONFIG_BLK_DEV_AEC62XX is not set | 407 | # CONFIG_BLK_DEV_AEC62XX is not set |
404 | CONFIG_BLK_DEV_ALI15X3=y | 408 | CONFIG_BLK_DEV_ALI15X3=y |
405 | # CONFIG_WDC_ALI15X3 is not set | ||
406 | # CONFIG_BLK_DEV_AMD74XX is not set | 409 | # CONFIG_BLK_DEV_AMD74XX is not set |
407 | # CONFIG_BLK_DEV_CMD64X is not set | 410 | # CONFIG_BLK_DEV_CMD64X is not set |
408 | # CONFIG_BLK_DEV_TRIFLEX is not set | 411 | # CONFIG_BLK_DEV_TRIFLEX is not set |
@@ -609,6 +612,7 @@ CONFIG_NIU=m | |||
609 | # CONFIG_MLX4_CORE is not set | 612 | # CONFIG_MLX4_CORE is not set |
610 | # CONFIG_TEHUTI is not set | 613 | # CONFIG_TEHUTI is not set |
611 | # CONFIG_BNX2X is not set | 614 | # CONFIG_BNX2X is not set |
615 | # CONFIG_SFC is not set | ||
612 | # CONFIG_TR is not set | 616 | # CONFIG_TR is not set |
613 | 617 | ||
614 | # | 618 | # |
@@ -717,6 +721,7 @@ CONFIG_VT=y | |||
717 | CONFIG_VT_CONSOLE=y | 721 | CONFIG_VT_CONSOLE=y |
718 | CONFIG_HW_CONSOLE=y | 722 | CONFIG_HW_CONSOLE=y |
719 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | 723 | # CONFIG_VT_HW_CONSOLE_BINDING is not set |
724 | # CONFIG_DEVKMEM is not set | ||
720 | # CONFIG_SERIAL_NONSTANDARD is not set | 725 | # CONFIG_SERIAL_NONSTANDARD is not set |
721 | # CONFIG_NOZOMI is not set | 726 | # CONFIG_NOZOMI is not set |
722 | 727 | ||
@@ -793,12 +798,7 @@ CONFIG_I2C_ALGOBIT=y | |||
793 | # CONFIG_I2C_DEBUG_ALGO is not set | 798 | # CONFIG_I2C_DEBUG_ALGO is not set |
794 | # CONFIG_I2C_DEBUG_BUS is not set | 799 | # CONFIG_I2C_DEBUG_BUS is not set |
795 | # CONFIG_I2C_DEBUG_CHIP is not set | 800 | # CONFIG_I2C_DEBUG_CHIP is not set |
796 | |||
797 | # | ||
798 | # SPI support | ||
799 | # | ||
800 | # CONFIG_SPI is not set | 801 | # CONFIG_SPI is not set |
801 | # CONFIG_SPI_MASTER is not set | ||
802 | # CONFIG_W1 is not set | 802 | # CONFIG_W1 is not set |
803 | # CONFIG_POWER_SUPPLY is not set | 803 | # CONFIG_POWER_SUPPLY is not set |
804 | CONFIG_HWMON=y | 804 | CONFIG_HWMON=y |
@@ -873,8 +873,17 @@ CONFIG_SSB_POSSIBLE=y | |||
873 | # | 873 | # |
874 | # Multimedia devices | 874 | # Multimedia devices |
875 | # | 875 | # |
876 | |||
877 | # | ||
878 | # Multimedia core support | ||
879 | # | ||
876 | # CONFIG_VIDEO_DEV is not set | 880 | # CONFIG_VIDEO_DEV is not set |
877 | # CONFIG_DVB_CORE is not set | 881 | # CONFIG_DVB_CORE is not set |
882 | # CONFIG_VIDEO_MEDIA is not set | ||
883 | |||
884 | # | ||
885 | # Multimedia drivers | ||
886 | # | ||
878 | # CONFIG_DAB is not set | 887 | # CONFIG_DAB is not set |
879 | 888 | ||
880 | # | 889 | # |
@@ -893,8 +902,8 @@ CONFIG_FB_CFB_IMAGEBLIT=y | |||
893 | # CONFIG_FB_SYS_FILLRECT is not set | 902 | # CONFIG_FB_SYS_FILLRECT is not set |
894 | # CONFIG_FB_SYS_COPYAREA is not set | 903 | # CONFIG_FB_SYS_COPYAREA is not set |
895 | # CONFIG_FB_SYS_IMAGEBLIT is not set | 904 | # CONFIG_FB_SYS_IMAGEBLIT is not set |
905 | # CONFIG_FB_FOREIGN_ENDIAN is not set | ||
896 | # CONFIG_FB_SYS_FOPS is not set | 906 | # CONFIG_FB_SYS_FOPS is not set |
897 | CONFIG_FB_DEFERRED_IO=y | ||
898 | # CONFIG_FB_SVGALIB is not set | 907 | # CONFIG_FB_SVGALIB is not set |
899 | # CONFIG_FB_MACMODES is not set | 908 | # CONFIG_FB_MACMODES is not set |
900 | # CONFIG_FB_BACKLIGHT is not set | 909 | # CONFIG_FB_BACKLIGHT is not set |
@@ -1100,6 +1109,10 @@ CONFIG_SND_SUN_CS4231=m | |||
1100 | # | 1109 | # |
1101 | 1110 | ||
1102 | # | 1111 | # |
1112 | # SoC Audio for the Texas Instruments OMAP | ||
1113 | # | ||
1114 | |||
1115 | # | ||
1103 | # Open Sound System | 1116 | # Open Sound System |
1104 | # | 1117 | # |
1105 | # CONFIG_SOUND_PRIME is not set | 1118 | # CONFIG_SOUND_PRIME is not set |
@@ -1135,10 +1148,12 @@ CONFIG_USB_DEVICEFS=y | |||
1135 | # | 1148 | # |
1136 | # USB Host Controller Drivers | 1149 | # USB Host Controller Drivers |
1137 | # | 1150 | # |
1151 | # CONFIG_USB_C67X00_HCD is not set | ||
1138 | CONFIG_USB_EHCI_HCD=m | 1152 | CONFIG_USB_EHCI_HCD=m |
1139 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set | 1153 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set |
1140 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set | 1154 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set |
1141 | # CONFIG_USB_ISP116X_HCD is not set | 1155 | # CONFIG_USB_ISP116X_HCD is not set |
1156 | # CONFIG_USB_ISP1760_HCD is not set | ||
1142 | CONFIG_USB_OHCI_HCD=y | 1157 | CONFIG_USB_OHCI_HCD=y |
1143 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set | 1158 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set |
1144 | # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set | 1159 | # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set |
@@ -1173,6 +1188,7 @@ CONFIG_USB_STORAGE=m | |||
1173 | # CONFIG_USB_STORAGE_ALAUDA is not set | 1188 | # CONFIG_USB_STORAGE_ALAUDA is not set |
1174 | # CONFIG_USB_STORAGE_ONETOUCH is not set | 1189 | # CONFIG_USB_STORAGE_ONETOUCH is not set |
1175 | # CONFIG_USB_STORAGE_KARMA is not set | 1190 | # CONFIG_USB_STORAGE_KARMA is not set |
1191 | # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set | ||
1176 | # CONFIG_USB_LIBUSUAL is not set | 1192 | # CONFIG_USB_LIBUSUAL is not set |
1177 | 1193 | ||
1178 | # | 1194 | # |
@@ -1214,6 +1230,7 @@ CONFIG_USB_STORAGE=m | |||
1214 | # CONFIG_MMC is not set | 1230 | # CONFIG_MMC is not set |
1215 | # CONFIG_MEMSTICK is not set | 1231 | # CONFIG_MEMSTICK is not set |
1216 | # CONFIG_NEW_LEDS is not set | 1232 | # CONFIG_NEW_LEDS is not set |
1233 | # CONFIG_ACCESSIBILITY is not set | ||
1217 | # CONFIG_INFINIBAND is not set | 1234 | # CONFIG_INFINIBAND is not set |
1218 | # CONFIG_RTC_CLASS is not set | 1235 | # CONFIG_RTC_CLASS is not set |
1219 | # CONFIG_UIO is not set | 1236 | # CONFIG_UIO is not set |
@@ -1367,6 +1384,7 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y | |||
1367 | CONFIG_PRINTK_TIME=y | 1384 | CONFIG_PRINTK_TIME=y |
1368 | # CONFIG_ENABLE_WARN_DEPRECATED is not set | 1385 | # CONFIG_ENABLE_WARN_DEPRECATED is not set |
1369 | CONFIG_ENABLE_MUST_CHECK=y | 1386 | CONFIG_ENABLE_MUST_CHECK=y |
1387 | CONFIG_FRAME_WARN=2048 | ||
1370 | CONFIG_MAGIC_SYSRQ=y | 1388 | CONFIG_MAGIC_SYSRQ=y |
1371 | # CONFIG_UNUSED_SYMBOLS is not set | 1389 | # CONFIG_UNUSED_SYMBOLS is not set |
1372 | CONFIG_DEBUG_FS=y | 1390 | CONFIG_DEBUG_FS=y |
@@ -1377,6 +1395,7 @@ CONFIG_DETECT_SOFTLOCKUP=y | |||
1377 | # CONFIG_SCHED_DEBUG is not set | 1395 | # CONFIG_SCHED_DEBUG is not set |
1378 | CONFIG_SCHEDSTATS=y | 1396 | CONFIG_SCHEDSTATS=y |
1379 | # CONFIG_TIMER_STATS is not set | 1397 | # CONFIG_TIMER_STATS is not set |
1398 | # CONFIG_DEBUG_OBJECTS is not set | ||
1380 | # CONFIG_SLUB_DEBUG_ON is not set | 1399 | # CONFIG_SLUB_DEBUG_ON is not set |
1381 | # CONFIG_SLUB_STATS is not set | 1400 | # CONFIG_SLUB_STATS is not set |
1382 | # CONFIG_DEBUG_RT_MUTEXES is not set | 1401 | # CONFIG_DEBUG_RT_MUTEXES is not set |
@@ -1402,6 +1421,8 @@ CONFIG_DEBUG_BUGVERBOSE=y | |||
1402 | # CONFIG_LKDTM is not set | 1421 | # CONFIG_LKDTM is not set |
1403 | # CONFIG_FAULT_INJECTION is not set | 1422 | # CONFIG_FAULT_INJECTION is not set |
1404 | # CONFIG_SAMPLES is not set | 1423 | # CONFIG_SAMPLES is not set |
1424 | CONFIG_HAVE_ARCH_KGDB=y | ||
1425 | # CONFIG_KGDB is not set | ||
1405 | # CONFIG_DEBUG_STACK_USAGE is not set | 1426 | # CONFIG_DEBUG_STACK_USAGE is not set |
1406 | # CONFIG_DEBUG_DCFLUSH is not set | 1427 | # CONFIG_DEBUG_DCFLUSH is not set |
1407 | # CONFIG_STACK_DEBUG is not set | 1428 | # CONFIG_STACK_DEBUG is not set |
@@ -1503,6 +1524,7 @@ CONFIG_CRYPTO_HW=y | |||
1503 | # Library routines | 1524 | # Library routines |
1504 | # | 1525 | # |
1505 | CONFIG_BITREVERSE=y | 1526 | CONFIG_BITREVERSE=y |
1527 | # CONFIG_GENERIC_FIND_FIRST_BIT is not set | ||
1506 | CONFIG_CRC_CCITT=m | 1528 | CONFIG_CRC_CCITT=m |
1507 | CONFIG_CRC16=m | 1529 | CONFIG_CRC16=m |
1508 | # CONFIG_CRC_ITU_T is not set | 1530 | # CONFIG_CRC_ITU_T is not set |
diff --git a/arch/sparc64/kernel/dtlb_prot.S b/arch/sparc64/kernel/dtlb_prot.S index e0a920162604..b2c2c5be281c 100644 --- a/arch/sparc64/kernel/dtlb_prot.S +++ b/arch/sparc64/kernel/dtlb_prot.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: dtlb_prot.S,v 1.22 2001/04/11 23:40:32 davem Exp $ | 1 | /* |
2 | * dtlb_prot.S: DTLB protection trap strategy. | 2 | * dtlb_prot.S: DTLB protection trap strategy. |
3 | * This is included directly into the trap table. | 3 | * This is included directly into the trap table. |
4 | * | 4 | * |
diff --git a/arch/sparc64/kernel/ebus.c b/arch/sparc64/kernel/ebus.c index bc2632274840..c49d0388b793 100644 --- a/arch/sparc64/kernel/ebus.c +++ b/arch/sparc64/kernel/ebus.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: ebus.c,v 1.64 2001/11/08 04:41:33 davem Exp $ | 1 | /* |
2 | * ebus.c: PCI to EBus bridge device. | 2 | * ebus.c: PCI to EBus bridge device. |
3 | * | 3 | * |
4 | * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) | 4 | * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) |
diff --git a/arch/sparc64/kernel/etrap.S b/arch/sparc64/kernel/etrap.S index b49d3b60bc0c..29ce489bc188 100644 --- a/arch/sparc64/kernel/etrap.S +++ b/arch/sparc64/kernel/etrap.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: etrap.S,v 1.46 2002/02/09 19:49:30 davem Exp $ | 1 | /* |
2 | * etrap.S: Preparing for entry into the kernel on Sparc V9. | 2 | * etrap.S: Preparing for entry into the kernel on Sparc V9. |
3 | * | 3 | * |
4 | * Copyright (C) 1996, 1997 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1996, 1997 David S. Miller (davem@caip.rutgers.edu) |
@@ -27,11 +27,12 @@ | |||
27 | 27 | ||
28 | .text | 28 | .text |
29 | .align 64 | 29 | .align 64 |
30 | .globl etrap, etrap_irq, etraptl1 | 30 | .globl etrap_syscall, etrap, etrap_irq, etraptl1 |
31 | etrap: rdpr %pil, %g2 | 31 | etrap: rdpr %pil, %g2 |
32 | etrap_irq: | 32 | etrap_irq: clr %g3 |
33 | TRAP_LOAD_THREAD_REG(%g6, %g1) | 33 | etrap_syscall: TRAP_LOAD_THREAD_REG(%g6, %g1) |
34 | rdpr %tstate, %g1 | 34 | rdpr %tstate, %g1 |
35 | or %g1, %g3, %g1 | ||
35 | sllx %g2, 20, %g3 | 36 | sllx %g2, 20, %g3 |
36 | andcc %g1, TSTATE_PRIV, %g0 | 37 | andcc %g1, TSTATE_PRIV, %g0 |
37 | or %g1, %g3, %g1 | 38 | or %g1, %g3, %g1 |
diff --git a/arch/sparc64/kernel/idprom.c b/arch/sparc64/kernel/idprom.c index 3b6789e09a72..5b45a808c621 100644 --- a/arch/sparc64/kernel/idprom.c +++ b/arch/sparc64/kernel/idprom.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: idprom.c,v 1.3 1999/08/31 06:54:53 davem Exp $ | 1 | /* |
2 | * idprom.c: Routines to load the idprom into kernel addresses and | 2 | * idprom.c: Routines to load the idprom into kernel addresses and |
3 | * interpret the data contained within. | 3 | * interpret the data contained within. |
4 | * | 4 | * |
diff --git a/arch/sparc64/kernel/init_task.c b/arch/sparc64/kernel/init_task.c index 90007cf88bac..d2b312381c19 100644 --- a/arch/sparc64/kernel/init_task.c +++ b/arch/sparc64/kernel/init_task.c | |||
@@ -10,7 +10,6 @@ | |||
10 | #include <asm/processor.h> | 10 | #include <asm/processor.h> |
11 | 11 | ||
12 | static struct fs_struct init_fs = INIT_FS; | 12 | static struct fs_struct init_fs = INIT_FS; |
13 | static struct files_struct init_files = INIT_FILES; | ||
14 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 13 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
15 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 14 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
16 | struct mm_struct init_mm = INIT_MM(init_mm); | 15 | struct mm_struct init_mm = INIT_MM(init_mm); |
diff --git a/arch/sparc64/kernel/pci.c b/arch/sparc64/kernel/pci.c index dbf2fc2f4d87..112b09f16f36 100644 --- a/arch/sparc64/kernel/pci.c +++ b/arch/sparc64/kernel/pci.c | |||
@@ -350,8 +350,7 @@ static void pci_parse_of_addrs(struct of_device *op, | |||
350 | 350 | ||
351 | struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm, | 351 | struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm, |
352 | struct device_node *node, | 352 | struct device_node *node, |
353 | struct pci_bus *bus, int devfn, | 353 | struct pci_bus *bus, int devfn) |
354 | int host_controller) | ||
355 | { | 354 | { |
356 | struct dev_archdata *sd; | 355 | struct dev_archdata *sd; |
357 | struct pci_dev *dev; | 356 | struct pci_dev *dev; |
@@ -390,43 +389,28 @@ struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm, | |||
390 | dev->devfn = devfn; | 389 | dev->devfn = devfn; |
391 | dev->multifunction = 0; /* maybe a lie? */ | 390 | dev->multifunction = 0; /* maybe a lie? */ |
392 | 391 | ||
393 | if (host_controller) { | 392 | dev->vendor = of_getintprop_default(node, "vendor-id", 0xffff); |
394 | if (tlb_type != hypervisor) { | 393 | dev->device = of_getintprop_default(node, "device-id", 0xffff); |
395 | pci_read_config_word(dev, PCI_VENDOR_ID, | 394 | dev->subsystem_vendor = |
396 | &dev->vendor); | 395 | of_getintprop_default(node, "subsystem-vendor-id", 0); |
397 | pci_read_config_word(dev, PCI_DEVICE_ID, | 396 | dev->subsystem_device = |
398 | &dev->device); | 397 | of_getintprop_default(node, "subsystem-id", 0); |
399 | } else { | 398 | |
400 | dev->vendor = PCI_VENDOR_ID_SUN; | 399 | dev->cfg_size = pci_cfg_space_size(dev); |
401 | dev->device = 0x80f0; | 400 | |
402 | } | 401 | /* We can't actually use the firmware value, we have |
403 | dev->cfg_size = 256; | 402 | * to read what is in the register right now. One |
404 | dev->class = PCI_CLASS_BRIDGE_HOST << 8; | 403 | * reason is that in the case of IDE interfaces the |
405 | sprintf(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(bus), | 404 | * firmware can sample the value before the the IDE |
406 | 0x00, PCI_SLOT(devfn), PCI_FUNC(devfn)); | 405 | * interface is programmed into native mode. |
407 | } else { | 406 | */ |
408 | dev->vendor = of_getintprop_default(node, "vendor-id", 0xffff); | 407 | pci_read_config_dword(dev, PCI_CLASS_REVISION, &class); |
409 | dev->device = of_getintprop_default(node, "device-id", 0xffff); | 408 | dev->class = class >> 8; |
410 | dev->subsystem_vendor = | 409 | dev->revision = class & 0xff; |
411 | of_getintprop_default(node, "subsystem-vendor-id", 0); | 410 | |
412 | dev->subsystem_device = | 411 | sprintf(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(bus), |
413 | of_getintprop_default(node, "subsystem-id", 0); | 412 | dev->bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn)); |
414 | |||
415 | dev->cfg_size = pci_cfg_space_size(dev); | ||
416 | |||
417 | /* We can't actually use the firmware value, we have | ||
418 | * to read what is in the register right now. One | ||
419 | * reason is that in the case of IDE interfaces the | ||
420 | * firmware can sample the value before the the IDE | ||
421 | * interface is programmed into native mode. | ||
422 | */ | ||
423 | pci_read_config_dword(dev, PCI_CLASS_REVISION, &class); | ||
424 | dev->class = class >> 8; | ||
425 | dev->revision = class & 0xff; | ||
426 | 413 | ||
427 | sprintf(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(bus), | ||
428 | dev->bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn)); | ||
429 | } | ||
430 | if (ofpci_verbose) | 414 | if (ofpci_verbose) |
431 | printk(" class: 0x%x device name: %s\n", | 415 | printk(" class: 0x%x device name: %s\n", |
432 | dev->class, pci_name(dev)); | 416 | dev->class, pci_name(dev)); |
@@ -441,26 +425,21 @@ struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm, | |||
441 | dev->current_state = 4; /* unknown power state */ | 425 | dev->current_state = 4; /* unknown power state */ |
442 | dev->error_state = pci_channel_io_normal; | 426 | dev->error_state = pci_channel_io_normal; |
443 | 427 | ||
444 | if (host_controller) { | 428 | if (!strcmp(type, "pci") || !strcmp(type, "pciex")) { |
429 | /* a PCI-PCI bridge */ | ||
445 | dev->hdr_type = PCI_HEADER_TYPE_BRIDGE; | 430 | dev->hdr_type = PCI_HEADER_TYPE_BRIDGE; |
446 | dev->rom_base_reg = PCI_ROM_ADDRESS1; | 431 | dev->rom_base_reg = PCI_ROM_ADDRESS1; |
447 | dev->irq = PCI_IRQ_NONE; | 432 | } else if (!strcmp(type, "cardbus")) { |
433 | dev->hdr_type = PCI_HEADER_TYPE_CARDBUS; | ||
448 | } else { | 434 | } else { |
449 | if (!strcmp(type, "pci") || !strcmp(type, "pciex")) { | 435 | dev->hdr_type = PCI_HEADER_TYPE_NORMAL; |
450 | /* a PCI-PCI bridge */ | 436 | dev->rom_base_reg = PCI_ROM_ADDRESS; |
451 | dev->hdr_type = PCI_HEADER_TYPE_BRIDGE; | ||
452 | dev->rom_base_reg = PCI_ROM_ADDRESS1; | ||
453 | } else if (!strcmp(type, "cardbus")) { | ||
454 | dev->hdr_type = PCI_HEADER_TYPE_CARDBUS; | ||
455 | } else { | ||
456 | dev->hdr_type = PCI_HEADER_TYPE_NORMAL; | ||
457 | dev->rom_base_reg = PCI_ROM_ADDRESS; | ||
458 | 437 | ||
459 | dev->irq = sd->op->irqs[0]; | 438 | dev->irq = sd->op->irqs[0]; |
460 | if (dev->irq == 0xffffffff) | 439 | if (dev->irq == 0xffffffff) |
461 | dev->irq = PCI_IRQ_NONE; | 440 | dev->irq = PCI_IRQ_NONE; |
462 | } | ||
463 | } | 441 | } |
442 | |||
464 | pci_parse_of_addrs(sd->op, node, dev); | 443 | pci_parse_of_addrs(sd->op, node, dev); |
465 | 444 | ||
466 | if (ofpci_verbose) | 445 | if (ofpci_verbose) |
@@ -749,7 +728,7 @@ static void __devinit pci_of_scan_bus(struct pci_pbm_info *pbm, | |||
749 | prev_devfn = devfn; | 728 | prev_devfn = devfn; |
750 | 729 | ||
751 | /* create a new pci_dev for this device */ | 730 | /* create a new pci_dev for this device */ |
752 | dev = of_create_pci_dev(pbm, child, bus, devfn, 0); | 731 | dev = of_create_pci_dev(pbm, child, bus, devfn); |
753 | if (!dev) | 732 | if (!dev) |
754 | continue; | 733 | continue; |
755 | if (ofpci_verbose) | 734 | if (ofpci_verbose) |
@@ -796,48 +775,9 @@ static void __devinit pci_bus_register_of_sysfs(struct pci_bus *bus) | |||
796 | pci_bus_register_of_sysfs(child_bus); | 775 | pci_bus_register_of_sysfs(child_bus); |
797 | } | 776 | } |
798 | 777 | ||
799 | int pci_host_bridge_read_pci_cfg(struct pci_bus *bus_dev, | ||
800 | unsigned int devfn, | ||
801 | int where, int size, | ||
802 | u32 *value) | ||
803 | { | ||
804 | static u8 fake_pci_config[] = { | ||
805 | 0x8e, 0x10, /* Vendor: 0x108e (Sun) */ | ||
806 | 0xf0, 0x80, /* Device: 0x80f0 (Fire) */ | ||
807 | 0x46, 0x01, /* Command: 0x0146 (SERR, PARITY, MASTER, MEM) */ | ||
808 | 0xa0, 0x22, /* Status: 0x02a0 (DEVSEL_MED, FB2B, 66MHZ) */ | ||
809 | 0x00, 0x00, 0x00, 0x06, /* Class: 0x06000000 host bridge */ | ||
810 | 0x00, /* Cacheline: 0x00 */ | ||
811 | 0x40, /* Latency: 0x40 */ | ||
812 | 0x00, /* Header-Type: 0x00 normal */ | ||
813 | }; | ||
814 | |||
815 | *value = 0; | ||
816 | if (where >= 0 && where < sizeof(fake_pci_config) && | ||
817 | (where + size) >= 0 && | ||
818 | (where + size) < sizeof(fake_pci_config) && | ||
819 | size <= sizeof(u32)) { | ||
820 | while (size--) { | ||
821 | *value <<= 8; | ||
822 | *value |= fake_pci_config[where + size]; | ||
823 | } | ||
824 | } | ||
825 | |||
826 | return PCIBIOS_SUCCESSFUL; | ||
827 | } | ||
828 | |||
829 | int pci_host_bridge_write_pci_cfg(struct pci_bus *bus_dev, | ||
830 | unsigned int devfn, | ||
831 | int where, int size, | ||
832 | u32 value) | ||
833 | { | ||
834 | return PCIBIOS_SUCCESSFUL; | ||
835 | } | ||
836 | |||
837 | struct pci_bus * __devinit pci_scan_one_pbm(struct pci_pbm_info *pbm) | 778 | struct pci_bus * __devinit pci_scan_one_pbm(struct pci_pbm_info *pbm) |
838 | { | 779 | { |
839 | struct device_node *node = pbm->prom_node; | 780 | struct device_node *node = pbm->prom_node; |
840 | struct pci_dev *host_pdev; | ||
841 | struct pci_bus *bus; | 781 | struct pci_bus *bus; |
842 | 782 | ||
843 | printk("PCI: Scanning PBM %s\n", node->full_name); | 783 | printk("PCI: Scanning PBM %s\n", node->full_name); |
@@ -855,10 +795,6 @@ struct pci_bus * __devinit pci_scan_one_pbm(struct pci_pbm_info *pbm) | |||
855 | bus->resource[0] = &pbm->io_space; | 795 | bus->resource[0] = &pbm->io_space; |
856 | bus->resource[1] = &pbm->mem_space; | 796 | bus->resource[1] = &pbm->mem_space; |
857 | 797 | ||
858 | /* Create the dummy host bridge and link it in. */ | ||
859 | host_pdev = of_create_pci_dev(pbm, node, bus, 0x00, 1); | ||
860 | bus->self = host_pdev; | ||
861 | |||
862 | pci_of_scan_bus(pbm, node, bus); | 798 | pci_of_scan_bus(pbm, node, bus); |
863 | pci_bus_add_devices(bus); | 799 | pci_bus_add_devices(bus); |
864 | pci_bus_register_of_sysfs(bus); | 800 | pci_bus_register_of_sysfs(bus); |
diff --git a/arch/sparc64/kernel/pci_common.c b/arch/sparc64/kernel/pci_common.c index 923e0bcc3bfd..19fa621d6a60 100644 --- a/arch/sparc64/kernel/pci_common.c +++ b/arch/sparc64/kernel/pci_common.c | |||
@@ -264,9 +264,6 @@ static int sun4v_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn, | |||
264 | unsigned int func = PCI_FUNC(devfn); | 264 | unsigned int func = PCI_FUNC(devfn); |
265 | unsigned long ret; | 265 | unsigned long ret; |
266 | 266 | ||
267 | if (!bus && devfn == 0x00) | ||
268 | return pci_host_bridge_read_pci_cfg(bus_dev, devfn, where, | ||
269 | size, value); | ||
270 | if (config_out_of_range(pbm, bus, devfn, where)) { | 267 | if (config_out_of_range(pbm, bus, devfn, where)) { |
271 | ret = ~0UL; | 268 | ret = ~0UL; |
272 | } else { | 269 | } else { |
@@ -300,9 +297,6 @@ static int sun4v_write_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn, | |||
300 | unsigned int func = PCI_FUNC(devfn); | 297 | unsigned int func = PCI_FUNC(devfn); |
301 | unsigned long ret; | 298 | unsigned long ret; |
302 | 299 | ||
303 | if (!bus && devfn == 0x00) | ||
304 | return pci_host_bridge_write_pci_cfg(bus_dev, devfn, where, | ||
305 | size, value); | ||
306 | if (config_out_of_range(pbm, bus, devfn, where)) { | 300 | if (config_out_of_range(pbm, bus, devfn, where)) { |
307 | /* Do nothing. */ | 301 | /* Do nothing. */ |
308 | } else { | 302 | } else { |
diff --git a/arch/sparc64/kernel/pci_impl.h b/arch/sparc64/kernel/pci_impl.h index 218bac4ff79b..c385d126be11 100644 --- a/arch/sparc64/kernel/pci_impl.h +++ b/arch/sparc64/kernel/pci_impl.h | |||
@@ -167,15 +167,6 @@ extern void pci_get_pbm_props(struct pci_pbm_info *pbm); | |||
167 | extern struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm); | 167 | extern struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm); |
168 | extern void pci_determine_mem_io_space(struct pci_pbm_info *pbm); | 168 | extern void pci_determine_mem_io_space(struct pci_pbm_info *pbm); |
169 | 169 | ||
170 | extern int pci_host_bridge_read_pci_cfg(struct pci_bus *bus_dev, | ||
171 | unsigned int devfn, | ||
172 | int where, int size, | ||
173 | u32 *value); | ||
174 | extern int pci_host_bridge_write_pci_cfg(struct pci_bus *bus_dev, | ||
175 | unsigned int devfn, | ||
176 | int where, int size, | ||
177 | u32 value); | ||
178 | |||
179 | /* Error reporting support. */ | 170 | /* Error reporting support. */ |
180 | extern void pci_scan_for_target_abort(struct pci_pbm_info *, struct pci_bus *); | 171 | extern void pci_scan_for_target_abort(struct pci_pbm_info *, struct pci_bus *); |
181 | extern void pci_scan_for_master_abort(struct pci_pbm_info *, struct pci_bus *); | 172 | extern void pci_scan_for_master_abort(struct pci_pbm_info *, struct pci_bus *); |
diff --git a/arch/sparc64/kernel/process.c b/arch/sparc64/kernel/process.c index 056013749157..2084f81a76e1 100644 --- a/arch/sparc64/kernel/process.c +++ b/arch/sparc64/kernel/process.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* arch/sparc64/kernel/process.c | 1 | /* arch/sparc64/kernel/process.c |
2 | * | 2 | * |
3 | * Copyright (C) 1995, 1996 David S. Miller (davem@caip.rutgers.edu) | 3 | * Copyright (C) 1995, 1996, 2008 David S. Miller (davem@davemloft.net) |
4 | * Copyright (C) 1996 Eddie C. Dost (ecd@skynet.be) | 4 | * Copyright (C) 1996 Eddie C. Dost (ecd@skynet.be) |
5 | * Copyright (C) 1997, 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) | 5 | * Copyright (C) 1997, 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) |
6 | */ | 6 | */ |
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/init.h> | 30 | #include <linux/init.h> |
31 | #include <linux/cpu.h> | 31 | #include <linux/cpu.h> |
32 | #include <linux/elfcore.h> | 32 | #include <linux/elfcore.h> |
33 | #include <linux/sysrq.h> | ||
33 | 34 | ||
34 | #include <asm/oplib.h> | 35 | #include <asm/oplib.h> |
35 | #include <asm/uaccess.h> | 36 | #include <asm/uaccess.h> |
@@ -49,6 +50,8 @@ | |||
49 | #include <asm/sstate.h> | 50 | #include <asm/sstate.h> |
50 | #include <asm/reboot.h> | 51 | #include <asm/reboot.h> |
51 | #include <asm/syscalls.h> | 52 | #include <asm/syscalls.h> |
53 | #include <asm/irq_regs.h> | ||
54 | #include <asm/smp.h> | ||
52 | 55 | ||
53 | /* #define VERBOSE_SHOWREGS */ | 56 | /* #define VERBOSE_SHOWREGS */ |
54 | 57 | ||
@@ -298,6 +301,118 @@ void show_regs(struct pt_regs *regs) | |||
298 | #endif | 301 | #endif |
299 | } | 302 | } |
300 | 303 | ||
304 | #ifdef CONFIG_MAGIC_SYSRQ | ||
305 | struct global_reg_snapshot global_reg_snapshot[NR_CPUS]; | ||
306 | static DEFINE_SPINLOCK(global_reg_snapshot_lock); | ||
307 | |||
308 | static void __global_reg_self(struct thread_info *tp, struct pt_regs *regs, | ||
309 | int this_cpu) | ||
310 | { | ||
311 | flushw_all(); | ||
312 | |||
313 | global_reg_snapshot[this_cpu].tstate = regs->tstate; | ||
314 | global_reg_snapshot[this_cpu].tpc = regs->tpc; | ||
315 | global_reg_snapshot[this_cpu].tnpc = regs->tnpc; | ||
316 | global_reg_snapshot[this_cpu].o7 = regs->u_regs[UREG_I7]; | ||
317 | |||
318 | if (regs->tstate & TSTATE_PRIV) { | ||
319 | struct reg_window *rw; | ||
320 | |||
321 | rw = (struct reg_window *) | ||
322 | (regs->u_regs[UREG_FP] + STACK_BIAS); | ||
323 | global_reg_snapshot[this_cpu].i7 = rw->ins[6]; | ||
324 | } else | ||
325 | global_reg_snapshot[this_cpu].i7 = 0; | ||
326 | |||
327 | global_reg_snapshot[this_cpu].thread = tp; | ||
328 | } | ||
329 | |||
330 | /* In order to avoid hangs we do not try to synchronize with the | ||
331 | * global register dump client cpus. The last store they make is to | ||
332 | * the thread pointer, so do a short poll waiting for that to become | ||
333 | * non-NULL. | ||
334 | */ | ||
335 | static void __global_reg_poll(struct global_reg_snapshot *gp) | ||
336 | { | ||
337 | int limit = 0; | ||
338 | |||
339 | while (!gp->thread && ++limit < 100) { | ||
340 | barrier(); | ||
341 | udelay(1); | ||
342 | } | ||
343 | } | ||
344 | |||
345 | static void sysrq_handle_globreg(int key, struct tty_struct *tty) | ||
346 | { | ||
347 | struct thread_info *tp = current_thread_info(); | ||
348 | struct pt_regs *regs = get_irq_regs(); | ||
349 | #ifdef CONFIG_KALLSYMS | ||
350 | char buffer[KSYM_SYMBOL_LEN]; | ||
351 | #endif | ||
352 | unsigned long flags; | ||
353 | int this_cpu, cpu; | ||
354 | |||
355 | if (!regs) | ||
356 | regs = tp->kregs; | ||
357 | |||
358 | spin_lock_irqsave(&global_reg_snapshot_lock, flags); | ||
359 | |||
360 | memset(global_reg_snapshot, 0, sizeof(global_reg_snapshot)); | ||
361 | |||
362 | this_cpu = raw_smp_processor_id(); | ||
363 | |||
364 | __global_reg_self(tp, regs, this_cpu); | ||
365 | |||
366 | smp_fetch_global_regs(); | ||
367 | |||
368 | for_each_online_cpu(cpu) { | ||
369 | struct global_reg_snapshot *gp = &global_reg_snapshot[cpu]; | ||
370 | struct thread_info *tp; | ||
371 | |||
372 | __global_reg_poll(gp); | ||
373 | |||
374 | tp = gp->thread; | ||
375 | printk("%c CPU[%3d]: TSTATE[%016lx] TPC[%016lx] TNPC[%016lx] TASK[%s:%d]\n", | ||
376 | (cpu == this_cpu ? '*' : ' '), cpu, | ||
377 | gp->tstate, gp->tpc, gp->tnpc, | ||
378 | ((tp && tp->task) ? tp->task->comm : "NULL"), | ||
379 | ((tp && tp->task) ? tp->task->pid : -1)); | ||
380 | #ifdef CONFIG_KALLSYMS | ||
381 | if (gp->tstate & TSTATE_PRIV) { | ||
382 | sprint_symbol(buffer, gp->tpc); | ||
383 | printk(" TPC[%s] ", buffer); | ||
384 | sprint_symbol(buffer, gp->o7); | ||
385 | printk("O7[%s] ", buffer); | ||
386 | sprint_symbol(buffer, gp->i7); | ||
387 | printk("I7[%s]\n", buffer); | ||
388 | } else | ||
389 | #endif | ||
390 | { | ||
391 | printk(" TPC[%lx] O7[%lx] I7[%lx]\n", | ||
392 | gp->tpc, gp->o7, gp->i7); | ||
393 | } | ||
394 | } | ||
395 | |||
396 | memset(global_reg_snapshot, 0, sizeof(global_reg_snapshot)); | ||
397 | |||
398 | spin_unlock_irqrestore(&global_reg_snapshot_lock, flags); | ||
399 | } | ||
400 | |||
401 | static struct sysrq_key_op sparc_globalreg_op = { | ||
402 | .handler = sysrq_handle_globreg, | ||
403 | .help_msg = "Globalregs", | ||
404 | .action_msg = "Show Global CPU Regs", | ||
405 | }; | ||
406 | |||
407 | static int __init sparc_globreg_init(void) | ||
408 | { | ||
409 | return register_sysrq_key('y', &sparc_globalreg_op); | ||
410 | } | ||
411 | |||
412 | core_initcall(sparc_globreg_init); | ||
413 | |||
414 | #endif | ||
415 | |||
301 | unsigned long thread_saved_pc(struct task_struct *tsk) | 416 | unsigned long thread_saved_pc(struct task_struct *tsk) |
302 | { | 417 | { |
303 | struct thread_info *ti = task_thread_info(tsk); | 418 | struct thread_info *ti = task_thread_info(tsk); |
@@ -503,6 +618,8 @@ asmlinkage long sparc_do_fork(unsigned long clone_flags, | |||
503 | unsigned long stack_size) | 618 | unsigned long stack_size) |
504 | { | 619 | { |
505 | int __user *parent_tid_ptr, *child_tid_ptr; | 620 | int __user *parent_tid_ptr, *child_tid_ptr; |
621 | unsigned long orig_i1 = regs->u_regs[UREG_I1]; | ||
622 | long ret; | ||
506 | 623 | ||
507 | #ifdef CONFIG_COMPAT | 624 | #ifdef CONFIG_COMPAT |
508 | if (test_thread_flag(TIF_32BIT)) { | 625 | if (test_thread_flag(TIF_32BIT)) { |
@@ -515,9 +632,19 @@ asmlinkage long sparc_do_fork(unsigned long clone_flags, | |||
515 | child_tid_ptr = (int __user *) regs->u_regs[UREG_I4]; | 632 | child_tid_ptr = (int __user *) regs->u_regs[UREG_I4]; |
516 | } | 633 | } |
517 | 634 | ||
518 | return do_fork(clone_flags, stack_start, | 635 | ret = do_fork(clone_flags, stack_start, |
519 | regs, stack_size, | 636 | regs, stack_size, |
520 | parent_tid_ptr, child_tid_ptr); | 637 | parent_tid_ptr, child_tid_ptr); |
638 | |||
639 | /* If we get an error and potentially restart the system | ||
640 | * call, we're screwed because copy_thread() clobbered | ||
641 | * the parent's %o1. So detect that case and restore it | ||
642 | * here. | ||
643 | */ | ||
644 | if ((unsigned long)ret >= -ERESTART_RESTARTBLOCK) | ||
645 | regs->u_regs[UREG_I1] = orig_i1; | ||
646 | |||
647 | return ret; | ||
521 | } | 648 | } |
522 | 649 | ||
523 | /* Copy a Sparc thread. The fork() return value conventions | 650 | /* Copy a Sparc thread. The fork() return value conventions |
@@ -530,20 +657,39 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, | |||
530 | struct task_struct *p, struct pt_regs *regs) | 657 | struct task_struct *p, struct pt_regs *regs) |
531 | { | 658 | { |
532 | struct thread_info *t = task_thread_info(p); | 659 | struct thread_info *t = task_thread_info(p); |
660 | struct sparc_stackf *parent_sf; | ||
661 | unsigned long child_stack_sz; | ||
533 | char *child_trap_frame; | 662 | char *child_trap_frame; |
663 | int kernel_thread; | ||
534 | 664 | ||
535 | /* Calculate offset to stack_frame & pt_regs */ | 665 | kernel_thread = (regs->tstate & TSTATE_PRIV) ? 1 : 0; |
536 | child_trap_frame = task_stack_page(p) + (THREAD_SIZE - (TRACEREG_SZ+STACKFRAME_SZ)); | 666 | parent_sf = ((struct sparc_stackf *) regs) - 1; |
537 | memcpy(child_trap_frame, (((struct sparc_stackf *)regs)-1), (TRACEREG_SZ+STACKFRAME_SZ)); | ||
538 | 667 | ||
539 | t->flags = (t->flags & ~((0xffUL << TI_FLAG_CWP_SHIFT) | (0xffUL << TI_FLAG_CURRENT_DS_SHIFT))) | | 668 | /* Calculate offset to stack_frame & pt_regs */ |
669 | child_stack_sz = ((STACKFRAME_SZ + TRACEREG_SZ) + | ||
670 | (kernel_thread ? STACKFRAME_SZ : 0)); | ||
671 | child_trap_frame = (task_stack_page(p) + | ||
672 | (THREAD_SIZE - child_stack_sz)); | ||
673 | memcpy(child_trap_frame, parent_sf, child_stack_sz); | ||
674 | |||
675 | t->flags = (t->flags & ~((0xffUL << TI_FLAG_CWP_SHIFT) | | ||
676 | (0xffUL << TI_FLAG_CURRENT_DS_SHIFT))) | | ||
540 | (((regs->tstate + 1) & TSTATE_CWP) << TI_FLAG_CWP_SHIFT); | 677 | (((regs->tstate + 1) & TSTATE_CWP) << TI_FLAG_CWP_SHIFT); |
541 | t->new_child = 1; | 678 | t->new_child = 1; |
542 | t->ksp = ((unsigned long) child_trap_frame) - STACK_BIAS; | 679 | t->ksp = ((unsigned long) child_trap_frame) - STACK_BIAS; |
543 | t->kregs = (struct pt_regs *)(child_trap_frame+sizeof(struct sparc_stackf)); | 680 | t->kregs = (struct pt_regs *) (child_trap_frame + |
681 | sizeof(struct sparc_stackf)); | ||
544 | t->fpsaved[0] = 0; | 682 | t->fpsaved[0] = 0; |
545 | 683 | ||
546 | if (regs->tstate & TSTATE_PRIV) { | 684 | if (kernel_thread) { |
685 | struct sparc_stackf *child_sf = (struct sparc_stackf *) | ||
686 | (child_trap_frame + (STACKFRAME_SZ + TRACEREG_SZ)); | ||
687 | |||
688 | /* Zero terminate the stack backtrace. */ | ||
689 | child_sf->fp = NULL; | ||
690 | t->kregs->u_regs[UREG_FP] = | ||
691 | ((unsigned long) child_sf) - STACK_BIAS; | ||
692 | |||
547 | /* Special case, if we are spawning a kernel thread from | 693 | /* Special case, if we are spawning a kernel thread from |
548 | * a userspace task (via KMOD, NFS, or similar) we must | 694 | * a userspace task (via KMOD, NFS, or similar) we must |
549 | * disable performance counters in the child because the | 695 | * disable performance counters in the child because the |
@@ -554,12 +700,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, | |||
554 | t->pcr_reg = 0; | 700 | t->pcr_reg = 0; |
555 | t->flags &= ~_TIF_PERFCTR; | 701 | t->flags &= ~_TIF_PERFCTR; |
556 | } | 702 | } |
557 | t->kregs->u_regs[UREG_FP] = t->ksp; | ||
558 | t->flags |= ((long)ASI_P << TI_FLAG_CURRENT_DS_SHIFT); | 703 | t->flags |= ((long)ASI_P << TI_FLAG_CURRENT_DS_SHIFT); |
559 | flush_register_windows(); | ||
560 | memcpy((void *)(t->ksp + STACK_BIAS), | ||
561 | (void *)(regs->u_regs[UREG_FP] + STACK_BIAS), | ||
562 | sizeof(struct sparc_stackf)); | ||
563 | t->kregs->u_regs[UREG_G6] = (unsigned long) t; | 704 | t->kregs->u_regs[UREG_G6] = (unsigned long) t; |
564 | t->kregs->u_regs[UREG_G4] = (unsigned long) t->task; | 705 | t->kregs->u_regs[UREG_G4] = (unsigned long) t->task; |
565 | } else { | 706 | } else { |
@@ -591,12 +732,6 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, | |||
591 | if (clone_flags & CLONE_SETTLS) | 732 | if (clone_flags & CLONE_SETTLS) |
592 | t->kregs->u_regs[UREG_G7] = regs->u_regs[UREG_I3]; | 733 | t->kregs->u_regs[UREG_G7] = regs->u_regs[UREG_I3]; |
593 | 734 | ||
594 | /* We do not want to accidently trigger system call restart | ||
595 | * handling in the new thread. Therefore, clear out the trap | ||
596 | * type, which will make pt_regs_regs_is_syscall() return false. | ||
597 | */ | ||
598 | pt_regs_clear_trap_type(t->kregs); | ||
599 | |||
600 | return 0; | 735 | return 0; |
601 | } | 736 | } |
602 | 737 | ||
diff --git a/arch/sparc64/kernel/ptrace.c b/arch/sparc64/kernel/ptrace.c index e9fc0aa2da38..f6c9fc92921d 100644 --- a/arch/sparc64/kernel/ptrace.c +++ b/arch/sparc64/kernel/ptrace.c | |||
@@ -287,11 +287,11 @@ static int genregs64_set(struct task_struct *target, | |||
287 | 32 * sizeof(u64), | 287 | 32 * sizeof(u64), |
288 | 33 * sizeof(u64)); | 288 | 33 * sizeof(u64)); |
289 | if (!ret) { | 289 | if (!ret) { |
290 | /* Only the condition codes can be modified | 290 | /* Only the condition codes and the "in syscall" |
291 | * in the %tstate register. | 291 | * state can be modified in the %tstate register. |
292 | */ | 292 | */ |
293 | tstate &= (TSTATE_ICC | TSTATE_XCC); | 293 | tstate &= (TSTATE_ICC | TSTATE_XCC | TSTATE_SYSCALL); |
294 | regs->tstate &= ~(TSTATE_ICC | TSTATE_XCC); | 294 | regs->tstate &= ~(TSTATE_ICC | TSTATE_XCC | TSTATE_SYSCALL); |
295 | regs->tstate |= tstate; | 295 | regs->tstate |= tstate; |
296 | } | 296 | } |
297 | } | 297 | } |
@@ -657,8 +657,10 @@ static int genregs32_set(struct task_struct *target, | |||
657 | switch (pos) { | 657 | switch (pos) { |
658 | case 32: /* PSR */ | 658 | case 32: /* PSR */ |
659 | tstate = regs->tstate; | 659 | tstate = regs->tstate; |
660 | tstate &= ~(TSTATE_ICC | TSTATE_XCC); | 660 | tstate &= ~(TSTATE_ICC | TSTATE_XCC | TSTATE_SYSCALL); |
661 | tstate |= psr_to_tstate_icc(reg); | 661 | tstate |= psr_to_tstate_icc(reg); |
662 | if (reg & PSR_SYSCALL) | ||
663 | tstate |= TSTATE_SYSCALL; | ||
662 | regs->tstate = tstate; | 664 | regs->tstate = tstate; |
663 | break; | 665 | break; |
664 | case 33: /* PC */ | 666 | case 33: /* PC */ |
@@ -944,6 +946,8 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | |||
944 | break; | 946 | break; |
945 | 947 | ||
946 | default: | 948 | default: |
949 | if (request == PTRACE_SPARC_DETACH) | ||
950 | request = PTRACE_DETACH; | ||
947 | ret = compat_ptrace_request(child, request, addr, data); | 951 | ret = compat_ptrace_request(child, request, addr, data); |
948 | break; | 952 | break; |
949 | } | 953 | } |
@@ -1036,6 +1040,8 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
1036 | break; | 1040 | break; |
1037 | 1041 | ||
1038 | default: | 1042 | default: |
1043 | if (request == PTRACE_SPARC_DETACH) | ||
1044 | request = PTRACE_DETACH; | ||
1039 | ret = ptrace_request(child, request, addr, data); | 1045 | ret = ptrace_request(child, request, addr, data); |
1040 | break; | 1046 | break; |
1041 | } | 1047 | } |
diff --git a/arch/sparc64/kernel/rtrap.S b/arch/sparc64/kernel/rtrap.S index ecf6753b204a..c6fc695fe1fe 100644 --- a/arch/sparc64/kernel/rtrap.S +++ b/arch/sparc64/kernel/rtrap.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: rtrap.S,v 1.61 2002/02/09 19:49:31 davem Exp $ | 1 | /* |
2 | * rtrap.S: Preparing for return from trap on Sparc V9. | 2 | * rtrap.S: Preparing for return from trap on Sparc V9. |
3 | * | 3 | * |
4 | * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) | 4 | * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) |
@@ -46,7 +46,7 @@ __handle_user_windows: | |||
46 | wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate | 46 | wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate |
47 | ldx [%g6 + TI_FLAGS], %l0 | 47 | ldx [%g6 + TI_FLAGS], %l0 |
48 | 48 | ||
49 | 1: andcc %l0, (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK), %g0 | 49 | 1: andcc %l0, _TIF_SIGPENDING, %g0 |
50 | be,pt %xcc, __handle_user_windows_continue | 50 | be,pt %xcc, __handle_user_windows_continue |
51 | nop | 51 | nop |
52 | mov %l5, %o1 | 52 | mov %l5, %o1 |
@@ -86,7 +86,7 @@ __handle_perfctrs: | |||
86 | wrpr %g0, RTRAP_PSTATE, %pstate | 86 | wrpr %g0, RTRAP_PSTATE, %pstate |
87 | wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate | 87 | wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate |
88 | ldx [%g6 + TI_FLAGS], %l0 | 88 | ldx [%g6 + TI_FLAGS], %l0 |
89 | 1: andcc %l0, (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK), %g0 | 89 | 1: andcc %l0, _TIF_SIGPENDING, %g0 |
90 | 90 | ||
91 | be,pt %xcc, __handle_perfctrs_continue | 91 | be,pt %xcc, __handle_perfctrs_continue |
92 | sethi %hi(TSTATE_PEF), %o0 | 92 | sethi %hi(TSTATE_PEF), %o0 |
@@ -195,7 +195,7 @@ __handle_preemption_continue: | |||
195 | andcc %l1, %o0, %g0 | 195 | andcc %l1, %o0, %g0 |
196 | andcc %l0, _TIF_NEED_RESCHED, %g0 | 196 | andcc %l0, _TIF_NEED_RESCHED, %g0 |
197 | bne,pn %xcc, __handle_preemption | 197 | bne,pn %xcc, __handle_preemption |
198 | andcc %l0, (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK), %g0 | 198 | andcc %l0, _TIF_SIGPENDING, %g0 |
199 | bne,pn %xcc, __handle_signal | 199 | bne,pn %xcc, __handle_signal |
200 | __handle_signal_continue: | 200 | __handle_signal_continue: |
201 | ldub [%g6 + TI_WSAVED], %o2 | 201 | ldub [%g6 + TI_WSAVED], %o2 |
@@ -257,6 +257,7 @@ rt_continue: ldx [%sp + PTREGS_OFF + PT_V9_G1], %g1 | |||
257 | wr %o3, %g0, %y | 257 | wr %o3, %g0, %y |
258 | wrpr %l4, 0x0, %pil | 258 | wrpr %l4, 0x0, %pil |
259 | wrpr %g0, 0x1, %tl | 259 | wrpr %g0, 0x1, %tl |
260 | andn %l1, TSTATE_SYSCALL, %l1 | ||
260 | wrpr %l1, %g0, %tstate | 261 | wrpr %l1, %g0, %tstate |
261 | wrpr %l2, %g0, %tpc | 262 | wrpr %l2, %g0, %tpc |
262 | wrpr %o2, %g0, %tnpc | 263 | wrpr %o2, %g0, %tnpc |
@@ -362,6 +363,7 @@ kern_rtt: rdpr %canrestore, %g1 | |||
362 | brz,pn %g1, kern_rtt_fill | 363 | brz,pn %g1, kern_rtt_fill |
363 | nop | 364 | nop |
364 | kern_rtt_restore: | 365 | kern_rtt_restore: |
366 | stw %g0, [%sp + PTREGS_OFF + PT_V9_MAGIC] | ||
365 | restore | 367 | restore |
366 | retry | 368 | retry |
367 | 369 | ||
diff --git a/arch/sparc64/kernel/sbus.c b/arch/sparc64/kernel/sbus.c index fa2827c4a3ad..e33a8a660e9e 100644 --- a/arch/sparc64/kernel/sbus.c +++ b/arch/sparc64/kernel/sbus.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: sbus.c,v 1.19 2002/01/23 11:27:32 davem Exp $ | 1 | /* |
2 | * sbus.c: UltraSparc SBUS controller support. | 2 | * sbus.c: UltraSparc SBUS controller support. |
3 | * | 3 | * |
4 | * Copyright (C) 1999 David S. Miller (davem@redhat.com) | 4 | * Copyright (C) 1999 David S. Miller (davem@redhat.com) |
diff --git a/arch/sparc64/kernel/setup.c b/arch/sparc64/kernel/setup.c index da5e6ee0c661..c8b03a4f68bf 100644 --- a/arch/sparc64/kernel/setup.c +++ b/arch/sparc64/kernel/setup.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: setup.c,v 1.72 2002/02/09 19:49:30 davem Exp $ | 1 | /* |
2 | * linux/arch/sparc64/kernel/setup.c | 2 | * linux/arch/sparc64/kernel/setup.c |
3 | * | 3 | * |
4 | * Copyright (C) 1995,1996 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1995,1996 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc64/kernel/signal.c b/arch/sparc64/kernel/signal.c index f2d88d8f7a42..9667e96fd513 100644 --- a/arch/sparc64/kernel/signal.c +++ b/arch/sparc64/kernel/signal.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: signal.c,v 1.60 2002/02/09 19:49:31 davem Exp $ | 1 | /* |
2 | * arch/sparc64/kernel/signal.c | 2 | * arch/sparc64/kernel/signal.c |
3 | * | 3 | * |
4 | * Copyright (C) 1991, 1992 Linus Torvalds | 4 | * Copyright (C) 1991, 1992 Linus Torvalds |
@@ -247,7 +247,9 @@ static long _sigpause_common(old_sigset_t set) | |||
247 | 247 | ||
248 | current->state = TASK_INTERRUPTIBLE; | 248 | current->state = TASK_INTERRUPTIBLE; |
249 | schedule(); | 249 | schedule(); |
250 | set_thread_flag(TIF_RESTORE_SIGMASK); | 250 | |
251 | set_restore_sigmask(); | ||
252 | |||
251 | return -ERESTARTNOHAND; | 253 | return -ERESTARTNOHAND; |
252 | } | 254 | } |
253 | 255 | ||
@@ -332,6 +334,9 @@ void do_rt_sigreturn(struct pt_regs *regs) | |||
332 | regs->tpc = tpc; | 334 | regs->tpc = tpc; |
333 | regs->tnpc = tnpc; | 335 | regs->tnpc = tnpc; |
334 | 336 | ||
337 | /* Prevent syscall restart. */ | ||
338 | pt_regs_clear_syscall(regs); | ||
339 | |||
335 | sigdelsetmask(&set, ~_BLOCKABLE); | 340 | sigdelsetmask(&set, ~_BLOCKABLE); |
336 | spin_lock_irq(¤t->sighand->siglock); | 341 | spin_lock_irq(¤t->sighand->siglock); |
337 | current->blocked = set; | 342 | current->blocked = set; |
@@ -373,16 +378,29 @@ save_fpu_state(struct pt_regs *regs, __siginfo_fpu_t __user *fpu) | |||
373 | 378 | ||
374 | static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, unsigned long framesize) | 379 | static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, unsigned long framesize) |
375 | { | 380 | { |
376 | unsigned long sp; | 381 | unsigned long sp = regs->u_regs[UREG_FP] + STACK_BIAS; |
377 | 382 | ||
378 | sp = regs->u_regs[UREG_FP] + STACK_BIAS; | 383 | /* |
384 | * If we are on the alternate signal stack and would overflow it, don't. | ||
385 | * Return an always-bogus address instead so we will die with SIGSEGV. | ||
386 | */ | ||
387 | if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize))) | ||
388 | return (void __user *) -1L; | ||
379 | 389 | ||
380 | /* This is the X/Open sanctioned signal stack switching. */ | 390 | /* This is the X/Open sanctioned signal stack switching. */ |
381 | if (ka->sa.sa_flags & SA_ONSTACK) { | 391 | if (ka->sa.sa_flags & SA_ONSTACK) { |
382 | if (!on_sig_stack(sp) && | 392 | if (sas_ss_flags(sp) == 0) |
383 | !((current->sas_ss_sp + current->sas_ss_size) & 7)) | ||
384 | sp = current->sas_ss_sp + current->sas_ss_size; | 393 | sp = current->sas_ss_sp + current->sas_ss_size; |
385 | } | 394 | } |
395 | |||
396 | /* Always align the stack frame. This handles two cases. First, | ||
397 | * sigaltstack need not be mindful of platform specific stack | ||
398 | * alignment. Second, if we took this signal because the stack | ||
399 | * is not aligned properly, we'd like to take the signal cleanly | ||
400 | * and report that. | ||
401 | */ | ||
402 | sp &= ~7UL; | ||
403 | |||
386 | return (void __user *)(sp - framesize); | 404 | return (void __user *)(sp - framesize); |
387 | } | 405 | } |
388 | 406 | ||
@@ -483,7 +501,7 @@ static inline void handle_signal(unsigned long signr, struct k_sigaction *ka, | |||
483 | } | 501 | } |
484 | 502 | ||
485 | static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, | 503 | static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, |
486 | struct sigaction *sa) | 504 | struct sigaction *sa) |
487 | { | 505 | { |
488 | switch (regs->u_regs[UREG_I0]) { | 506 | switch (regs->u_regs[UREG_I0]) { |
489 | case ERESTART_RESTARTBLOCK: | 507 | case ERESTART_RESTARTBLOCK: |
@@ -509,20 +527,19 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, | |||
509 | */ | 527 | */ |
510 | static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | 528 | static void do_signal(struct pt_regs *regs, unsigned long orig_i0) |
511 | { | 529 | { |
512 | struct signal_deliver_cookie cookie; | ||
513 | struct k_sigaction ka; | 530 | struct k_sigaction ka; |
531 | int restart_syscall; | ||
514 | sigset_t *oldset; | 532 | sigset_t *oldset; |
515 | siginfo_t info; | 533 | siginfo_t info; |
516 | int signr; | 534 | int signr; |
517 | 535 | ||
518 | if (pt_regs_is_syscall(regs)) { | 536 | if (pt_regs_is_syscall(regs) && |
519 | pt_regs_clear_trap_type(regs); | 537 | (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) { |
520 | cookie.restart_syscall = 1; | 538 | restart_syscall = 1; |
521 | } else | 539 | } else |
522 | cookie.restart_syscall = 0; | 540 | restart_syscall = 0; |
523 | cookie.orig_i0 = orig_i0; | ||
524 | 541 | ||
525 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 542 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) |
526 | oldset = ¤t->saved_sigmask; | 543 | oldset = ¤t->saved_sigmask; |
527 | else | 544 | else |
528 | oldset = ¤t->blocked; | 545 | oldset = ¤t->blocked; |
@@ -530,77 +547,62 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
530 | #ifdef CONFIG_COMPAT | 547 | #ifdef CONFIG_COMPAT |
531 | if (test_thread_flag(TIF_32BIT)) { | 548 | if (test_thread_flag(TIF_32BIT)) { |
532 | extern void do_signal32(sigset_t *, struct pt_regs *, | 549 | extern void do_signal32(sigset_t *, struct pt_regs *, |
533 | struct signal_deliver_cookie *); | 550 | int restart_syscall, |
534 | do_signal32(oldset, regs, &cookie); | 551 | unsigned long orig_i0); |
552 | do_signal32(oldset, regs, restart_syscall, orig_i0); | ||
535 | return; | 553 | return; |
536 | } | 554 | } |
537 | #endif | 555 | #endif |
538 | 556 | ||
539 | signr = get_signal_to_deliver(&info, &ka, regs, &cookie); | 557 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
558 | |||
559 | /* If the debugger messes with the program counter, it clears | ||
560 | * the software "in syscall" bit, directing us to not perform | ||
561 | * a syscall restart. | ||
562 | */ | ||
563 | if (restart_syscall && !pt_regs_is_syscall(regs)) | ||
564 | restart_syscall = 0; | ||
565 | |||
540 | if (signr > 0) { | 566 | if (signr > 0) { |
541 | if (cookie.restart_syscall) | 567 | if (restart_syscall) |
542 | syscall_restart(cookie.orig_i0, regs, &ka.sa); | 568 | syscall_restart(orig_i0, regs, &ka.sa); |
543 | handle_signal(signr, &ka, &info, oldset, regs); | 569 | handle_signal(signr, &ka, &info, oldset, regs); |
544 | 570 | ||
545 | /* a signal was successfully delivered; the saved | 571 | /* A signal was successfully delivered; the saved |
546 | * sigmask will have been stored in the signal frame, | 572 | * sigmask will have been stored in the signal frame, |
547 | * and will be restored by sigreturn, so we can simply | 573 | * and will be restored by sigreturn, so we can simply |
548 | * clear the TIF_RESTORE_SIGMASK flag. | 574 | * clear the TS_RESTORE_SIGMASK flag. |
549 | */ | 575 | */ |
550 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 576 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
551 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
552 | return; | 577 | return; |
553 | } | 578 | } |
554 | if (cookie.restart_syscall && | 579 | if (restart_syscall && |
555 | (regs->u_regs[UREG_I0] == ERESTARTNOHAND || | 580 | (regs->u_regs[UREG_I0] == ERESTARTNOHAND || |
556 | regs->u_regs[UREG_I0] == ERESTARTSYS || | 581 | regs->u_regs[UREG_I0] == ERESTARTSYS || |
557 | regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { | 582 | regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { |
558 | /* replay the system call when we are done */ | 583 | /* replay the system call when we are done */ |
559 | regs->u_regs[UREG_I0] = cookie.orig_i0; | 584 | regs->u_regs[UREG_I0] = orig_i0; |
560 | regs->tpc -= 4; | 585 | regs->tpc -= 4; |
561 | regs->tnpc -= 4; | 586 | regs->tnpc -= 4; |
562 | } | 587 | } |
563 | if (cookie.restart_syscall && | 588 | if (restart_syscall && |
564 | regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { | 589 | regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { |
565 | regs->u_regs[UREG_G1] = __NR_restart_syscall; | 590 | regs->u_regs[UREG_G1] = __NR_restart_syscall; |
566 | regs->tpc -= 4; | 591 | regs->tpc -= 4; |
567 | regs->tnpc -= 4; | 592 | regs->tnpc -= 4; |
568 | } | 593 | } |
569 | 594 | ||
570 | /* if there's no signal to deliver, we just put the saved sigmask | 595 | /* If there's no signal to deliver, we just put the saved sigmask |
571 | * back | 596 | * back |
572 | */ | 597 | */ |
573 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { | 598 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) { |
574 | clear_thread_flag(TIF_RESTORE_SIGMASK); | 599 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
575 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | 600 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); |
576 | } | 601 | } |
577 | } | 602 | } |
578 | 603 | ||
579 | void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long thread_info_flags) | 604 | void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long thread_info_flags) |
580 | { | 605 | { |
581 | if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) | 606 | if (thread_info_flags & _TIF_SIGPENDING) |
582 | do_signal(regs, orig_i0); | 607 | do_signal(regs, orig_i0); |
583 | } | 608 | } |
584 | |||
585 | void ptrace_signal_deliver(struct pt_regs *regs, void *cookie) | ||
586 | { | ||
587 | struct signal_deliver_cookie *cp = cookie; | ||
588 | |||
589 | if (cp->restart_syscall && | ||
590 | (regs->u_regs[UREG_I0] == ERESTARTNOHAND || | ||
591 | regs->u_regs[UREG_I0] == ERESTARTSYS || | ||
592 | regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { | ||
593 | /* replay the system call when we are done */ | ||
594 | regs->u_regs[UREG_I0] = cp->orig_i0; | ||
595 | regs->tpc -= 4; | ||
596 | regs->tnpc -= 4; | ||
597 | cp->restart_syscall = 0; | ||
598 | } | ||
599 | if (cp->restart_syscall && | ||
600 | regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { | ||
601 | regs->u_regs[UREG_G1] = __NR_restart_syscall; | ||
602 | regs->tpc -= 4; | ||
603 | regs->tnpc -= 4; | ||
604 | cp->restart_syscall = 0; | ||
605 | } | ||
606 | } | ||
diff --git a/arch/sparc64/kernel/signal32.c b/arch/sparc64/kernel/signal32.c index 91f8d0826db1..97cdd1bf4a10 100644 --- a/arch/sparc64/kernel/signal32.c +++ b/arch/sparc64/kernel/signal32.c | |||
@@ -268,6 +268,9 @@ void do_sigreturn32(struct pt_regs *regs) | |||
268 | regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC); | 268 | regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC); |
269 | regs->tstate |= psr_to_tstate_icc(psr); | 269 | regs->tstate |= psr_to_tstate_icc(psr); |
270 | 270 | ||
271 | /* Prevent syscall restart. */ | ||
272 | pt_regs_clear_syscall(regs); | ||
273 | |||
271 | err |= __get_user(fpu_save, &sf->fpu_save); | 274 | err |= __get_user(fpu_save, &sf->fpu_save); |
272 | if (fpu_save) | 275 | if (fpu_save) |
273 | err |= restore_fpu_state32(regs, &sf->fpu_state); | 276 | err |= restore_fpu_state32(regs, &sf->fpu_state); |
@@ -351,6 +354,9 @@ asmlinkage void do_rt_sigreturn32(struct pt_regs *regs) | |||
351 | regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC); | 354 | regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC); |
352 | regs->tstate |= psr_to_tstate_icc(psr); | 355 | regs->tstate |= psr_to_tstate_icc(psr); |
353 | 356 | ||
357 | /* Prevent syscall restart. */ | ||
358 | pt_regs_clear_syscall(regs); | ||
359 | |||
354 | err |= __get_user(fpu_save, &sf->fpu_save); | 360 | err |= __get_user(fpu_save, &sf->fpu_save); |
355 | if (fpu_save) | 361 | if (fpu_save) |
356 | err |= restore_fpu_state32(regs, &sf->fpu_state); | 362 | err |= restore_fpu_state32(regs, &sf->fpu_state); |
@@ -400,11 +406,27 @@ static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, uns | |||
400 | regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL; | 406 | regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL; |
401 | sp = regs->u_regs[UREG_FP]; | 407 | sp = regs->u_regs[UREG_FP]; |
402 | 408 | ||
409 | /* | ||
410 | * If we are on the alternate signal stack and would overflow it, don't. | ||
411 | * Return an always-bogus address instead so we will die with SIGSEGV. | ||
412 | */ | ||
413 | if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize))) | ||
414 | return (void __user *) -1L; | ||
415 | |||
403 | /* This is the X/Open sanctioned signal stack switching. */ | 416 | /* This is the X/Open sanctioned signal stack switching. */ |
404 | if (sa->sa_flags & SA_ONSTACK) { | 417 | if (sa->sa_flags & SA_ONSTACK) { |
405 | if (!on_sig_stack(sp) && !((current->sas_ss_sp + current->sas_ss_size) & 7)) | 418 | if (sas_ss_flags(sp) == 0) |
406 | sp = current->sas_ss_sp + current->sas_ss_size; | 419 | sp = current->sas_ss_sp + current->sas_ss_size; |
407 | } | 420 | } |
421 | |||
422 | /* Always align the stack frame. This handles two cases. First, | ||
423 | * sigaltstack need not be mindful of platform specific stack | ||
424 | * alignment. Second, if we took this signal because the stack | ||
425 | * is not aligned properly, we'd like to take the signal cleanly | ||
426 | * and report that. | ||
427 | */ | ||
428 | sp &= ~7UL; | ||
429 | |||
408 | return (void __user *)(sp - framesize); | 430 | return (void __user *)(sp - framesize); |
409 | } | 431 | } |
410 | 432 | ||
@@ -746,48 +768,55 @@ static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs | |||
746 | * mistake. | 768 | * mistake. |
747 | */ | 769 | */ |
748 | void do_signal32(sigset_t *oldset, struct pt_regs * regs, | 770 | void do_signal32(sigset_t *oldset, struct pt_regs * regs, |
749 | struct signal_deliver_cookie *cookie) | 771 | int restart_syscall, unsigned long orig_i0) |
750 | { | 772 | { |
751 | struct k_sigaction ka; | 773 | struct k_sigaction ka; |
752 | siginfo_t info; | 774 | siginfo_t info; |
753 | int signr; | 775 | int signr; |
754 | 776 | ||
755 | signr = get_signal_to_deliver(&info, &ka, regs, cookie); | 777 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
778 | |||
779 | /* If the debugger messes with the program counter, it clears | ||
780 | * the "in syscall" bit, directing us to not perform a syscall | ||
781 | * restart. | ||
782 | */ | ||
783 | if (restart_syscall && !pt_regs_is_syscall(regs)) | ||
784 | restart_syscall = 0; | ||
785 | |||
756 | if (signr > 0) { | 786 | if (signr > 0) { |
757 | if (cookie->restart_syscall) | 787 | if (restart_syscall) |
758 | syscall_restart32(cookie->orig_i0, regs, &ka.sa); | 788 | syscall_restart32(orig_i0, regs, &ka.sa); |
759 | handle_signal32(signr, &ka, &info, oldset, regs); | 789 | handle_signal32(signr, &ka, &info, oldset, regs); |
760 | 790 | ||
761 | /* a signal was successfully delivered; the saved | 791 | /* A signal was successfully delivered; the saved |
762 | * sigmask will have been stored in the signal frame, | 792 | * sigmask will have been stored in the signal frame, |
763 | * and will be restored by sigreturn, so we can simply | 793 | * and will be restored by sigreturn, so we can simply |
764 | * clear the TIF_RESTORE_SIGMASK flag. | 794 | * clear the TS_RESTORE_SIGMASK flag. |
765 | */ | 795 | */ |
766 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 796 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
767 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
768 | return; | 797 | return; |
769 | } | 798 | } |
770 | if (cookie->restart_syscall && | 799 | if (restart_syscall && |
771 | (regs->u_regs[UREG_I0] == ERESTARTNOHAND || | 800 | (regs->u_regs[UREG_I0] == ERESTARTNOHAND || |
772 | regs->u_regs[UREG_I0] == ERESTARTSYS || | 801 | regs->u_regs[UREG_I0] == ERESTARTSYS || |
773 | regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { | 802 | regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { |
774 | /* replay the system call when we are done */ | 803 | /* replay the system call when we are done */ |
775 | regs->u_regs[UREG_I0] = cookie->orig_i0; | 804 | regs->u_regs[UREG_I0] = orig_i0; |
776 | regs->tpc -= 4; | 805 | regs->tpc -= 4; |
777 | regs->tnpc -= 4; | 806 | regs->tnpc -= 4; |
778 | } | 807 | } |
779 | if (cookie->restart_syscall && | 808 | if (restart_syscall && |
780 | regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { | 809 | regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { |
781 | regs->u_regs[UREG_G1] = __NR_restart_syscall; | 810 | regs->u_regs[UREG_G1] = __NR_restart_syscall; |
782 | regs->tpc -= 4; | 811 | regs->tpc -= 4; |
783 | regs->tnpc -= 4; | 812 | regs->tnpc -= 4; |
784 | } | 813 | } |
785 | 814 | ||
786 | /* if there's no signal to deliver, we just put the saved sigmask | 815 | /* If there's no signal to deliver, we just put the saved sigmask |
787 | * back | 816 | * back |
788 | */ | 817 | */ |
789 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { | 818 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) { |
790 | clear_thread_flag(TIF_RESTORE_SIGMASK); | 819 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
791 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | 820 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); |
792 | } | 821 | } |
793 | } | 822 | } |
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index 3aba47624df4..fa63c68a1819 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c | |||
@@ -865,21 +865,14 @@ void smp_call_function_client(int irq, struct pt_regs *regs) | |||
865 | void *info = call_data->info; | 865 | void *info = call_data->info; |
866 | 866 | ||
867 | clear_softint(1 << irq); | 867 | clear_softint(1 << irq); |
868 | |||
869 | irq_enter(); | ||
870 | |||
871 | if (!call_data->wait) { | ||
872 | /* let initiator proceed after getting data */ | ||
873 | atomic_inc(&call_data->finished); | ||
874 | } | ||
875 | |||
876 | func(info); | ||
877 | |||
878 | irq_exit(); | ||
879 | |||
880 | if (call_data->wait) { | 868 | if (call_data->wait) { |
881 | /* let initiator proceed only after completion */ | 869 | /* let initiator proceed only after completion */ |
870 | func(info); | ||
871 | atomic_inc(&call_data->finished); | ||
872 | } else { | ||
873 | /* let initiator proceed after getting data */ | ||
882 | atomic_inc(&call_data->finished); | 874 | atomic_inc(&call_data->finished); |
875 | func(info); | ||
883 | } | 876 | } |
884 | } | 877 | } |
885 | 878 | ||
@@ -907,6 +900,9 @@ extern unsigned long xcall_flush_tlb_mm; | |||
907 | extern unsigned long xcall_flush_tlb_pending; | 900 | extern unsigned long xcall_flush_tlb_pending; |
908 | extern unsigned long xcall_flush_tlb_kernel_range; | 901 | extern unsigned long xcall_flush_tlb_kernel_range; |
909 | extern unsigned long xcall_report_regs; | 902 | extern unsigned long xcall_report_regs; |
903 | #ifdef CONFIG_MAGIC_SYSRQ | ||
904 | extern unsigned long xcall_fetch_glob_regs; | ||
905 | #endif | ||
910 | extern unsigned long xcall_receive_signal; | 906 | extern unsigned long xcall_receive_signal; |
911 | extern unsigned long xcall_new_mmu_context_version; | 907 | extern unsigned long xcall_new_mmu_context_version; |
912 | #ifdef CONFIG_KGDB | 908 | #ifdef CONFIG_KGDB |
@@ -1041,9 +1037,7 @@ void smp_receive_signal(int cpu) | |||
1041 | 1037 | ||
1042 | void smp_receive_signal_client(int irq, struct pt_regs *regs) | 1038 | void smp_receive_signal_client(int irq, struct pt_regs *regs) |
1043 | { | 1039 | { |
1044 | irq_enter(); | ||
1045 | clear_softint(1 << irq); | 1040 | clear_softint(1 << irq); |
1046 | irq_exit(); | ||
1047 | } | 1041 | } |
1048 | 1042 | ||
1049 | void smp_new_mmu_context_version_client(int irq, struct pt_regs *regs) | 1043 | void smp_new_mmu_context_version_client(int irq, struct pt_regs *regs) |
@@ -1051,8 +1045,6 @@ void smp_new_mmu_context_version_client(int irq, struct pt_regs *regs) | |||
1051 | struct mm_struct *mm; | 1045 | struct mm_struct *mm; |
1052 | unsigned long flags; | 1046 | unsigned long flags; |
1053 | 1047 | ||
1054 | irq_enter(); | ||
1055 | |||
1056 | clear_softint(1 << irq); | 1048 | clear_softint(1 << irq); |
1057 | 1049 | ||
1058 | /* See if we need to allocate a new TLB context because | 1050 | /* See if we need to allocate a new TLB context because |
@@ -1072,8 +1064,6 @@ void smp_new_mmu_context_version_client(int irq, struct pt_regs *regs) | |||
1072 | load_secondary_context(mm); | 1064 | load_secondary_context(mm); |
1073 | __flush_tlb_mm(CTX_HWBITS(mm->context), | 1065 | __flush_tlb_mm(CTX_HWBITS(mm->context), |
1074 | SECONDARY_CONTEXT); | 1066 | SECONDARY_CONTEXT); |
1075 | |||
1076 | irq_exit(); | ||
1077 | } | 1067 | } |
1078 | 1068 | ||
1079 | void smp_new_mmu_context_version(void) | 1069 | void smp_new_mmu_context_version(void) |
@@ -1093,6 +1083,13 @@ void smp_report_regs(void) | |||
1093 | smp_cross_call(&xcall_report_regs, 0, 0, 0); | 1083 | smp_cross_call(&xcall_report_regs, 0, 0, 0); |
1094 | } | 1084 | } |
1095 | 1085 | ||
1086 | #ifdef CONFIG_MAGIC_SYSRQ | ||
1087 | void smp_fetch_global_regs(void) | ||
1088 | { | ||
1089 | smp_cross_call(&xcall_fetch_glob_regs, 0, 0, 0); | ||
1090 | } | ||
1091 | #endif | ||
1092 | |||
1096 | /* We know that the window frames of the user have been flushed | 1093 | /* We know that the window frames of the user have been flushed |
1097 | * to the stack before we get here because all callers of us | 1094 | * to the stack before we get here because all callers of us |
1098 | * are flush_tlb_*() routines, and these run after flush_cache_*() | 1095 | * are flush_tlb_*() routines, and these run after flush_cache_*() |
@@ -1239,8 +1236,6 @@ void smp_penguin_jailcell(int irq, struct pt_regs *regs) | |||
1239 | { | 1236 | { |
1240 | clear_softint(1 << irq); | 1237 | clear_softint(1 << irq); |
1241 | 1238 | ||
1242 | irq_enter(); | ||
1243 | |||
1244 | preempt_disable(); | 1239 | preempt_disable(); |
1245 | 1240 | ||
1246 | __asm__ __volatile__("flushw"); | 1241 | __asm__ __volatile__("flushw"); |
@@ -1253,8 +1248,6 @@ void smp_penguin_jailcell(int irq, struct pt_regs *regs) | |||
1253 | prom_world(0); | 1248 | prom_world(0); |
1254 | 1249 | ||
1255 | preempt_enable(); | 1250 | preempt_enable(); |
1256 | |||
1257 | irq_exit(); | ||
1258 | } | 1251 | } |
1259 | 1252 | ||
1260 | /* /proc/profile writes can call this, don't __init it please. */ | 1253 | /* /proc/profile writes can call this, don't __init it please. */ |
diff --git a/arch/sparc64/kernel/stacktrace.c b/arch/sparc64/kernel/stacktrace.c index 01b52f561af4..c73ce3f4197e 100644 --- a/arch/sparc64/kernel/stacktrace.c +++ b/arch/sparc64/kernel/stacktrace.c | |||
@@ -19,7 +19,7 @@ void save_stack_trace(struct stack_trace *trace) | |||
19 | fp = ksp + STACK_BIAS; | 19 | fp = ksp + STACK_BIAS; |
20 | thread_base = (unsigned long) tp; | 20 | thread_base = (unsigned long) tp; |
21 | do { | 21 | do { |
22 | struct reg_window *rw; | 22 | struct sparc_stackf *sf; |
23 | struct pt_regs *regs; | 23 | struct pt_regs *regs; |
24 | unsigned long pc; | 24 | unsigned long pc; |
25 | 25 | ||
@@ -28,15 +28,17 @@ void save_stack_trace(struct stack_trace *trace) | |||
28 | fp >= (thread_base + THREAD_SIZE)) | 28 | fp >= (thread_base + THREAD_SIZE)) |
29 | break; | 29 | break; |
30 | 30 | ||
31 | rw = (struct reg_window *) fp; | 31 | sf = (struct sparc_stackf *) fp; |
32 | regs = (struct pt_regs *) (rw + 1); | 32 | regs = (struct pt_regs *) (sf + 1); |
33 | 33 | ||
34 | if ((regs->magic & ~0x1ff) == PT_REGS_MAGIC) { | 34 | if ((regs->magic & ~0x1ff) == PT_REGS_MAGIC) { |
35 | if (!(regs->tstate & TSTATE_PRIV)) | ||
36 | break; | ||
35 | pc = regs->tpc; | 37 | pc = regs->tpc; |
36 | fp = regs->u_regs[UREG_I6] + STACK_BIAS; | 38 | fp = regs->u_regs[UREG_I6] + STACK_BIAS; |
37 | } else { | 39 | } else { |
38 | pc = rw->ins[7]; | 40 | pc = sf->callers_pc; |
39 | fp = rw->ins[6] + STACK_BIAS; | 41 | fp = (unsigned long)sf->fp + STACK_BIAS; |
40 | } | 42 | } |
41 | 43 | ||
42 | if (trace->skip > 0) | 44 | if (trace->skip > 0) |
diff --git a/arch/sparc64/kernel/starfire.c b/arch/sparc64/kernel/starfire.c index b930fee7708a..7461581b3bb9 100644 --- a/arch/sparc64/kernel/starfire.c +++ b/arch/sparc64/kernel/starfire.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: starfire.c,v 1.10 2001/04/14 21:13:45 davem Exp $ | 1 | /* |
2 | * starfire.c: Starfire/E10000 support. | 2 | * starfire.c: Starfire/E10000 support. |
3 | * | 3 | * |
4 | * Copyright (C) 1998 David S. Miller (davem@redhat.com) | 4 | * Copyright (C) 1998 David S. Miller (davem@redhat.com) |
diff --git a/arch/sparc64/kernel/sys32.S b/arch/sparc64/kernel/sys32.S index 010a737908ee..ade18ba0c686 100644 --- a/arch/sparc64/kernel/sys32.S +++ b/arch/sparc64/kernel/sys32.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: sys32.S,v 1.12 2000/03/24 04:17:37 davem Exp $ | 1 | /* |
2 | * sys32.S: I-cache tricks for 32-bit compatibility layer simple | 2 | * sys32.S: I-cache tricks for 32-bit compatibility layer simple |
3 | * conversions. | 3 | * conversions. |
4 | * | 4 | * |
diff --git a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c index 8d4761f15fa9..ac1bff58c1ac 100644 --- a/arch/sparc64/kernel/sys_sparc.c +++ b/arch/sparc64/kernel/sys_sparc.c | |||
@@ -542,20 +542,19 @@ asmlinkage long sparc64_personality(unsigned long personality) | |||
542 | return ret; | 542 | return ret; |
543 | } | 543 | } |
544 | 544 | ||
545 | int sparc64_mmap_check(unsigned long addr, unsigned long len, | 545 | int sparc64_mmap_check(unsigned long addr, unsigned long len) |
546 | unsigned long flags) | ||
547 | { | 546 | { |
548 | if (test_thread_flag(TIF_32BIT)) { | 547 | if (test_thread_flag(TIF_32BIT)) { |
549 | if (len >= STACK_TOP32) | 548 | if (len >= STACK_TOP32) |
550 | return -EINVAL; | 549 | return -EINVAL; |
551 | 550 | ||
552 | if ((flags & MAP_FIXED) && addr > STACK_TOP32 - len) | 551 | if (addr > STACK_TOP32 - len) |
553 | return -EINVAL; | 552 | return -EINVAL; |
554 | } else { | 553 | } else { |
555 | if (len >= VA_EXCLUDE_START) | 554 | if (len >= VA_EXCLUDE_START) |
556 | return -EINVAL; | 555 | return -EINVAL; |
557 | 556 | ||
558 | if ((flags & MAP_FIXED) && invalid_64bit_range(addr, len)) | 557 | if (invalid_64bit_range(addr, len)) |
559 | return -EINVAL; | 558 | return -EINVAL; |
560 | } | 559 | } |
561 | 560 | ||
@@ -609,46 +608,19 @@ asmlinkage unsigned long sys64_mremap(unsigned long addr, | |||
609 | unsigned long old_len, unsigned long new_len, | 608 | unsigned long old_len, unsigned long new_len, |
610 | unsigned long flags, unsigned long new_addr) | 609 | unsigned long flags, unsigned long new_addr) |
611 | { | 610 | { |
612 | struct vm_area_struct *vma; | ||
613 | unsigned long ret = -EINVAL; | 611 | unsigned long ret = -EINVAL; |
614 | 612 | ||
615 | if (test_thread_flag(TIF_32BIT)) | 613 | if (test_thread_flag(TIF_32BIT)) |
616 | goto out; | 614 | goto out; |
617 | if (unlikely(new_len >= VA_EXCLUDE_START)) | 615 | if (unlikely(new_len >= VA_EXCLUDE_START)) |
618 | goto out; | 616 | goto out; |
619 | if (unlikely(invalid_64bit_range(addr, old_len))) | 617 | if (unlikely(sparc64_mmap_check(addr, old_len))) |
618 | goto out; | ||
619 | if (unlikely(sparc64_mmap_check(new_addr, new_len))) | ||
620 | goto out; | 620 | goto out; |
621 | 621 | ||
622 | down_write(¤t->mm->mmap_sem); | 622 | down_write(¤t->mm->mmap_sem); |
623 | if (flags & MREMAP_FIXED) { | ||
624 | if (invalid_64bit_range(new_addr, new_len)) | ||
625 | goto out_sem; | ||
626 | } else if (invalid_64bit_range(addr, new_len)) { | ||
627 | unsigned long map_flags = 0; | ||
628 | struct file *file = NULL; | ||
629 | |||
630 | ret = -ENOMEM; | ||
631 | if (!(flags & MREMAP_MAYMOVE)) | ||
632 | goto out_sem; | ||
633 | |||
634 | vma = find_vma(current->mm, addr); | ||
635 | if (vma) { | ||
636 | if (vma->vm_flags & VM_SHARED) | ||
637 | map_flags |= MAP_SHARED; | ||
638 | file = vma->vm_file; | ||
639 | } | ||
640 | |||
641 | /* MREMAP_FIXED checked above. */ | ||
642 | new_addr = get_unmapped_area(file, addr, new_len, | ||
643 | vma ? vma->vm_pgoff : 0, | ||
644 | map_flags); | ||
645 | ret = new_addr; | ||
646 | if (new_addr & ~PAGE_MASK) | ||
647 | goto out_sem; | ||
648 | flags |= MREMAP_FIXED; | ||
649 | } | ||
650 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); | 623 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); |
651 | out_sem: | ||
652 | up_write(¤t->mm->mmap_sem); | 624 | up_write(¤t->mm->mmap_sem); |
653 | out: | 625 | out: |
654 | return ret; | 626 | return ret; |
diff --git a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c index 161ce4710fe7..ba5bd626b39e 100644 --- a/arch/sparc64/kernel/sys_sparc32.c +++ b/arch/sparc64/kernel/sys_sparc32.c | |||
@@ -236,13 +236,6 @@ asmlinkage long sys32_getegid16(void) | |||
236 | 236 | ||
237 | /* 32-bit timeval and related flotsam. */ | 237 | /* 32-bit timeval and related flotsam. */ |
238 | 238 | ||
239 | static long get_tv32(struct timeval *o, struct compat_timeval __user *i) | ||
240 | { | ||
241 | return (!access_ok(VERIFY_READ, i, sizeof(*i)) || | ||
242 | (__get_user(o->tv_sec, &i->tv_sec) | | ||
243 | __get_user(o->tv_usec, &i->tv_usec))); | ||
244 | } | ||
245 | |||
246 | static inline long put_tv32(struct compat_timeval __user *o, struct timeval *i) | 239 | static inline long put_tv32(struct compat_timeval __user *o, struct timeval *i) |
247 | { | 240 | { |
248 | return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) || | 241 | return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) || |
@@ -757,30 +750,6 @@ asmlinkage long sys32_settimeofday(struct compat_timeval __user *tv, | |||
757 | return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL); | 750 | return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL); |
758 | } | 751 | } |
759 | 752 | ||
760 | asmlinkage long sys32_utimes(char __user *filename, | ||
761 | struct compat_timeval __user *tvs) | ||
762 | { | ||
763 | struct timespec tv[2]; | ||
764 | |||
765 | if (tvs) { | ||
766 | struct timeval ktvs[2]; | ||
767 | if (get_tv32(&ktvs[0], tvs) || | ||
768 | get_tv32(&ktvs[1], 1+tvs)) | ||
769 | return -EFAULT; | ||
770 | |||
771 | if (ktvs[0].tv_usec < 0 || ktvs[0].tv_usec >= 1000000 || | ||
772 | ktvs[1].tv_usec < 0 || ktvs[1].tv_usec >= 1000000) | ||
773 | return -EINVAL; | ||
774 | |||
775 | tv[0].tv_sec = ktvs[0].tv_sec; | ||
776 | tv[0].tv_nsec = 1000 * ktvs[0].tv_usec; | ||
777 | tv[1].tv_sec = ktvs[1].tv_sec; | ||
778 | tv[1].tv_nsec = 1000 * ktvs[1].tv_usec; | ||
779 | } | ||
780 | |||
781 | return do_utimes(AT_FDCWD, filename, tvs ? tv : NULL, 0); | ||
782 | } | ||
783 | |||
784 | /* These are here just in case some old sparc32 binary calls it. */ | 753 | /* These are here just in case some old sparc32 binary calls it. */ |
785 | asmlinkage long sys32_pause(void) | 754 | asmlinkage long sys32_pause(void) |
786 | { | 755 | { |
@@ -898,44 +867,15 @@ asmlinkage unsigned long sys32_mremap(unsigned long addr, | |||
898 | unsigned long old_len, unsigned long new_len, | 867 | unsigned long old_len, unsigned long new_len, |
899 | unsigned long flags, u32 __new_addr) | 868 | unsigned long flags, u32 __new_addr) |
900 | { | 869 | { |
901 | struct vm_area_struct *vma; | ||
902 | unsigned long ret = -EINVAL; | 870 | unsigned long ret = -EINVAL; |
903 | unsigned long new_addr = __new_addr; | 871 | unsigned long new_addr = __new_addr; |
904 | 872 | ||
905 | if (old_len > STACK_TOP32 || new_len > STACK_TOP32) | 873 | if (unlikely(sparc64_mmap_check(addr, old_len))) |
906 | goto out; | 874 | goto out; |
907 | if (addr > STACK_TOP32 - old_len) | 875 | if (unlikely(sparc64_mmap_check(new_addr, new_len))) |
908 | goto out; | 876 | goto out; |
909 | down_write(¤t->mm->mmap_sem); | 877 | down_write(¤t->mm->mmap_sem); |
910 | if (flags & MREMAP_FIXED) { | ||
911 | if (new_addr > STACK_TOP32 - new_len) | ||
912 | goto out_sem; | ||
913 | } else if (addr > STACK_TOP32 - new_len) { | ||
914 | unsigned long map_flags = 0; | ||
915 | struct file *file = NULL; | ||
916 | |||
917 | ret = -ENOMEM; | ||
918 | if (!(flags & MREMAP_MAYMOVE)) | ||
919 | goto out_sem; | ||
920 | |||
921 | vma = find_vma(current->mm, addr); | ||
922 | if (vma) { | ||
923 | if (vma->vm_flags & VM_SHARED) | ||
924 | map_flags |= MAP_SHARED; | ||
925 | file = vma->vm_file; | ||
926 | } | ||
927 | |||
928 | /* MREMAP_FIXED checked above. */ | ||
929 | new_addr = get_unmapped_area(file, addr, new_len, | ||
930 | vma ? vma->vm_pgoff : 0, | ||
931 | map_flags); | ||
932 | ret = new_addr; | ||
933 | if (new_addr & ~PAGE_MASK) | ||
934 | goto out_sem; | ||
935 | flags |= MREMAP_FIXED; | ||
936 | } | ||
937 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); | 878 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); |
938 | out_sem: | ||
939 | up_write(¤t->mm->mmap_sem); | 879 | up_write(¤t->mm->mmap_sem); |
940 | out: | 880 | out: |
941 | return ret; | 881 | return ret; |
diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S index a4fef2ba1ae1..8b5282d433c4 100644 --- a/arch/sparc64/kernel/systbls.S +++ b/arch/sparc64/kernel/systbls.S | |||
@@ -45,7 +45,7 @@ sys_call_table32: | |||
45 | /*120*/ .word compat_sys_readv, compat_sys_writev, sys32_settimeofday, sys32_fchown16, sys_fchmod | 45 | /*120*/ .word compat_sys_readv, compat_sys_writev, sys32_settimeofday, sys32_fchown16, sys_fchmod |
46 | .word sys_nis_syscall, sys32_setreuid16, sys32_setregid16, sys_rename, sys_truncate | 46 | .word sys_nis_syscall, sys32_setreuid16, sys32_setregid16, sys_rename, sys_truncate |
47 | /*130*/ .word sys_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall | 47 | /*130*/ .word sys_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall |
48 | .word sys_nis_syscall, sys32_mkdir, sys_rmdir, sys32_utimes, compat_sys_stat64 | 48 | .word sys_nis_syscall, sys32_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64 |
49 | /*140*/ .word sys32_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit | 49 | /*140*/ .word sys32_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit |
50 | .word compat_sys_setrlimit, sys_pivot_root, sys32_prctl, sys_pciconfig_read, sys_pciconfig_write | 50 | .word compat_sys_setrlimit, sys_pivot_root, sys32_prctl, sys_pciconfig_read, sys_pciconfig_write |
51 | /*150*/ .word sys_nis_syscall, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64 | 51 | /*150*/ .word sys_nis_syscall, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64 |
diff --git a/arch/sparc64/kernel/trampoline.S b/arch/sparc64/kernel/trampoline.S index 56ff55211341..704a3afcfd06 100644 --- a/arch/sparc64/kernel/trampoline.S +++ b/arch/sparc64/kernel/trampoline.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: trampoline.S,v 1.26 2002/02/09 19:49:30 davem Exp $ | 1 | /* |
2 | * trampoline.S: Jump start slave processors on sparc64. | 2 | * trampoline.S: Jump start slave processors on sparc64. |
3 | * | 3 | * |
4 | * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc64/kernel/traps.c b/arch/sparc64/kernel/traps.c index d9b8d46707d1..369749262653 100644 --- a/arch/sparc64/kernel/traps.c +++ b/arch/sparc64/kernel/traps.c | |||
@@ -2116,7 +2116,7 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp) | |||
2116 | printk("\n"); | 2116 | printk("\n"); |
2117 | #endif | 2117 | #endif |
2118 | do { | 2118 | do { |
2119 | struct reg_window *rw; | 2119 | struct sparc_stackf *sf; |
2120 | struct pt_regs *regs; | 2120 | struct pt_regs *regs; |
2121 | unsigned long pc; | 2121 | unsigned long pc; |
2122 | 2122 | ||
@@ -2124,15 +2124,17 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp) | |||
2124 | if (fp < (thread_base + sizeof(struct thread_info)) || | 2124 | if (fp < (thread_base + sizeof(struct thread_info)) || |
2125 | fp >= (thread_base + THREAD_SIZE)) | 2125 | fp >= (thread_base + THREAD_SIZE)) |
2126 | break; | 2126 | break; |
2127 | rw = (struct reg_window *)fp; | 2127 | sf = (struct sparc_stackf *) fp; |
2128 | regs = (struct pt_regs *) (rw + 1); | 2128 | regs = (struct pt_regs *) (sf + 1); |
2129 | 2129 | ||
2130 | if ((regs->magic & ~0x1ff) == PT_REGS_MAGIC) { | 2130 | if ((regs->magic & ~0x1ff) == PT_REGS_MAGIC) { |
2131 | if (!(regs->tstate & TSTATE_PRIV)) | ||
2132 | break; | ||
2131 | pc = regs->tpc; | 2133 | pc = regs->tpc; |
2132 | fp = regs->u_regs[UREG_I6] + STACK_BIAS; | 2134 | fp = regs->u_regs[UREG_I6] + STACK_BIAS; |
2133 | } else { | 2135 | } else { |
2134 | pc = rw->ins[7]; | 2136 | pc = sf->callers_pc; |
2135 | fp = rw->ins[6] + STACK_BIAS; | 2137 | fp = (unsigned long)sf->fp + STACK_BIAS; |
2136 | } | 2138 | } |
2137 | 2139 | ||
2138 | printk(" [%016lx] ", pc); | 2140 | printk(" [%016lx] ", pc); |
diff --git a/arch/sparc64/kernel/unaligned.c b/arch/sparc64/kernel/unaligned.c index 1a511e9f0d3e..afa7fc4f5193 100644 --- a/arch/sparc64/kernel/unaligned.c +++ b/arch/sparc64/kernel/unaligned.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: unaligned.c,v 1.24 2002/02/09 19:49:31 davem Exp $ | 1 | /* |
2 | * unaligned.c: Unaligned load/store trap handling with special | 2 | * unaligned.c: Unaligned load/store trap handling with special |
3 | * cases for the kernel to do them more quickly. | 3 | * cases for the kernel to do them more quickly. |
4 | * | 4 | * |
diff --git a/arch/sparc64/lib/PeeCeeI.c b/arch/sparc64/lib/PeeCeeI.c index 3c6cfbb20360..8b313f11bc8d 100644 --- a/arch/sparc64/lib/PeeCeeI.c +++ b/arch/sparc64/lib/PeeCeeI.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: PeeCeeI.c,v 1.4 1999/09/06 01:17:35 davem Exp $ | 1 | /* |
2 | * PeeCeeI.c: The emerging standard... | 2 | * PeeCeeI.c: The emerging standard... |
3 | * | 3 | * |
4 | * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc64/lib/VISsave.S b/arch/sparc64/lib/VISsave.S index a0ded5c5aa5c..b320ae9e2e2e 100644 --- a/arch/sparc64/lib/VISsave.S +++ b/arch/sparc64/lib/VISsave.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: VISsave.S,v 1.6 2002/02/09 19:49:30 davem Exp $ | 1 | /* |
2 | * VISsave.S: Code for saving FPU register state for | 2 | * VISsave.S: Code for saving FPU register state for |
3 | * VIS routines. One should not call this directly, | 3 | * VIS routines. One should not call this directly, |
4 | * but use macros provided in <asm/visasm.h>. | 4 | * but use macros provided in <asm/visasm.h>. |
diff --git a/arch/sparc64/lib/memcmp.S b/arch/sparc64/lib/memcmp.S index c90ad96c51b9..d3fdaa898566 100644 --- a/arch/sparc64/lib/memcmp.S +++ b/arch/sparc64/lib/memcmp.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: memcmp.S,v 1.3 2000/03/23 07:51:08 davem Exp $ | 1 | /* |
2 | * Sparc64 optimized memcmp code. | 2 | * Sparc64 optimized memcmp code. |
3 | * | 3 | * |
4 | * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) | 4 | * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) |
diff --git a/arch/sparc64/lib/memscan.S b/arch/sparc64/lib/memscan.S index 5e72d4911417..5686dfa5dc15 100644 --- a/arch/sparc64/lib/memscan.S +++ b/arch/sparc64/lib/memscan.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: memscan.S,v 1.3 2000/01/31 04:59:10 davem Exp $ | 1 | /* |
2 | * memscan.S: Optimized memscan for Sparc64. | 2 | * memscan.S: Optimized memscan for Sparc64. |
3 | * | 3 | * |
4 | * Copyright (C) 1997,1998 Jakub Jelinek (jj@ultra.linux.cz) | 4 | * Copyright (C) 1997,1998 Jakub Jelinek (jj@ultra.linux.cz) |
diff --git a/arch/sparc64/lib/strncmp.S b/arch/sparc64/lib/strncmp.S index 6f14f53dbabe..980e83751556 100644 --- a/arch/sparc64/lib/strncmp.S +++ b/arch/sparc64/lib/strncmp.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: strncmp.S,v 1.2 1997/03/11 17:51:44 jj Exp $ | 1 | /* |
2 | * Sparc64 optimized strncmp code. | 2 | * Sparc64 optimized strncmp code. |
3 | * | 3 | * |
4 | * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) | 4 | * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) |
diff --git a/arch/sparc64/lib/strncpy_from_user.S b/arch/sparc64/lib/strncpy_from_user.S index b2f499f79427..511c8f136f95 100644 --- a/arch/sparc64/lib/strncpy_from_user.S +++ b/arch/sparc64/lib/strncpy_from_user.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: strncpy_from_user.S,v 1.6 1999/05/25 16:53:05 jj Exp $ | 1 | /* |
2 | * strncpy_from_user.S: Sparc64 strncpy from userspace. | 2 | * strncpy_from_user.S: Sparc64 strncpy from userspace. |
3 | * | 3 | * |
4 | * Copyright (C) 1997, 1999 Jakub Jelinek (jj@ultra.linux.cz) | 4 | * Copyright (C) 1997, 1999 Jakub Jelinek (jj@ultra.linux.cz) |
diff --git a/arch/sparc64/math-emu/math.c b/arch/sparc64/math-emu/math.c index 6ee496c2864a..add053e0f3b3 100644 --- a/arch/sparc64/math-emu/math.c +++ b/arch/sparc64/math-emu/math.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: math.c,v 1.11 1999/12/20 05:02:25 davem Exp $ | 1 | /* |
2 | * arch/sparc64/math-emu/math.c | 2 | * arch/sparc64/math-emu/math.c |
3 | * | 3 | * |
4 | * Copyright (C) 1997,1999 Jakub Jelinek (jj@ultra.linux.cz) | 4 | * Copyright (C) 1997,1999 Jakub Jelinek (jj@ultra.linux.cz) |
diff --git a/arch/sparc64/math-emu/sfp-util.h b/arch/sparc64/math-emu/sfp-util.h index 31e474738cf6..425d3cf01af4 100644 --- a/arch/sparc64/math-emu/sfp-util.h +++ b/arch/sparc64/math-emu/sfp-util.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: sfp-util.h,v 1.5 2001/06/10 06:48:46 davem Exp $ | 1 | /* |
2 | * arch/sparc64/math-emu/sfp-util.h | 2 | * arch/sparc64/math-emu/sfp-util.h |
3 | * | 3 | * |
4 | * Copyright (C) 1999 Jakub Jelinek (jj@ultra.linux.cz) | 4 | * Copyright (C) 1999 Jakub Jelinek (jj@ultra.linux.cz) |
diff --git a/arch/sparc64/mm/Makefile b/arch/sparc64/mm/Makefile index e415bf942bcd..68d04c0370f4 100644 --- a/arch/sparc64/mm/Makefile +++ b/arch/sparc64/mm/Makefile | |||
@@ -1,4 +1,3 @@ | |||
1 | # $Id: Makefile,v 1.8 2000/12/14 22:57:25 davem Exp $ | ||
2 | # Makefile for the linux Sparc64-specific parts of the memory manager. | 1 | # Makefile for the linux Sparc64-specific parts of the memory manager. |
3 | # | 2 | # |
4 | 3 | ||
diff --git a/arch/sparc64/mm/fault.c b/arch/sparc64/mm/fault.c index 2650d0d33ac2..236f4d228d2b 100644 --- a/arch/sparc64/mm/fault.c +++ b/arch/sparc64/mm/fault.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: fault.c,v 1.59 2002/02/09 19:49:31 davem Exp $ | 1 | /* |
2 | * arch/sparc64/mm/fault.c: Page fault handlers for the 64-bit Sparc. | 2 | * arch/sparc64/mm/fault.c: Page fault handlers for the 64-bit Sparc. |
3 | * | 3 | * |
4 | * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc64/mm/generic.c b/arch/sparc64/mm/generic.c index af9d81db0b38..f362c2037013 100644 --- a/arch/sparc64/mm/generic.c +++ b/arch/sparc64/mm/generic.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: generic.c,v 1.18 2001/12/21 04:56:15 davem Exp $ | 1 | /* |
2 | * generic.c: Generic Sparc mm routines that are not dependent upon | 2 | * generic.c: Generic Sparc mm routines that are not dependent upon |
3 | * MMU type but are Sparc specific. | 3 | * MMU type but are Sparc specific. |
4 | * | 4 | * |
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c index 4cad0b32b0af..84898c44dd4d 100644 --- a/arch/sparc64/mm/init.c +++ b/arch/sparc64/mm/init.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: init.c,v 1.209 2002/02/09 19:49:31 davem Exp $ | 1 | /* |
2 | * arch/sparc64/mm/init.c | 2 | * arch/sparc64/mm/init.c |
3 | * | 3 | * |
4 | * Copyright (C) 1996-1999 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1996-1999 David S. Miller (davem@caip.rutgers.edu) |
@@ -610,8 +610,6 @@ static void __init remap_kernel(void) | |||
610 | 610 | ||
611 | static void __init inherit_prom_mappings(void) | 611 | static void __init inherit_prom_mappings(void) |
612 | { | 612 | { |
613 | read_obp_translations(); | ||
614 | |||
615 | /* Now fixup OBP's idea about where we really are mapped. */ | 613 | /* Now fixup OBP's idea about where we really are mapped. */ |
616 | printk("Remapping the kernel... "); | 614 | printk("Remapping the kernel... "); |
617 | remap_kernel(); | 615 | remap_kernel(); |
@@ -770,7 +768,10 @@ static void __init find_ramdisk(unsigned long phys_base) | |||
770 | initrd_start = ramdisk_image; | 768 | initrd_start = ramdisk_image; |
771 | initrd_end = ramdisk_image + sparc_ramdisk_size; | 769 | initrd_end = ramdisk_image + sparc_ramdisk_size; |
772 | 770 | ||
773 | lmb_reserve(initrd_start, initrd_end); | 771 | lmb_reserve(initrd_start, sparc_ramdisk_size); |
772 | |||
773 | initrd_start += PAGE_OFFSET; | ||
774 | initrd_end += PAGE_OFFSET; | ||
774 | } | 775 | } |
775 | #endif | 776 | #endif |
776 | } | 777 | } |
@@ -1744,7 +1745,17 @@ void __init paging_init(void) | |||
1744 | 1745 | ||
1745 | lmb_init(); | 1746 | lmb_init(); |
1746 | 1747 | ||
1747 | /* Find available physical memory... */ | 1748 | /* Find available physical memory... |
1749 | * | ||
1750 | * Read it twice in order to work around a bug in openfirmware. | ||
1751 | * The call to grab this table itself can cause openfirmware to | ||
1752 | * allocate memory, which in turn can take away some space from | ||
1753 | * the list of available memory. Reading it twice makes sure | ||
1754 | * we really do get the final value. | ||
1755 | */ | ||
1756 | read_obp_translations(); | ||
1757 | read_obp_memory("reg", &pall[0], &pall_ents); | ||
1758 | read_obp_memory("available", &pavail[0], &pavail_ents); | ||
1748 | read_obp_memory("available", &pavail[0], &pavail_ents); | 1759 | read_obp_memory("available", &pavail[0], &pavail_ents); |
1749 | 1760 | ||
1750 | phys_base = 0xffffffffffffffffUL; | 1761 | phys_base = 0xffffffffffffffffUL; |
@@ -1785,8 +1796,6 @@ void __init paging_init(void) | |||
1785 | 1796 | ||
1786 | inherit_prom_mappings(); | 1797 | inherit_prom_mappings(); |
1787 | 1798 | ||
1788 | read_obp_memory("reg", &pall[0], &pall_ents); | ||
1789 | |||
1790 | init_kpte_bitmap(); | 1799 | init_kpte_bitmap(); |
1791 | 1800 | ||
1792 | /* Ok, we can use our TLB miss and window trap handlers safely. */ | 1801 | /* Ok, we can use our TLB miss and window trap handlers safely. */ |
@@ -2362,16 +2371,3 @@ void __flush_tlb_all(void) | |||
2362 | __asm__ __volatile__("wrpr %0, 0, %%pstate" | 2371 | __asm__ __volatile__("wrpr %0, 0, %%pstate" |
2363 | : : "r" (pstate)); | 2372 | : : "r" (pstate)); |
2364 | } | 2373 | } |
2365 | |||
2366 | #ifdef CONFIG_MEMORY_HOTPLUG | ||
2367 | |||
2368 | void online_page(struct page *page) | ||
2369 | { | ||
2370 | ClearPageReserved(page); | ||
2371 | init_page_count(page); | ||
2372 | __free_page(page); | ||
2373 | totalram_pages++; | ||
2374 | num_physpages++; | ||
2375 | } | ||
2376 | |||
2377 | #endif /* CONFIG_MEMORY_HOTPLUG */ | ||
diff --git a/arch/sparc64/mm/ultra.S b/arch/sparc64/mm/ultra.S index 796e005dad8b..9bb2d90a9df6 100644 --- a/arch/sparc64/mm/ultra.S +++ b/arch/sparc64/mm/ultra.S | |||
@@ -1,7 +1,7 @@ | |||
1 | /* $Id: ultra.S,v 1.72 2002/02/09 19:49:31 davem Exp $ | 1 | /* |
2 | * ultra.S: Don't expand these all over the place... | 2 | * ultra.S: Don't expand these all over the place... |
3 | * | 3 | * |
4 | * Copyright (C) 1997, 2000 David S. Miller (davem@redhat.com) | 4 | * Copyright (C) 1997, 2000, 2008 David S. Miller (davem@davemloft.net) |
5 | */ | 5 | */ |
6 | 6 | ||
7 | #include <asm/asi.h> | 7 | #include <asm/asi.h> |
@@ -15,6 +15,7 @@ | |||
15 | #include <asm/thread_info.h> | 15 | #include <asm/thread_info.h> |
16 | #include <asm/cacheflush.h> | 16 | #include <asm/cacheflush.h> |
17 | #include <asm/hypervisor.h> | 17 | #include <asm/hypervisor.h> |
18 | #include <asm/cpudata.h> | ||
18 | 19 | ||
19 | /* Basically, most of the Spitfire vs. Cheetah madness | 20 | /* Basically, most of the Spitfire vs. Cheetah madness |
20 | * has to do with the fact that Cheetah does not support | 21 | * has to do with the fact that Cheetah does not support |
@@ -514,6 +515,32 @@ xcall_report_regs: | |||
514 | b rtrap_xcall | 515 | b rtrap_xcall |
515 | ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1 | 516 | ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1 |
516 | 517 | ||
518 | #ifdef CONFIG_MAGIC_SYSRQ | ||
519 | .globl xcall_fetch_glob_regs | ||
520 | xcall_fetch_glob_regs: | ||
521 | sethi %hi(global_reg_snapshot), %g1 | ||
522 | or %g1, %lo(global_reg_snapshot), %g1 | ||
523 | __GET_CPUID(%g2) | ||
524 | sllx %g2, 6, %g3 | ||
525 | add %g1, %g3, %g1 | ||
526 | rdpr %tstate, %g7 | ||
527 | stx %g7, [%g1 + GR_SNAP_TSTATE] | ||
528 | rdpr %tpc, %g7 | ||
529 | stx %g7, [%g1 + GR_SNAP_TPC] | ||
530 | rdpr %tnpc, %g7 | ||
531 | stx %g7, [%g1 + GR_SNAP_TNPC] | ||
532 | stx %o7, [%g1 + GR_SNAP_O7] | ||
533 | stx %i7, [%g1 + GR_SNAP_I7] | ||
534 | sethi %hi(trap_block), %g7 | ||
535 | or %g7, %lo(trap_block), %g7 | ||
536 | sllx %g2, TRAP_BLOCK_SZ_SHIFT, %g2 | ||
537 | add %g7, %g2, %g7 | ||
538 | ldx [%g7 + TRAP_PER_CPU_THREAD], %g3 | ||
539 | membar #StoreStore | ||
540 | stx %g3, [%g1 + GR_SNAP_THREAD] | ||
541 | retry | ||
542 | #endif /* CONFIG_MAGIC_SYSRQ */ | ||
543 | |||
517 | #ifdef DCACHE_ALIASING_POSSIBLE | 544 | #ifdef DCACHE_ALIASING_POSSIBLE |
518 | .align 32 | 545 | .align 32 |
519 | .globl xcall_flush_dcache_page_cheetah | 546 | .globl xcall_flush_dcache_page_cheetah |
diff --git a/arch/sparc64/prom/Makefile b/arch/sparc64/prom/Makefile index 3d33ed27bc27..8c94483ca54d 100644 --- a/arch/sparc64/prom/Makefile +++ b/arch/sparc64/prom/Makefile | |||
@@ -1,4 +1,3 @@ | |||
1 | # $Id: Makefile,v 1.7 2000/12/14 22:57:25 davem Exp $ | ||
2 | # Makefile for the Sun Boot PROM interface library under | 1 | # Makefile for the Sun Boot PROM interface library under |
3 | # Linux. | 2 | # Linux. |
4 | # | 3 | # |
diff --git a/arch/sparc64/prom/bootstr.c b/arch/sparc64/prom/bootstr.c index a7278614e99d..ab9ccc63b388 100644 --- a/arch/sparc64/prom/bootstr.c +++ b/arch/sparc64/prom/bootstr.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: bootstr.c,v 1.6 1999/08/31 06:55:01 davem Exp $ | 1 | /* |
2 | * bootstr.c: Boot string/argument acquisition from the PROM. | 2 | * bootstr.c: Boot string/argument acquisition from the PROM. |
3 | * | 3 | * |
4 | * Copyright(C) 1995 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright(C) 1995 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc64/prom/devops.c b/arch/sparc64/prom/devops.c index 4641839eb39a..9dbd803e46e1 100644 --- a/arch/sparc64/prom/devops.c +++ b/arch/sparc64/prom/devops.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: devops.c,v 1.3 1997/10/29 07:43:28 ecd Exp $ | 1 | /* |
2 | * devops.c: Device operations using the PROM. | 2 | * devops.c: Device operations using the PROM. |
3 | * | 3 | * |
4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc64/prom/init.c b/arch/sparc64/prom/init.c index 87e7c7ea0ee6..7b00f89490a4 100644 --- a/arch/sparc64/prom/init.c +++ b/arch/sparc64/prom/init.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: init.c,v 1.10 1999/09/21 14:35:59 davem Exp $ | 1 | /* |
2 | * init.c: Initialize internal variables used by the PROM | 2 | * init.c: Initialize internal variables used by the PROM |
3 | * library functions. | 3 | * library functions. |
4 | * | 4 | * |
diff --git a/arch/sparc64/prom/misc.c b/arch/sparc64/prom/misc.c index 47a877a15abd..9b0c0760901e 100644 --- a/arch/sparc64/prom/misc.c +++ b/arch/sparc64/prom/misc.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: misc.c,v 1.20 2001/09/21 03:17:07 kanoj Exp $ | 1 | /* |
2 | * misc.c: Miscellaneous prom functions that don't belong | 2 | * misc.c: Miscellaneous prom functions that don't belong |
3 | * anywhere else. | 3 | * anywhere else. |
4 | * | 4 | * |
diff --git a/arch/sparc64/prom/p1275.c b/arch/sparc64/prom/p1275.c index 7fcccc0e19cf..4b7c937bba61 100644 --- a/arch/sparc64/prom/p1275.c +++ b/arch/sparc64/prom/p1275.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: p1275.c,v 1.22 2001/10/18 09:40:00 davem Exp $ | 1 | /* |
2 | * p1275.c: Sun IEEE 1275 PROM low level interface routines | 2 | * p1275.c: Sun IEEE 1275 PROM low level interface routines |
3 | * | 3 | * |
4 | * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) | 4 | * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) |
diff --git a/arch/sparc64/prom/tree.c b/arch/sparc64/prom/tree.c index a99ccd7fb1b0..281aea44790b 100644 --- a/arch/sparc64/prom/tree.c +++ b/arch/sparc64/prom/tree.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: tree.c,v 1.10 1998/01/10 22:39:00 ecd Exp $ | 1 | /* |
2 | * tree.c: Basic device tree traversal/scanning for the Linux | 2 | * tree.c: Basic device tree traversal/scanning for the Linux |
3 | * prom library. | 3 | * prom library. |
4 | * | 4 | * |