]> git.hungrycats.org Git - linux/commitdiff
[PATCH] x86_64 update
authorAndi Kleen <ak@muc.de>
Thu, 16 Jan 2003 03:36:37 +0000 (19:36 -0800)
committerChristoph Hellwig <hch@sgi.com>
Thu, 16 Jan 2003 03:36:37 +0000 (19:36 -0800)
x86-64 updates for 2.5.58. Changes only x86-64 specific files.

 - Rewrote module allocation. Lots of bugs fixed. Module loading
   should work now again.
 - Kconfig help fixes from Randy Dunlap
 - Makefile cleanups from Pavel Machek and Sam Ravnborg
 - Assembly cleanups from Pavel
 - defconfig update
 - Better strlen_user/strnlen_user
 - Merge with i386: new ptrace commands, 32bit vsyscall signal trampolines
new deactivate_mm, add asm/bug.h
 - Make sure initramfs is freed after booting (thanks to Kai for the hint)
 - User per cpu data for profile counters (Ravikiran Thirumalai)
 - 32bit compat_* updates from Stephen Rothwell
 - Fix race in context switch. The exception handler for bogus segment
   loads in __switch_to needs to keep interrupts disabled, otherwise an
   interrupt can deadlock on scheduler locks.  Also make sure they don't
   printk or set oops_in_progress during printk because printk does a
   wake_up too.
 - Disable 64bit GS base changes for processes.  I cannot get it to work
   reliably.
 - Clear IOPL on kernel entry

36 files changed:
arch/x86_64/Kconfig
arch/x86_64/Makefile
arch/x86_64/boot/Makefile
arch/x86_64/boot/compressed/Makefile
arch/x86_64/defconfig
arch/x86_64/ia32/fpu32.c
arch/x86_64/ia32/ia32_signal.c
arch/x86_64/ia32/ia32entry.S
arch/x86_64/ia32/sys_ia32.c
arch/x86_64/ia32/syscall32.c
arch/x86_64/kernel/Makefile
arch/x86_64/kernel/apic.c
arch/x86_64/kernel/entry.S
arch/x86_64/kernel/head.S
arch/x86_64/kernel/module.c
arch/x86_64/kernel/process.c
arch/x86_64/kernel/ptrace.c
arch/x86_64/kernel/setup64.c
arch/x86_64/kernel/smpboot.c
arch/x86_64/kernel/traps.c
arch/x86_64/lib/Makefile
arch/x86_64/lib/usercopy.c
arch/x86_64/mm/Makefile
arch/x86_64/mm/init.c
arch/x86_64/mm/modutil.c [deleted file]
arch/x86_64/pci/Makefile
arch/x86_64/vmlinux.lds.S
include/asm-x86_64/bug.h [new file with mode: 0644]
include/asm-x86_64/compat.h
include/asm-x86_64/ia32.h
include/asm-x86_64/mmu_context.h
include/asm-x86_64/page.h
include/asm-x86_64/proto.h
include/asm-x86_64/ptrace.h
include/asm-x86_64/segment.h
include/asm-x86_64/uaccess.h

index 6d95f38a29d83ac8bc08519129c4096dbe30e5f2..9c7383c5c609c392e453b2f7b82c8432bc513f66 100644 (file)
@@ -13,8 +13,8 @@ config X86_64
        bool
        default y
        help
-         Port to the x86-64 architecture. x86-64 is an 64bit extension to the
-         classical 32bit x86 architecture. For details see http://www.x86-64.org
+         Port to the x86-64 architecture. x86-64 is a 64-bit extension to the
+         classical 32-bit x86 architecture. For details see http://www.x86-64.org
 
 config X86
        bool
@@ -68,7 +68,7 @@ config EARLY_PRINTK
          for kernel debugging when your machine crashes very early before
          the console code is initialized. For normal operation it is not
          recommended because it looks ugly and doesn't cooperate with 
-         klogd/syslogd or the X server.You should normally N here, unless
+         klogd/syslogd or the X server. You should normally N here, unless
          you want to debug such a crash.
          
 
@@ -89,8 +89,8 @@ config MK8
        bool "AMD-Hammer"
        help
          Support for AMD Clawhammer/Sledgehammer CPUs. Only choice for x86-64
-         currently so you should chose this if you want a x86-64 kernel. In fact
-         you will have no other choice than to chose this.
+         currently so you should choose this if you want a x86-64 kernel. In fact
+         you will have no other choice than to choose this.
 
 config GENERIC_CPU
        bool "Generic-x86-64"
@@ -165,7 +165,7 @@ config MTRR
 
          This code has a reasonably generic interface so that similar
          control registers on other processors can be easily supported
-         as well:
+         as well.
 
          Saying Y here also fixes a problem with buggy SMP BIOSes which only
          set the MTRRs for the boot CPU and not for the secondary CPUs. This
@@ -208,7 +208,7 @@ config SMP
          See also the <file:Documentation/smp.tex>,
          <file:Documentation/smp.txt>, <file:Documentation/i386/IO-APIC.txt>,
          <file:Documentation/nmi_watchdog.txt> and the SMP-HOWTO available at
-         <http://www.linuxdoc.org/docs.html#howto>.
+         <http://www.tldp.org/docs.html#howto>.
 
          If you don't know what to do here, say N.
 
@@ -252,7 +252,7 @@ config GART_IOMMU
        bool "IOMMU support"
        help
          Support the K8 IOMMU. Needed to run systems with more than 4GB of memory
-         properly with 32bit devices. You should probably turn this on.
+         properly with 32-bit devices. You should probably turn this on.
          The iommu can be turned off at runtime with the iommu=off parameter.
 
 config DUMMY_IOMMU
@@ -261,7 +261,7 @@ config DUMMY_IOMMU
        default y
        help
          Don't use IOMMU code. This will cause problems when you have more than 4GB 
-         of memory and any 32bit devices. Don't turn on unless you know what you
+         of memory and any 32-bit devices. Don't turn on unless you know what you
          are doing.
 
 config X86_MCE
@@ -287,7 +287,7 @@ config PM
          page on the WWW at
          <http://www.cs.utexas.edu/users/kharker/linux-laptop/> and the
          Battery Powered Linux mini-HOWTO, available from
-         <http://www.linuxdoc.org/docs.html#howto>.
+         <http://www.tldp.org/docs.html#howto>.
 
          Note that, even if you say N here, Linux on the x86 architecture
          will issue the hlt instruction if nothing is to be done, thereby
@@ -297,27 +297,27 @@ config SOFTWARE_SUSPEND
        bool "Software Suspend (EXPERIMENTAL)"
        depends on EXPERIMENTAL && PM
        ---help---
-         Enable the possibilty of suspendig machine. It doesn't need APM.
+         Enable the possibilty of suspending the machine. It doesn't need APM.
          You may suspend your machine by 'swsusp' or 'shutdown -z <time>' 
          (patch for sysvinit needed). 
 
-         It creates an image which is saved in your active swaps. By the next
-         booting the, pass 'resume=/path/to/your/swap/file' and kernel will 
-         detect the saved image, restore the memory from
-         it and then it continues to run as before you've suspended.
-         If you don't want the previous state to continue use the 'noresume'
-         kernel option. However note that your partitions will be fsck'd and
+         It creates an image which is saved in your active swaps. On the next
+         boot, pass the 'resume=/path/to/your/swap/file' option and the kernel
+         will detect the saved image, restore the memory from
+         it, and then continue to run as before you suspended.
+         If you don't want the previous state to continue, use the 'noresume'
+         kernel option. However, note that your partitions will be fsck'd and
          you must re-mkswap your swap partitions/files.
 
          Right now you may boot without resuming and then later resume but
-         in meantime you cannot use those swap partitions/files which were
+         in the meantime you cannot use those swap partitions/files which were
          involved in suspending. Also in this case there is a risk that buffers
          on disk won't match with saved ones.
 
-         SMP is supported ``as-is''. There's code for it but doesn't work.
-         There have been problems reported relating SCSI.
+         SMP is supported ``as-is''. There's code for it but doesn't work.
+         There have been problems reported relating to SCSI.
 
-         This option is about getting stable. However there is still some
+         This option is close to getting stable. However there is still some
          absence of features.
 
          For more information take a look at Documentation/swsusp.txt.
@@ -338,7 +338,7 @@ config PCI
          VESA. If you have PCI, say Y, otherwise N.
 
          The PCI-HOWTO, available from
-         <http://www.linuxdoc.org/docs.html#howto>, contains valuable
+         <http://www.tldp.org/docs.html#howto>, contains valuable
          information about which PCI hardware does work under Linux and which
          doesn't.
 
