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
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
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.
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"
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
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.
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
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
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
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 a 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.
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.
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.
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.
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
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.
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
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),
source "drivers/ieee1394/Kconfig"
-#Currently not 64bit safe
+#Currently not 64-bit safe
#source drivers/message/i2o/Config.in
source "net/Kconfig"
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
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
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
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 \
#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
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'
# 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
#
# 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
#
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
# 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
#
# CONFIG_IEEE1394 is not set
+#
+# Networking support
+#
+CONFIG_NET=y
+
#
# Networking options
#
# Network testing
#
# CONFIG_NET_PKTGEN is not set
-
-#
-# Network device support
-#
CONFIG_NETDEVICES=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
# 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
# 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)
#
# Token Ring devices (depends on LLC=y)
#
-# CONFIG_NET_FC is not set
# CONFIG_RCPCI is not set
# CONFIG_SHAPER is not set
#
# 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
#
# 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
# 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
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);
#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 */
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;
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;
.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
.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
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)
{
-/* 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 */
#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"
" 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
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);
#
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 \
clean-files += bootflag.c
-EXTRA_AFLAGS := -traditional
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)
{
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
*
* 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
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)
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) */
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
/* 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)
.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)
/* 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,
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();
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 */
* 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 = ¤t->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;
/*
desc->a = LDT_entry_a(&info);
desc->b = LDT_entry_b(&info);
}
+ if (t == ¤t->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(¤t->thread, u_info);
+}
+
+
/*
* Get the current Thread-Local Storage area:
*/
#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;
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;
return 0;
}
+asmlinkage int sys_get_thread_area(struct user_desc *u_info)
+{
+ return do_get_thread_area(¤t->thread, u_info);
+}
+
/*
* Capture the user space registers if the task is not running (in user space)
*/
#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.
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;
+ }
}
/*
#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);
* 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;
}
/*
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
# 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
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++;
}
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
} 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) },
{}
};
int codesize, reservedpages, datasize, initsize;
int tmp;
- printk("mem_init\n");
-
if (!mem_map)
BUG();
+++ /dev/null
-/* 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);
-}
-
-
+#
+# 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
. = 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) }
*(.initcall7.init)
}
__initcall_end = .;
+ . = ALIGN(4096);
+ __initramfs_start = .;
+ .init.ramfs : { *(.init.ramfs) }
+ __initramfs_end = .;
. = ALIGN(32);
__per_cpu_start = .;
.data.percpu : { *(.data.percpu) }
--- /dev/null
+#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
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 */
} __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;
#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())
#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)
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))
#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)
/*
* 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)
*/
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);