@@ -357,8 +357,8 @@ config HOTPLUG
          the system is running, and be able to use them quickly.  In many
          cases, the devices can likewise be unplugged at any time too.
 
-         One well known example of this is PCMCIA- or PC-cards, credit-card
-         size devices such as network cards, modems or hard drives which are
+         One well-known example of this is PCMCIA- or PC-cards, credit-card
+         size devices such as network cards, modems, or hard drives which are
          plugged into slots found on all modern laptop computers.  Another
          example, used on modern desktops as well as laptops, is USB.
 
@@ -390,7 +390,7 @@ config KCORE_ELF
 
          You have two choices here: ELF and A.OUT. Selecting ELF will make
          /proc/kcore appear in ELF core format as defined by the Executable
-         and Linking Format specification. Selecting A.OUT will choose the
+         and Linkable Format specification. Selecting A.OUT will choose the
          old "a.out" format which may be necessary for some old versions
          of binutils or on some architectures.
 
@@ -416,7 +416,7 @@ config BINFMT_ELF
          want to say Y here.
 
          Information about ELF is contained in the ELF HOWTO available from
-         <http://www.linuxdoc.org/docs.html#howto>.
+         <http://www.tldp.org/docs.html#howto>.
 
          If you find that after upgrading from Linux kernel 1.2 and saying Y
          here, you still can't run any ELF binaries (they just crash), then
@@ -438,7 +438,7 @@ config BINFMT_MISC
          programs that need an interpreter to run like Java, Python or
          Emacs-Lisp. It's also useful if you often run DOS executables under
          the Linux DOS emulator DOSEMU (read the DOSEMU-HOWTO, available from
-         <http://www.linuxdoc.org/docs.html#howto>). Once you have
+         <http://www.tldp.org/docs.html#howto>). Once you have
          registered such a binary class with the kernel, you can start one of
          those programs simply by typing in its name at a shell prompt; Linux
          will automatically feed it to the correct interpreter.
@@ -458,8 +458,8 @@ config BINFMT_MISC
 config IA32_EMULATION
        bool "IA32 Emulation"
        help
-         Include code to run 32bit programs under an 64bit kernel. You should likely
-         turn this on, unless you're 100% sure that you don't have any 32bit programs
+         Include code to run 32-bit programs under a 64-bit kernel. You should likely
+         turn this on, unless you're 100% sure that you don't have any 32-bit programs
          left.
 
 config COMPAT
@@ -507,13 +507,13 @@ config IDE
          ATA Packet Interface (ATAPI) is a protocol used by EIDE tape and
          CD-ROM drives, similar in many respects to the SCSI protocol.
 
-         SMART IDE (Self Monitoring, Analysis and Reporting Technology) was
+         SMART IDE (Self-Monitoring, Analysis and Reporting Technology) was
          designed in order to prevent data corruption and disk crash by
-         detecting pre hardware failure conditions (heat, access time, and
+         detecting pre-hardware failure conditions (heat, access time, and
          the like...). Disks built since June 1995 may follow this standard.
-         The kernel itself don't manage this; however there are quite a
+         The kernel itself doesn't manage this; however there are quite a
          number of user programs such as smart that can query the status of
-         SMART parameters disk.
+         SMART parameters from disk drives.
 
          If you want to compile this driver as a module ( = code which can be
          inserted in and removed from the running kernel whenever you want),
@@ -563,7 +563,7 @@ source "drivers/message/fusion/Kconfig"
 
 source "drivers/ieee1394/Kconfig"
 
-#Currently not 64bit safe
+#Currently not 64-bit safe
 #source drivers/message/i2o/Config.in
 source "net/Kconfig"
 
@@ -600,11 +600,12 @@ config SOUND
          interrupt and DMA channel), because you will be asked for it.
 
          You want to read the Sound-HOWTO, available from
-         <http://www.linuxdoc.org/docs.html#howto>. General information about
+         <http://www.tldp.org/docs.html#howto>. General information about
          the modular sound system is contained in the files
          <file:Documentation/sound/Introduction>.  The file
-         <file:Documentation/sound/README.OSS> contains some slightly
-         outdated but still useful information as well.
+         <file:Documentation/sound/oss/README.OSS> contains some slightly
+         outdated but still useful information as well.  Newer sound
+         driver documentation is found in <file:Documentation/sound/alsa/*>.
 
          If you have a PnP sound card and you want to configure it at boot
          time using the ISA PnP tools (read
@@ -613,7 +614,7 @@ config SOUND
          inserted in and removed from the running kernel whenever you want)
          and load that module after the PnP configuration is finished.  To do
          this, say M here and read <file:Documentation/modules.txt> as well
-         as <file:Documentation/sound/README.modules>; the module will be
+         as <file:Documentation/sound/oss/README.modules>; the module will be
          called soundcore.o.
 
          I'm told that even without a sound card, you can make your computer
index 48cd572db0dcf841ef33494c19ca4b54418f490a..b23e06713e86344cb103a870550acfe67e4c143c 100644 (file)
@@ -54,35 +54,31 @@ libs-y                                      += arch/x86_64/lib/
 core-y                                 += arch/x86_64/kernel/ arch/x86_64/mm/
 core-$(CONFIG_IA32_EMULATION)          += arch/x86_64/ia32/
 drivers-$(CONFIG_PCI)                  += arch/x86_64/pci/
-# FIXME: is drivers- right ?
 drivers-$(CONFIG_OPROFILE)             += arch/x86_64/oprofile/
 
-makeboot =$(Q)$(MAKE) -f scripts/Makefile.build obj=arch/x86_64/boot $(1)
+boot := arch/x86_64/boot
 
-.PHONY: zImage bzImage compressed zlilo bzlilo zdisk bzdisk install \
-               clean archclean archmrproper
+.PHONY: bzImage bzlilo bzdisk install archmrproper
 
-BOOTIMAGE=arch/x86_64/boot/bzImage
-zImage zlilo zdisk: BOOTIMAGE=arch/x86_64/boot/zImage
+#Default target when executing "make"
+all: bzImage
 
-zImage bzImage: vmlinux
-       $(call makeboot,$(BOOTIMAGE))
+BOOTIMAGE                     := arch/x86_64/boot/bzImage
 
-compressed: zImage
+bzImage: vmlinux
+       $(Q)$(MAKE) $(build)=$(boot) $(BOOTIMAGE)
 
-zlilo bzlilo: vmlinux
-       $(call makeboot,BOOTIMAGE=$(BOOTIMAGE) zlilo)
+bzlilo: vmlinux
+       $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(BOOTIMAGE) zlilo
 
-zdisk bzdisk: vmlinux
-       $(call makeboot,BOOTIMAGE=$(BOOTIMAGE) zdisk)
+bzdisk: vmlinux
+       $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(BOOTIMAGE) zdisk
 
 install: vmlinux
-       $(call makeboot,BOOTIMAGE=$(BOOTIMAGE) install)
+       $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(BOOTIMAGE) $@
 
 archclean:
-       $(Q)$(MAKE) $(clean)=arch/i386/boot
-
-archmrproper:
+       $(Q)$(MAKE) $(clean)=$(boot)
 
 prepare: include/asm-$(ARCH)/offset.h
 
@@ -90,10 +86,10 @@ arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
                                   include/config/MARKER
 
 include/asm-$(ARCH)/offset.h.tmp: arch/$(ARCH)/kernel/asm-offsets.s
-       @$(generate-asm-offsets.h) < $< > $@
 
-include/asm-$(ARCH)/offset.h: include/asm-$(ARCH)/offset.h.tmp
+include/asm-$(ARCH)/offset.h: arch/$(ARCH)/kernel/asm-offsets.s
        @echo -n '  Generating $@'
+       @$(generate-asm-offsets.h) < $< > $@.tmp
        @$(update-if-changed)
 
 CLEAN_FILES += include/asm-$(ARCH)/offset.h.tmp \
index 89eff91ba5736a10e3a8a1879fef1cfb13cb543b..922c75f760d4a7b4ba3bfa1eb7f4fb7ec1d9fc72 100644 (file)
@@ -26,16 +26,14 @@ SVGA_MODE := -DSVGA_MODE=NORMAL_VGA
 #RAMDISK := -DRAMDISK=512
 
 EXTRA_TARGETS  := vmlinux.bin bootsect bootsect.o \
-                  setup setup.o zImage bzImage
+                  setup setup.o bzImage
 
-CFLAGS += -m32
+EXTRA_CFLAGS := -m32
 
 host-progs     := tools/build
-subdir-                := compressed   #Let make clean descend in compressed/
+subdir-                := compressed/  #Let make clean descend in compressed/
 # ---------------------------------------------------------------------------
 
-$(obj)/zImage:  IMAGE_OFFSET := 0x1000
-$(obj)/zImage:  EXTRA_AFLAGS := -traditional $(SVGA_MODE) $(RAMDISK)
 $(obj)/bzImage: IMAGE_OFFSET := 0x100000
 $(obj)/bzImage: EXTRA_AFLAGS := -traditional $(SVGA_MODE) $(RAMDISK) -D__BIG_KERNEL__
 $(obj)/bzImage: BUILDFLAGS   := -b
@@ -44,7 +42,7 @@ quiet_cmd_image = BUILD   $@
 cmd_image = $(obj)/tools/build $(BUILDFLAGS) $(obj)/bootsect $(obj)/setup \
            $(obj)/vmlinux.bin $(ROOT_DEV) > $@
 
-$(obj)/zImage $(obj)/bzImage: $(obj)/bootsect $(obj)/setup \
+$(obj)/bzImage: $(obj)/bootsect $(obj)/setup \
                              $(obj)/vmlinux.bin $(obj)/tools/build FORCE
        $(call if_changed,image)
        @echo 'Kernel: $@ is ready'
index d182ac81f8e0a4bef34490c680244ef28778abba..13287c58eb31f3ae9773e4e47e24b7dc771f8982 100644 (file)
@@ -11,7 +11,7 @@ EXTRA_AFLAGS  := -traditional -m32
 
 # cannot use EXTRA_CFLAGS because base CFLAGS contains -mkernel which conflicts with
 # -m32
-CFLAGS := -m32 -D__KERNEL__ -I$(TOPDIR)/include -O2  
+CFLAGS := -m32 -D__KERNEL__ -Iinclude -O2  
 LDFLAGS := -m elf_i386
 
 LDFLAGS_vmlinux := -Ttext $(IMAGE_OFFSET) -e startup_32 -m elf_i386
index e628de000df25db39b4fe4f6aa17107e5fb11a21..c0fbb1bb960c25c7251ccc5fefca1692dd637c71 100644 (file)
@@ -19,10 +19,16 @@ CONFIG_EXPERIMENTAL=y
 #
 # General setup
 #
-CONFIG_NET=y
 CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
+# CONFIG_LOG_BUF_SHIFT_17 is not set
+CONFIG_LOG_BUF_SHIFT_16=y
+# CONFIG_LOG_BUF_SHIFT_15 is not set
+# CONFIG_LOG_BUF_SHIFT_14 is not set
+# CONFIG_LOG_BUF_SHIFT_13 is not set
+# CONFIG_LOG_BUF_SHIFT_12 is not set
+CONFIG_LOG_BUF_SHIFT=16
 
 #
 # Loadable module support
@@ -85,6 +91,7 @@ CONFIG_ACPI_SYSTEM=y
 #
 CONFIG_PCI=y
 CONFIG_PCI_DIRECT=y
+# CONFIG_PCI_LEGACY_PROC is not set
 # CONFIG_PCI_NAMES is not set
 # CONFIG_HOTPLUG is not set
 
@@ -163,15 +170,14 @@ CONFIG_BLK_DEV_ADMA=y
 # CONFIG_BLK_DEV_AEC62XX is not set
 # CONFIG_BLK_DEV_ALI15X3 is not set
 CONFIG_BLK_DEV_AMD74XX=y
-# CONFIG_AMD74XX_OVERRIDE is not set
 # CONFIG_BLK_DEV_CMD64X is not set
+# CONFIG_BLK_DEV_TRIFLEX is not set
 # CONFIG_BLK_DEV_CY82C693 is not set
 # CONFIG_BLK_DEV_CS5520 is not set
 # CONFIG_BLK_DEV_HPT34X is not set
 # CONFIG_BLK_DEV_HPT366 is not set
 # CONFIG_BLK_DEV_SC1200 is not set
 # CONFIG_BLK_DEV_PIIX is not set
-# CONFIG_BLK_DEV_NFORCE is not set
 # CONFIG_BLK_DEV_NS87415 is not set
 # CONFIG_BLK_DEV_OPTI621 is not set
 # CONFIG_BLK_DEV_PDC202XX_OLD is not set
@@ -211,6 +217,11 @@ CONFIG_BLK_DEV_IDE_MODES=y
 #
 # CONFIG_IEEE1394 is not set
 
+#
+# Networking support
+#
+CONFIG_NET=y
+
 #
 # Networking options
 #
@@ -263,10 +274,6 @@ CONFIG_IPV6_SCTP__=y
 # Network testing
 #
 # CONFIG_NET_PKTGEN is not set
-
-#
-# Network device support
-#
 CONFIG_NETDEVICES=y
 
 #
@@ -286,8 +293,6 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
 # CONFIG_NET_VENDOR_3COM is not set
-# CONFIG_NET_VENDOR_SMC is not set
-# CONFIG_NET_VENDOR_RACAL is not set
 
 #
 # Tulip family network device support
@@ -296,6 +301,7 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_HP100 is not set
 CONFIG_NET_PCI=y
 # CONFIG_PCNET32 is not set
+CONFIG_AMD8111_ETH=y
 # CONFIG_ADAPTEC_STARFIRE is not set
 # CONFIG_B44 is not set
 # CONFIG_DGRS is not set
@@ -315,7 +321,6 @@ CONFIG_8139TOO=m
 # CONFIG_SUNDANCE is not set
 # CONFIG_TLAN is not set
 # CONFIG_VIA_RHINE is not set
-# CONFIG_NET_POCKET is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -343,7 +348,6 @@ CONFIG_TIGON3=y
 #
 # Token Ring devices (depends on LLC=y)
 #
-# CONFIG_NET_FC is not set
 # CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
 
@@ -445,12 +449,25 @@ CONFIG_UNIX98_PTY_COUNT=256
 #
 # CONFIG_I2C is not set
 
+#
+# I2C Hardware Sensors Mainboard support
+#
+
+#
+# I2C Hardware Sensors Chip support
+#
+
 #
 # Mice
 #
 # CONFIG_BUSMOUSE is not set
 # CONFIG_QIC02_TAPE is not set
 
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
 #
 # Watchdog Cards
 #
@@ -470,7 +487,6 @@ CONFIG_RTC=y
 # CONFIG_FTAPE is not set
 # CONFIG_AGP is not set
 # CONFIG_AGP_GART is not set
-# CONFIG_AGP3 is not set
 # CONFIG_DRM is not set
 # CONFIG_MWAVE is not set
 CONFIG_RAW_DRIVER=y
@@ -544,6 +560,7 @@ CONFIG_NFSD_V3=y
 # CONFIG_NFSD_V4 is not set
 CONFIG_NFSD_TCP=y
 CONFIG_SUNRPC=y
+# CONFIG_SUNRPC_GSS is not set
 CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
 CONFIG_EXPORTFS=y
index 0528b55b42d51029a2d5165bcc6e437e7ad6317b..c1de60a3178293a82fd6864caa761a4711fa1237 100644 (file)
@@ -80,9 +80,9 @@ static inline int convert_fxsr_from_user(struct i387_fxsave_struct *fxsave,
        int err; 
        __u32 v;
 
-       err = __get_user(fxsave->cwd, (u16 *)&buf->cw); 
-       err |= __get_user(fxsave->swd, (u16 *)&buf->sw);
-       err |= __get_user(fxsave->twd, (u16 *)&buf->tag);
+       err = __get_user(fxsave->cwd, &buf->cw); 
+       err |= __get_user(fxsave->swd, &buf->sw);
+       err |= __get_user(fxsave->twd, &buf->tag);
        fxsave->twd = twd_i387_to_fxsr(fxsave->twd);
        err |= __get_user(fxsave->rip, &buf->ipoff); 
        err |= __get_user(fxsave->rdp, &buf->dataoff); 
index 3524132d1f0850208ee619f0d2ea04d4ebbe5205..c3d9c99d760ea101a892da384eff1b1e3ed610ad 100644 (file)
@@ -31,6 +31,7 @@
 #include <asm/user32.h>
 #include <asm/sigcontext32.h>
 #include <asm/fpu32.h>
+#include <asm/proto.h>
 
 #define ptr_to_u32(x) ((u32)(u64)(x))  /* avoid gcc warning */ 
 
@@ -405,18 +406,30 @@ void ia32_setup_frame(int sig, struct k_sigaction *ka,
        if (err)
                goto give_sigsegv;
 
-       /* Set up to return from userspace.  If provided, use a stub
-          already in userspace.  */
-       if (ka->sa.sa_flags & SA_RESTORER) {
-               err |= __put_user((u32)(u64)ka->sa.sa_restorer, &frame->pretcode);
-       } else {
-               err |= __put_user((u32)(u64)frame->retcode, &frame->pretcode);
-               /* This is popl %eax ; movl $,%eax ; int $0x80 */
-               err |= __put_user((u16)0xb858, (short *)(frame->retcode+0));
-               err |= __put_user((u32)__NR_ia32_sigreturn, (int *)(frame->retcode+2));
-               err |= __put_user((u16)0x80cd, (short *)(frame->retcode+6));
+       /* Return stub is in 32bit vsyscall page */
+       { 
+               void *restorer = syscall32_page + 32; 
+               if (ka->sa.sa_flags & SA_RESTORER)
+                       restorer = ka->sa.sa_restorer;       
+               err |= __put_user(ptr_to_u32(restorer), &frame->pretcode);
+       }
+       /* These are actually not used anymore, but left because some 
+          gdb versions depend on them as a marker. */
+       { 
+               /* copy_to_user optimizes that into a single 8 byte store */
+               static const struct { 
+                       u16 poplmovl;
+                       u32 val;
+                       u16 int80;    
+                       u16 pad; 
+               } __attribute__((packed)) code = { 
+                       0xb858,          /* popl %eax ; movl $...,%eax */
+                       __NR_ia32_sigreturn,   
+                       0x80cd,         /* int $0x80 */
+                       0,
+               }; 
+               err |= __copy_to_user(frame->retcode, &code, 8); 
        }
-
        if (err)
                goto give_sigsegv;
 
@@ -486,18 +499,33 @@ void ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        if (err)
                goto give_sigsegv;
 
-       /* Set up to return from userspace.  If provided, use a stub
-          already in userspace.  */
-       if (ka->sa.sa_flags & SA_RESTORER) {
-               err |= __put_user((u32)(u64)ka->sa.sa_restorer, &frame->pretcode);
-       } else {
-               err |= __put_user(ptr_to_u32(frame->retcode), &frame->pretcode);
-               /* This is movl $,%eax ; int $0x80 */
-               err |= __put_user(0xb8, (char *)(frame->retcode+0));
-               err |= __put_user((u32)__NR_ia32_rt_sigreturn, (int *)(frame->retcode+1));
-               err |= __put_user(0x80cd, (short *)(frame->retcode+5));
+       
+       { 
+               void *restorer = syscall32_page + 32; 
+               if (ka->sa.sa_flags & SA_RESTORER)
+                       restorer = ka->sa.sa_restorer;       
+               err |= __put_user(ptr_to_u32(restorer), &frame->pretcode);
        }
 
+       /* This is movl $,%eax ; int $0x80 */
+       /* Not actually used anymore, but left because some gdb versions
+          need it. */ 
+       { 
+               /* __copy_to_user optimizes that into a single 8 byte store */
+               static const struct { 
+                       u8 movl; 
+                       u32 val; 
+                       u16 int80; 
+                       u16 pad;
+                       u8  pad2;                               
+               } __attribute__((packed)) code = { 
+                       0xb8,
+                       __NR_ia32_rt_sigreturn,
+                       0x80cd,
+                       0,
+               }; 
+               err |= __copy_to_user(frame->retcode, &code, 8); 
+       } 
        if (err)
                goto give_sigsegv;
 
index 4cb9273b16e19de3950ff722b8498cd8ad2badae..0356e91dcd9f1a3deebbd93da49f2afa14d32e52 100644 (file)
@@ -248,7 +248,7 @@ ia32_sys_call_table:
        .quad sys_brk           /* 45 */
        .quad sys_setgid16
        .quad sys_getgid16
-       .quad ni_syscall        /* signal */
+       .quad sys_signal
        .quad sys_geteuid16
        .quad sys_getegid16     /* 50 */
        .quad sys_acct
@@ -299,8 +299,8 @@ ia32_sys_call_table:
        .quad sys_getpriority
        .quad sys_setpriority
        .quad ni_syscall                        /* old profil syscall holder */
-       .quad sys32_statfs
-       .quad sys32_fstatfs             /* 100 */
+       .quad compat_sys_statfs
+       .quad compat_sys_fstatfs                /* 100 */
        .quad sys_ioperm
        .quad sys32_socketcall
        .quad sys_syslog
index 83306f8ffe0a86ca68f1418a08bdf9d37aa8eec8..1730df54c52a63ec64587edfb3d2ba31e31bf275 100644 (file)
@@ -404,58 +404,6 @@ sys32_rt_sigprocmask(int how, sigset32_t *set, sigset32_t *oset,
        return 0;
 }
 
-static int
-put_statfs (struct statfs32 *ubuf, struct statfs *kbuf)
-{
-       if (verify_area(VERIFY_WRITE, ubuf, sizeof(struct statfs32)) ||
-           __put_user (kbuf->f_type, &ubuf->f_type) ||
-           __put_user (kbuf->f_bsize, &ubuf->f_bsize) ||
-           __put_user (kbuf->f_blocks, &ubuf->f_blocks) ||
-           __put_user (kbuf->f_bfree, &ubuf->f_bfree) ||
-           __put_user (kbuf->f_bavail, &ubuf->f_bavail) ||
-           __put_user (kbuf->f_files, &ubuf->f_files) ||
-           __put_user (kbuf->f_ffree, &ubuf->f_ffree) ||
-           __put_user (kbuf->f_namelen, &ubuf->f_namelen) ||
-           __put_user (kbuf->f_fsid.val[0], &ubuf->f_fsid.val[0]) ||
-           __put_user (kbuf->f_fsid.val[1], &ubuf->f_fsid.val[1]))
-               return -EFAULT;
-       return 0;
-}
-
-extern asmlinkage long sys_statfs(const char * path, struct statfs * buf);
-
-asmlinkage long
-sys32_statfs(const char * path, struct statfs32 *buf)
-{
-       int ret;
-       struct statfs s;
-       mm_segment_t old_fs = get_fs();
-       
-       set_fs (KERNEL_DS);
-       ret = sys_statfs((const char *)path, &s);
-       set_fs (old_fs);
-       if (put_statfs(buf, &s))
-               return -EFAULT;
-       return ret;
-}
-
-extern asmlinkage long sys_fstatfs(unsigned int fd, struct statfs * buf);
-
-asmlinkage long
-sys32_fstatfs(unsigned int fd, struct statfs32 *buf)
-{
-       int ret;
-       struct statfs s;
-       mm_segment_t old_fs = get_fs();
-       
-       set_fs (KERNEL_DS);
-       ret = sys_fstatfs(fd, &s);
-       set_fs (old_fs);
-       if (put_statfs(buf, &s))
-               return -EFAULT;
-       return ret;
-}
-
 static inline long
 get_tv32(struct timeval *o, struct compat_timeval *i)
 {
index f0d45a72506427f44f06ffb33d1653d8a512909b..e49beb014a0a4bf02e8cba48de3ca90ceae8caa1 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright 2002 Andi Kleen, SuSE Labs */
+/* Copyright 2002,2003 Andi Kleen, SuSE Labs */
 
 /* vsyscall handling for 32bit processes. Map a stub page into it 
    on demand because 32bit cannot reach the kernel's fixmaps */
@@ -8,8 +8,10 @@
 #include <linux/kernel.h>
 #include <linux/gfp.h>
 #include <linux/init.h>
+#include <linux/stringify.h>
 #include <asm/proto.h>
 #include <asm/tlbflush.h>
+#include <asm/ia32_unistd.h>
 
 /* 32bit SYSCALL stub mapped into user space. */ 
 asm("  .code32\n"
@@ -20,11 +22,26 @@ asm("       .code32\n"
     "  popl  %ebp\n"
     "  ret\n"
     "syscall32_end:\n"
+
+    /* signal trampolines */
+
+    "sig32_rt_tramp:\n"
+    "  movl $"  __stringify(__NR_ia32_rt_sigreturn) ",%eax\n"
+    "   int $0x80\n"
+    "sig32_rt_tramp_end:\n"
+
+    "sig32_tramp:\n"
+    "  popl %eax\n"
+    "  movl $"  __stringify(__NR_ia32_sigreturn) ",%eax\n"
+    "  int $0x80\n"
+    "sig32_tramp_end:\n"
     "  .code64\n"); 
 
 extern unsigned char syscall32[], syscall32_end[];
+extern unsigned char sig32_rt_tramp[], sig32_rt_tramp_end[];
+extern unsigned char sig32_tramp[], sig32_tramp_end[];
 
-static unsigned long syscall32_page; 
+char *syscall32_page; 
 
 /* RED-PEN: This knows too much about high level VM */ 
 /* Alternative would be to generate a vma with appropiate backing options
@@ -54,11 +71,16 @@ int map_syscall32(struct mm_struct *mm, unsigned long address)
 
 static int __init init_syscall32(void)
 { 
-       syscall32_page = get_zeroed_page(GFP_KERNEL); 
+       syscall32_page = (void *)get_zeroed_page(GFP_KERNEL); 
        if (!syscall32_page) 
                panic("Cannot allocate syscall32 page"); 
        SetPageReserved(virt_to_page(syscall32_page));
-       memcpy((void *)syscall32_page, syscall32, syscall32_end - syscall32);
+       memcpy(syscall32_page, syscall32, syscall32_end - syscall32);
+       memcpy(syscall32_page + 32, sig32_rt_tramp, 
+              sig32_rt_tramp_end - sig32_rt_tramp);
+       memcpy(syscall32_page + 64, sig32_tramp, 
+              sig32_tramp_end - sig32_tramp);  
+       return 0;
 } 
        
 __initcall(init_syscall32); 
index 61d5387df48ca66772c8c2f1bdcacf0d28eaa5d2..d0c9d25d5db938f5bf1a43ec13049fde520cdf51 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 EXTRA_TARGETS  := head.o head64.o init_task.o
-
+EXTRA_AFLAGS  := -traditional
 export-objs     := x8664_ksyms.o pci-gart.o pci-dma.o
 
 obj-y  := process.o semaphore.o signal.o entry.o traps.o irq.o \
@@ -32,4 +32,3 @@ $(obj)/bootflag.c:
 
 clean-files += bootflag.c
 
-EXTRA_AFLAGS := -traditional
index f56ca7829a82c544cb444acc749e75891c15d25e..d7efa0f8370a241f63c4e9cdf7ecb42c7f0044f4 100644 (file)
@@ -39,7 +39,7 @@ int dont_enable_local_apic __initdata = 0;
 
 int prof_multiplier[NR_CPUS] = { 1, };
 int prof_old_multiplier[NR_CPUS] = { 1, };
-int prof_counter[NR_CPUS] = { 1, };
+DEFINE_PER_CPU(int, prof_counter) =  1;
 
 int get_maxlvt(void)
 {
@@ -901,7 +901,7 @@ inline void smp_local_timer_interrupt(struct pt_regs *regs)
 
        x86_do_profile(regs);
 
-       if (--prof_counter[cpu] <= 0) {
+       if (--per_cpu(prof_counter, cpu) <= 0) {
                /*
                 * The multiplier may have changed since the last time we got
                 * to this point as a result of the user writing to
@@ -910,10 +910,11 @@ inline void smp_local_timer_interrupt(struct pt_regs *regs)
                 *
                 * Interrupts are already masked off at this point.
                 */
-               prof_counter[cpu] = prof_multiplier[cpu];
-               if (prof_counter[cpu] != prof_old_multiplier[cpu]) {
-                       __setup_APIC_LVTT(calibration_result/prof_counter[cpu]);
-                       prof_old_multiplier[cpu] = prof_counter[cpu];
+               per_cpu(prof_counter, cpu) = prof_multiplier[cpu];
+               if (per_cpu(prof_counter, cpu) != prof_old_multiplier[cpu]) {
+                       __setup_APIC_LVTT(calibration_result/
+                                       per_cpu(prof_counter, cpu));
+                       prof_old_multiplier[cpu] = per_cpu(prof_counter, cpu);
                }
 
 #ifdef CONFIG_SMP
index 0d7939f3f8c69b3f43be4619391868d7aea07349..44e20af8ba970773d35b62028f89929b8cf89600 100644 (file)
@@ -532,8 +532,10 @@ error_swapgs:
        xorl %ebx,%ebx  
        swapgs
 error_sti:     
+       bt $9,EFLAGS(%rsp)
+       jnc 1f
        sti
-       movq %rdi,RDI(%rsp)     
+1:     movq %rdi,RDI(%rsp)     
        movq %rsp,%rdi
        movq ORIG_RAX(%rsp),%rsi        /* get error code */ 
        movq $-1,ORIG_RAX(%rsp)
index 3b6a7d534f05822687048f23f99871132e987e96..d9d254e033d4eacd1c0cc36cfdba94a702dd5333 100644 (file)
@@ -66,7 +66,7 @@ startup_32:
        movl    %eax, %cr4
 
        /* Setup early boot stage 4 level pagetables */
-       movl    $0x101000, %eax
+       movl    $(init_level4_pgt - __START_KERNEL_map), %eax
        movl    %eax, %cr3
 
        /* Setup EFER (Extended Feature Enable Register) */
@@ -89,20 +89,13 @@ startup_32:
        wrmsr
 
        xorl    %eax, %eax
-       /* Enable paging and in turn activate Long Mode */
-       btsl    $31, %eax
-       /* Enable protected mode */
-       btsl    $0, %eax
-       /* Enable MP */
-       btsl    $1, %eax
-       /* Enable ET */
-       btsl    $4, %eax
-       /* Enable NE */
-       btsl    $5, %eax
-       /* Enable WP */
-       btsl    $16, %eax
-       /* Enable AM */
-       btsl    $18, %eax
+       btsl    $31, %eax                       /* Enable paging and in turn activate Long Mode */
+       btsl    $0, %eax                        /* Enable protected mode */
+       btsl    $1, %eax                        /* Enable MP */
+       btsl    $4, %eax                        /* Enable ET */
+       btsl    $5, %eax                        /* Enable NE */
+       btsl    $16, %eax                       /* Enable WP */
+       btsl    $18, %eax                       /* Enable AM */
        /* Make changes effective */
        movl    %eax, %cr0
        jmp     reach_compatibility_mode
@@ -120,10 +113,10 @@ reach_compatibility_mode:
        
        /* Load new GDT with the 64bit segment using 32bit descriptor */
        /* to avoid 32bit relocations we use fixed adresses here */
-       movl    $0x100F00, %eax
+       movl    $(pGDT32 - __START_KERNEL_map), %eax
        lgdt    (%eax)
 
-       movl    $0x100F10, %eax
+       movl    $(ljumpvector - __START_KERNEL_map), %eax
        /* Finally jump in 64bit mode */
        ljmp    *(%eax)
 
@@ -205,11 +198,11 @@ ENTRY(no_long_mode)
 .org 0xf00
 pGDT32:
        .word   gdt32_end-gdt_table32
-       .long   gdt_table32-__START_KERNEL+0x100000
+       .long   gdt_table32-__START_KERNEL_map
 
 .org 0xf10     
 ljumpvector:
-       .long   reach_long64-__START_KERNEL+0x100000
+       .long   reach_long64-__START_KERNEL_map
        .word   __KERNEL_CS
 
 ENTRY(stext)
index cbad71d06037d30a579b99558164826b54bd1c3c..45c2a25c8b28889ebc168e3f4af8ef3654ca9a71 100644 (file)
@@ -1,6 +1,6 @@
 /*  Kernel module help for x86-64
     Copyright (C) 2001 Rusty Russell.
-    Copyright (C) 2002 Andi Kleen, SuSE Labs.
+    Copyright (C) 2002,2003 Andi Kleen, SuSE Labs.
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
 #include <linux/fs.h>
 #include <linux/string.h>
 #include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+
+#include <asm/system.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
 
 #define DEBUGP(fmt...) 
  
+void module_free(struct module *mod, void *module_region)
+{
+       struct vm_struct **prevp, *map;
+       int i;
+       unsigned long addr = (unsigned long)module_region;
+
+       if (!addr)
+               return;
+       write_lock(&vmlist_lock); 
+       for (prevp = &vmlist ; (map = *prevp) ; prevp = &map->next) {
+               if ((unsigned long)map->addr == addr) {
+                       *prevp = map->next;
+                       write_unlock(&vmlist_lock); 
+                       goto found;
+               }
+       }
+       write_unlock(&vmlist_lock); 
+       printk("Trying to unmap nonexistent module vm area (%lx)\n", addr);
+       return;
+ found:
+       unmap_vm_area(map);
+       if (map->pages) {
+               for (i = 0; i < map->nr_pages; i++)
+                       if (map->pages[i])
+                               __free_page(map->pages[i]);     
+               kfree(map->pages);
+       }
+       kfree(map);                                     
+}
+
+void *module_alloc(unsigned long size)
+{
+       struct vm_struct **p, *tmp, *area;
+       struct page **pages;
+       void *addr;
+       unsigned int nr_pages, array_size, i;
+
+       if (!size)
+               return NULL; 
+       size = PAGE_ALIGN(size);
+       if (size > MODULES_LEN)
+               return NULL;
+
+       area = (struct vm_struct *) kmalloc(sizeof(*area), GFP_KERNEL);
+       if (!area)
+               return NULL;
+       memset(area, 0, sizeof(struct vm_struct));
+
+       write_lock(&vmlist_lock);
+       addr = (void *) MODULES_VADDR;
+       for (p = &vmlist; (tmp = *p); p = &tmp->next) {
+               void *next; 
+               DEBUGP("vmlist %p %lu addr %p\n", tmp->addr, tmp->size, addr);
+               if (size + (unsigned long) addr + PAGE_SIZE < (unsigned long) tmp->addr)
+                       break;
+               next = (void *) (tmp->size + (unsigned long) tmp->addr);
+               if (next > addr) 
+                       addr = next;
+       }
+
+       if ((unsigned long)addr + size >= MODULES_END) {
+               write_unlock(&vmlist_lock);
+               kfree(area); 
+               return NULL;
+       }
+       DEBUGP("addr %p\n", addr);
+
+       area->next = *p;
+       *p = area;
+       area->size = size + PAGE_SIZE;
+       area->addr = addr;
+       write_unlock(&vmlist_lock);
+
+       nr_pages = size >> PAGE_SHIFT;
+       array_size = (nr_pages * sizeof(struct page *));
+
+       area->nr_pages = nr_pages;
+       area->pages = pages = kmalloc(array_size, GFP_KERNEL);
+       if (!area->pages) 
+               goto fail;
+
+       memset(area->pages, 0, array_size);
+       for (i = 0; i < nr_pages; i++) {
+               area->pages[i] = alloc_page(GFP_KERNEL);
+               if (area->pages[i] == NULL)
+                       goto fail;
+       }
+       
+       if (map_vm_area(area, PAGE_KERNEL_EXECUTABLE, &pages))
+               goto fail;
+       
+       memset(addr, 0, size);
+       DEBUGP("module_alloc size %lu = %p\n", size, addr);
+       return addr;
+
+fail:
+       module_free(NULL, addr);
+       return NULL;
+}
+
 /* We don't need anything special. */
 int module_frob_arch_sections(Elf_Ehdr *hdr,
                              Elf_Shdr *sechdrs,
index a70c9654d8f07d7ed9e019aa924f420927952221..57a527b71d90406a165c3725fe8ca130394866da 100644 (file)
@@ -537,6 +537,11 @@ int sys_arch_prctl(int code, unsigned long addr)
 
        switch (code) { 
        case ARCH_SET_GS:
+#if 1
+               /* For now. We still have one unsolved bug in long gs base context
+                  switch handling. */
+               return -EINVAL; 
+#else
                if (addr >= TASK_SIZE) 
                        return -EPERM; 
                get_cpu();
@@ -546,6 +551,7 @@ int sys_arch_prctl(int code, unsigned long addr)
                ret = checking_wrmsrl(MSR_KERNEL_GS_BASE, addr); 
                put_cpu();
                break;
+#endif
        case ARCH_SET_FS:
                /* Not strictly needed for fs, but do it for symmetry
                   with gs */
@@ -594,15 +600,15 @@ static int get_free_idx(void)
  * Set a given TLS descriptor:
  * When you want addresses > 32bit use arch_prctl() 
  */
-asmlinkage int sys_set_thread_area(struct user_desc *u_info)
+int do_set_thread_area(struct thread_struct *t, struct user_desc *u_info)
 {
-       struct thread_struct *t = &current->thread;
        struct user_desc info;
        struct n_desc_struct *desc;
        int cpu, idx;
 
        if (copy_from_user(&info, u_info, sizeof(info)))
                return -EFAULT;
+
        idx = info.entry_number;
 
        /*
@@ -634,12 +640,19 @@ asmlinkage int sys_set_thread_area(struct user_desc *u_info)
                desc->a = LDT_entry_a(&info);
                desc->b = LDT_entry_b(&info);
        }
+       if (t == &current->thread)
        load_TLS(t, cpu);
 
        put_cpu();
        return 0;
 }
 
+asmlinkage int sys_set_thread_area(struct user_desc *u_info)
+{ 
+       return do_set_thread_area(&current->thread, u_info); 
+} 
+
+
 /*
  * Get the current Thread-Local Storage area:
  */
@@ -661,7 +674,7 @@ asmlinkage int sys_set_thread_area(struct user_desc *u_info)
 #define GET_USEABLE(desc)      (((desc)->b >> 20) & 1)
 #define GET_LONGMODE(desc)     (((desc)->b >> 21) & 1)
 
-asmlinkage int sys_get_thread_area(struct user_desc *u_info)
+int do_get_thread_area(struct thread_struct *t, struct user_desc *u_info)
 {
        struct user_desc info;
        struct n_desc_struct *desc;
@@ -672,7 +685,7 @@ asmlinkage int sys_get_thread_area(struct user_desc *u_info)
        if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX)
                return -EINVAL;
 
-       desc = ((struct n_desc_struct *)current->thread.tls_array) + idx - GDT_ENTRY_TLS_MIN;
+       desc = ((struct n_desc_struct *)t->tls_array) + idx - GDT_ENTRY_TLS_MIN;
 
        memset(&info, 0, sizeof(struct user_desc));
        info.entry_number = idx;
@@ -691,6 +704,11 @@ asmlinkage int sys_get_thread_area(struct user_desc *u_info)
        return 0;
 }
 
+asmlinkage int sys_get_thread_area(struct user_desc *u_info)
+{
+       return do_get_thread_area(&current->thread, u_info);
+} 
+
 /* 
  * Capture the user space registers if the task is not running (in user space)
  */
index 93f5b66dc3161bcc77a7f35bf32c4061d848bded..81493813ad6cadd74b524a5ce9cb17ab17ff9393 100644 (file)
@@ -23,6 +23,9 @@
 #include <asm/processor.h>
 #include <asm/i387.h>
 #include <asm/debugreg.h>
+#include <asm/ldt.h>
+#include <asm/desc.h>
+#include <asm/proto.h>
 
 /*
  * does not yet catch signals sent when the child dies.
@@ -319,6 +322,22 @@ asmlinkage long sys_ptrace(long request, long pid, long addr, long data)
                wake_up_process(child);
                ret = 0;
                break;
+       case PTRACE_SET_THREAD_AREA: {
+               int old; 
+               get_user(old,  &((struct user_desc *)data)->entry_number); 
+               put_user(addr, &((struct user_desc *)data)->entry_number);
+               ret = do_set_thread_area(&child->thread, 
+                                        (struct user_desc *)data);
+               put_user(old,  &((struct user_desc *)data)->entry_number); 
+               break;
+       case PTRACE_GET_THREAD_AREA:
+               get_user(old,  &((struct user_desc *)data)->entry_number); 
+               put_user(addr, &((struct user_desc *)data)->entry_number);
+               ret = do_get_thread_area(&child->thread, 
+                                        (struct user_desc *)data);
+               put_user(old,  &((struct user_desc *)data)->entry_number); 
+               break;
+       } 
        }
 
 /*
index bd27e6363b067f0aecdec37caeaa4f9c0af4a8aa..3893f05bd86efdffd4d0544beab713aa6af39711 100644 (file)
@@ -200,7 +200,7 @@ void __init cpu_init (void)
 #endif
 
        /* Flags to clear on syscall */
-       wrmsrl(MSR_SYSCALL_MASK, EF_TF|EF_DF|EF_IE); 
+       wrmsrl(MSR_SYSCALL_MASK, EF_TF|EF_DF|EF_IE|0x3000); 
 
        wrmsrl(MSR_FS_BASE, 0);
        wrmsrl(MSR_KERNEL_GS_BASE, 0);
index a93135d3a39f6efd499446363c353a7a39df5ded..84c8ee9e6427501cbc88b27face0c83918c71a3b 100644 (file)
@@ -772,24 +772,16 @@ static void smp_tune_scheduling (void)
  * Cycle through the processors sending APIC IPIs to boot each.
  */
 
-extern int prof_multiplier[NR_CPUS];
-extern int prof_old_multiplier[NR_CPUS];
-extern int prof_counter[NR_CPUS];
-
 static void __init smp_boot_cpus(unsigned int max_cpus)
 {
        int apicid, cpu;
 
        /*
         * Initialize the logical to physical CPU number mapping
-        * and the per-CPU profiling counter/multiplier
         */
 
        for (apicid = 0; apicid < NR_CPUS; apicid++) {
                x86_apicid_to_cpu[apicid] = -1;
-               prof_counter[apicid] = 1;
-               prof_old_multiplier[apicid] = 1;
-               prof_multiplier[apicid] = 1;
        }
 
        /*
index 8741e6ccc12689c7c4cd4af7544f9ee2a3ecdc25..c35d487e37a484b0e0a47426bfecd4e86c1efd72 100644 (file)
@@ -450,16 +450,20 @@ asmlinkage void do_int3(struct pt_regs * regs, long error_code)
        do_trap(3, SIGTRAP, "int3", regs, error_code, NULL);
 }
 
+extern void dump_pagetable(unsigned long);
+
 asmlinkage void do_general_protection(struct pt_regs * regs, long error_code)
 {
 #ifdef CONFIG_CHECKING
        { 
                unsigned long gs; 
-               struct x8664_pda *pda = cpu_pda + stack_smp_processor_id(); 
+               struct x8664_pda *pda = cpu_pda + hard_smp_processor_id(); 
                rdmsrl(MSR_GS_BASE, gs); 
                if (gs != (unsigned long)pda) { 
                        wrmsrl(MSR_GS_BASE, pda); 
+                      oops_in_progress++;
                        printk("general protection handler: wrong gs %lx expected %p\n", gs, pda);
+                      oops_in_progress--;
                }
        }
 #endif
index 40d58be0849d3740be38a5f22409d663b65fe2fe..6fa25727295ccf9f7721451f8ea8c58ac1c9c8b3 100644 (file)
@@ -2,18 +2,15 @@
 # Makefile for x86_64-specific library files.
 #
 
-EXTRA_CFLAGS_csum-partial.o := -funroll-loops
+L_TARGET := lib.a
+export-objs := io.o csum-wrappers.o csum-partial.o
+
+CFLAGS_csum-partial.o := -funroll-loops
 
-L_TARGET = lib.a
-obj-y  = csum-partial.o csum-copy.o csum-wrappers.o delay.o \
+obj-y := csum-partial.o csum-copy.o csum-wrappers.o delay.o \
        usercopy.o getuser.o putuser.o  \
        thunk.o io.o clear_page.o copy_page.o bitstr.o
-obj-y += memcpy.o
-obj-y += memmove.o
-obj-y += memset.o
-obj-y += copy_user.o
-
-export-objs := io.o csum-wrappers.o csum-partial.o
+obj-y += memcpy.o memmove.o memset.o copy_user.o
 
 obj-$(CONFIG_IO_DEBUG) += iodebug.o
 obj-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o
index 4bafd50454616fe54b0e4da566ebee5891e484d4..2dec5d963671807af0a97b105ddfafe27d9717a1 100644 (file)
@@ -109,19 +109,34 @@ unsigned long clear_user(void *to, unsigned long n)
 
 long strnlen_user(const char *s, long n)
 {
-       unsigned long res = 0;
+       long res = 0;
        char c;
 
        if (!access_ok(VERIFY_READ, s, n))
                return 0;
 
        while (1) {
+               if (res>n)
+                       return n+1;
+               if (__get_user(c, s))
+                       return 0;
+               if (!c)
+                       return res+1;
+               res++;
+               s++;
+       }
+}
+
+long strlen_user(const char *s)
+{
+       long res = 0;
+       char c;
+
+       for (;;) {
                if (get_user(c, s))
                        return 0;
                if (!c)
                        return res+1;
-               if (res>n)
-                       return n+1;
                res++;
                s++;
        }
index 2faebe3fad25e40fe9ae804dfb37031da6a85991..f05b91f34bc82ec4932a47df6074b0ec5bf6c0a5 100644 (file)
@@ -4,5 +4,5 @@
 
 export-objs := pageattr.o
 
-obj-y   := init.o fault.o ioremap.o extable.o modutil.o pageattr.o
+obj-y   := init.o fault.o ioremap.o extable.o pageattr.o
 obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o
index 8796ded7eea087270329f3767c352339fc4239a5..44c9c6a6e8f93b653c9e5e8d86ef2c62a86c462b 100644 (file)
@@ -161,7 +161,6 @@ static  struct temp_map {
 } temp_mappings[] __initdata = { 
        { &temp_boot_pmds[0], (void *)(40UL * 1024 * 1024) },
        { &temp_boot_pmds[1], (void *)(42UL * 1024 * 1024) }, 
-       { &temp_boot_pmds[2], (void *)(44UL * 1024 * 1024) }, 
        {}
 }; 
 
@@ -316,8 +315,6 @@ void __init mem_init(void)
        int codesize, reservedpages, datasize, initsize;
        int tmp;
 
-       printk("mem_init\n");
-
        if (!mem_map)
                BUG();
 
diff --git a/arch/x86_64/mm/modutil.c b/arch/x86_64/mm/modutil.c
deleted file mode 100644 (file)
index 83584e6..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-/*  arch/x86_64/mm/modutil.c
- *
- *  Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
- *  Based upon code written by Linus Torvalds and others.
- * 
- *  Blatantly copied from sparc64 for x86-64 by Andi Kleen. 
- *  Should use direct mapping with 2MB pages. This would need extension
- *  of the kernel mapping.
- */
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-#include <linux/module.h>
-#include <linux/err.h>
-
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#include <asm/page.h>
-#include <asm/pgtable.h>
-
-/* FIXME: If module_region == mod->init_region, trim exception
-   table entries. */
-void module_free(struct module *mod, void *module_region)
-{
-       struct vm_struct **p, *tmp;
-       int i;
-       unsigned long addr = (unsigned long)module_region;
-
-       if (!addr)
-               return;
-       if ((PAGE_SIZE-1) & addr) {
-               printk("Trying to unmap module with bad address (%lx)\n", addr);
-               return;
-       }
-       write_lock(&vmlist_lock); 
-       for (p = &vmlist ; (tmp = *p) ; p = &tmp->next) {
-               if ((unsigned long)tmp->addr == addr) {
-                       *p = tmp->next;
-                       write_unlock(&vmlist_lock); 
-                       goto found;
-               }
-       }
-       write_unlock(&vmlist_lock); 
-       printk("Trying to unmap nonexistent module vm area (%lx)\n", addr);
-       return;
- found:
-       unmap_vm_area(tmp);
-       for (i = 0; i < tmp->nr_pages; i++) {
-               if (unlikely(!tmp->pages[i]))
-                       BUG();
-               __free_page(tmp->pages[i]);
-       }
-       
-       kfree(tmp->pages);
-       kfree(tmp);                                     
-}
-
-void * module_alloc (unsigned long size)
-{
-       struct vm_struct **p, *tmp, *area;
-       struct page **pages;
-       void * addr;
-       unsigned int nr_pages, array_size, i;
-
-       if (!size)
-               return NULL;
-       size = PAGE_ALIGN(size);
-       if (size > MODULES_LEN)
-               return ERR_PTR(-ENOMEM);
-               
-       addr = (void *) MODULES_VADDR;
-       for (p = &vmlist; (tmp = *p) ; p = &tmp->next) {
-               if (size + (unsigned long) addr < (unsigned long) tmp->addr)
-                       break;
-               addr = (void *) (tmp->size + (unsigned long) tmp->addr);
-       }
-       if ((unsigned long) addr + size >= MODULES_END)
-               return ERR_PTR(-ENOMEM);
-       
-       area = (struct vm_struct *) kmalloc(sizeof(*area), GFP_KERNEL);
-       if (!area)
-               return ERR_PTR(-ENOMEM);
-       area->size = size + PAGE_SIZE;
-       area->addr = addr;
-       area->next = *p;
-       area->pages = NULL;
-       area->nr_pages = 0;
-       area->phys_addr = 0;
-       *p = area;
-
-       nr_pages = size >> PAGE_SHIFT;
-       array_size = (nr_pages * sizeof(struct page *));
-
-       area->nr_pages = nr_pages;
-       area->pages = pages = kmalloc(array_size, GFP_KERNEL);
-       if (!area->pages)
-               goto fail;
-
-       memset(area->pages, 0, array_size);
-
-       for (i = 0; i < area->nr_pages; i++) {
-               area->pages[i] = alloc_page(GFP_KERNEL);
-               if (unlikely(!area->pages[i]))
-                       goto fail;
-       }
-       
-       if (map_vm_area(area, PAGE_KERNEL_EXECUTABLE, &pages)) {
-               unmap_vm_area(area);
-               goto fail;
-       }
-
-       memset(area->addr, 0, size);
-       return area->addr;
-
-fail:
-       if (area->pages) {
-               for (i = 0; i < area->nr_pages; i++) {
-                       if (area->pages[i])
-                               __free_page(area->pages[i]);
-               }
-               kfree(area->pages);
-       }
-       kfree(area);
-
-       return ERR_PTR(-ENOMEM);
-}
-
index 51efe894c5db942b6fec58458ae2409d3ac7030b..d113570fe82846c2915cb712b6b294caac323c2d 100644 (file)
@@ -1,14 +1,8 @@
-
+#
+# Makefile for X86_64 specific PCI routines
+#
 obj-y          := x86-64.o
-
-obj-$(CONFIG_PCI_DIRECT)       += direct.o
-
+obj-$(CONFIG_PCI_DIRECT)+= direct.o
 obj-y          += fixup.o
-
-ifdef  CONFIG_ACPI_PCI
-obj-y          += acpi.o
-endif
-obj-y          += legacy.o
-
-
-obj-y          += irq.o common.o
+obj-$(CONFIG_ACPI_PCI) += acpi.o
+obj-y                  += legacy.o irq.o common.o
index 12ff78f1e7a990b2ccf366045873f3897b2d693c..22a6ebdc20afcf3fafd44bfe63fa65deee1b0e62 100644 (file)
@@ -73,11 +73,6 @@ SECTIONS
   . = ALIGN(4096); 
   .data.boot_pgt : { *(.data.boot_pgt) }
 
-  . = ALIGN(4096);
-  __initramfs_start = .;
-  .init.ramfs : { *(.init.ramfs) }
-  __initramfs_end = .;
-       
   . = ALIGN(4096);             /* Init code and data */
   __init_begin = .;
   .init.text : { *(.init.text) }
@@ -100,6 +95,10 @@ SECTIONS
        *(.initcall7.init)
   }
   __initcall_end = .;
+  . = ALIGN(4096);
+  __initramfs_start = .;
+  .init.ramfs : { *(.init.ramfs) }
+  __initramfs_end = .; 
   . = ALIGN(32);
   __per_cpu_start = .;
   .data.percpu  : { *(.data.percpu) }
diff --git a/include/asm-x86_64/bug.h b/include/asm-x86_64/bug.h
new file mode 100644 (file)
index 0000000..cd37970
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef __ASM_X8664_BUG_H
+#define __ASM_X8664_BUG_H 1
+
+#include <linux/stringify.h>
+
+/*
+ * Tell the user there is some problem.  The exception handler decodes 
+ * this frame.
+ */ 
+struct bug_frame { 
+       unsigned char ud2[2];          
+       /* should use 32bit offset instead, but the assembler doesn't 
+          like it */ 
+       char *filename;   
+       unsigned short line; 
+} __attribute__((packed)); 
+
+#define BUG() \
+       asm volatile("ud2 ; .quad %c1 ; .short %c0" :: \
+                    "i"(__LINE__), "i" (__stringify(KBUILD_BASENAME)))
+#define PAGE_BUG(page) BUG()
+void out_of_line_bug(void);
+
+#endif
index 140308fb61e7f684f884839530f44eb8e096b664..5307fdeb598cb0e9f233be22eddafbe269a39dec 100644 (file)
@@ -68,4 +68,17 @@ struct compat_flock {
        compat_pid_t    l_pid;
 };
 
+struct compat_statfs {
+       int             f_type;
+       int             f_bsize;
+       int             f_blocks;
+       int             f_bfree;
+       int             f_bavail;
+       int             f_files;
+       int             f_ffree;
+       compat_fsid_t   f_fsid;
+       int             f_namelen;      /* SunOS ignores this field. */
+       int             f_spare[6];
+};
+
 #endif /* _ASM_X86_64_COMPAT_H */
index 7ebb9db4831426c9ae413afab572e1a3f755e5db..c39a426062eee4a473b39395ea549796995a9035 100644 (file)
@@ -101,19 +101,6 @@ struct stat64 {
 } __attribute__((packed));
 
 
-struct statfs32 {
-       int f_type;
-       int f_bsize;
-       int f_blocks;
-       int f_bfree;
-       int f_bavail;
-       int f_files;
-       int f_ffree;
-       compat_fsid_t f_fsid;
-       int f_namelen;  /* SunOS ignores this field. */
-       int f_spare[6];
-};
-
 typedef union sigval32 {
        int sival_int;
        unsigned int sival_ptr;
index 296390b6b5adad2cf122e558d45b296dfc1d6a61..41fc9820ee94324fd9414602fcebbcdd43805862 100644 (file)
@@ -62,7 +62,10 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
 #endif
 }
 
-#define deactivate_mm(tsk,mm)  do { } while (0)
+#define deactivate_mm(tsk,mm)  do { \
+       load_gs_index(0); \
+       asm volatile("movl %0,%%fs"::"r"(0));  \
+} while(0)
 
 #define activate_mm(prev, next) \
        switch_mm((prev),(next),NULL,smp_processor_id())
index 41a2b59d9d7d928de6300d3aac2b14ccbb300a72..2e65d509ec2521f0f2c36459c340056f70fc9b83 100644 (file)
@@ -69,21 +69,7 @@ typedef struct { unsigned long pgprot; } pgprot_t;
 
 #ifndef __ASSEMBLY__
 
-#include <linux/stringify.h>
-
-/*
- * Tell the user there is some problem.  The exception handler decodes this frame.
- */ 
-struct bug_frame { 
-       unsigned char ud2[2];          
-       char *filename;    /* should use 32bit offset instead, but the assembler doesn't like it */ 
-       unsigned short line; 
-} __attribute__((packed)); 
-#define BUG() \
-       asm volatile("ud2 ; .quad %c1 ; .short %c0" :: \
-                    "i"(__LINE__), "i" (__stringify(KBUILD_BASENAME)))
-#define PAGE_BUG(page) BUG()
-void out_of_line_bug(void);
+#include <asm/bug.h>
 
 /* Pure 2^n version of get_order */
 extern __inline__ int get_order(unsigned long size)
index 9ca683849c42533436e6858ac69c8d11cbedff62..f58ac42093e142d62ed9427ddd42997d02e5f16a 100644 (file)
@@ -43,6 +43,12 @@ extern void exception_table_check(void);
 extern int acpi_boot_init(char *);
 
 extern int map_syscall32(struct mm_struct *mm, unsigned long address);
+extern char *syscall32_page;
+
+struct thread_struct;
+
+int do_set_thread_area(struct thread_struct *t, struct user_desc *u_info);
+int do_get_thread_area(struct thread_struct *t, struct user_desc *u_info);
 
 #define round_up(x,y) (((x) + (y) - 1) & ~((y)-1))
 #define round_down(x,y) ((x) & ~((y)-1))
index da406de40ca14c319b3c3d4fb25d57f330e7b013..496595c011edc4564bf05e6f270a68369ef52877 100644 (file)
@@ -78,6 +78,10 @@ struct pt_regs {
 #define PTRACE_GETFPXREGS         18
 #define PTRACE_SETFPXREGS         19
 
+#define PTRACE_GET_THREAD_AREA    25
+#define PTRACE_SET_THREAD_AREA    26
+
+
 #if defined(__KERNEL__) && !defined(__ASSEMBLY__) 
 #define user_mode(regs) (!!((regs)->cs & 3))
 #define instruction_pointer(regs) ((regs)->rip)
index 64f131070585a1caeba0d1abf22fbe20787ac166..6992086cbe7cc4a33b584bcd1eff683891ebae28 100644 (file)
@@ -10,7 +10,7 @@
 
 /* 
  * we cannot use the same code segment descriptor for user and kernel
- * even not in the long flat model, because of different DPL /kkeil 
+ * -- not even in the long flat mode, because of different DPL /kkeil 
  * The segment offset needs to contain a RPL. Grr. -AK
  * GDT layout to get 64bit syscall right (sysret hardcodes gdt offsets) 
  */
index c18c2d6a77b2082061cb6559855a9f516d6bb6d0..14fa21f8b302c3e779d6c3bc73af44c481acdca3 100644 (file)
@@ -299,8 +299,8 @@ static inline int __copy_to_user(void *dst, const void *src, unsigned size)
 
 long strncpy_from_user(char *dst, const char *src, long count);
 long __strncpy_from_user(char *dst, const char *src, long count);
-#define strlen_user(str) strnlen_user(str, ~0UL >> 1)
 long strnlen_user(const char *str, long n);
+long strlen_user(const char *str);
 unsigned long clear_user(void *mem, unsigned long len);
 unsigned long __clear_user(void *mem, unsigned long len);