+# -------- we can't build modules unless srcdir = builddir
+if test x$enable_modules != xno ; then
+AC_CHECK_FILE([Makefile.am],[],
+ [AC_ERROR([At this time, Lustre does not support building kernel modules with srcdir != buildir.])])
+fi
# -------- in kernel compilation? (2.5 only) -------------
-AC_ARG_ENABLE(inkernel, [ --enable-inkernel set up 2.5 kernel makefiles])
+AC_MSG_CHECKING([if inkernel build support is requested])
+AC_ARG_ENABLE([inkernel],
+ AC_HELP_STRING([--enable-inkernel],
+ [set up 2.5 kernel makefiles]),
+ [],[enable_inkernel=no])
+AC_MSG_RESULT([$enable_inkernel])
AM_CONDITIONAL(INKERNEL, test x$enable_inkernel = xyes)
-echo "Makefile for in kernel build: $INKERNEL"
# -------- are we building against an external portals? -------
-# haha, I wonder how one is really supposed to do this
-# automake seems to have a DEFS variable which looks good
-AC_ARG_WITH(cray-portals, [ --with-cray-portals=[path] path to cray portals],
- CRAY_PORTALS_INCLUDE="-I$with_cray_portals"
- CC="$CC -DCRAY_PORTALS=1"
- )
-AC_SUBST(CRAY_PORTALS_INCLUDE)
-AM_CONDITIONAL(CRAY_PORTALS, test ! "x$with_cray_portals" = x)
-
-# -------- liblustre compilation --------------
-AC_ARG_WITH(lib, [ --with-lib compile lustre library], host_cpu="lib")
+AC_MSG_CHECKING([if Cray portals should be used])
+AC_ARG_WITH([cray-portals],
+ AC_HELP_STRING([--with-cray-portals=path],
+ [path to cray portals]),
+ [
+ CRAY_PORTALS_INCLUDE="-I$with_cray_portals"
+ AC_DEFINE(CRAY_PORTALS, 1, [Building with Cray Portals])
+ ],[with_cray_portals=no])
+AC_MSG_RESULT([$with_cray_portals])
+AM_CONDITIONAL(CRAY_PORTALS, test x$with_cray_portals != xno)
+if test x$enable_tests = xno ; then
+ AC_MSG_NOTICE([disabling tests])
+ enable_tests=no
+fi
+if test x$enable_utils = xno ; then
+ AC_MSG_NOTICE([disabling utilities])
+ enable_utils=no
+fi
# -------- set linuxdir ------------
-
-AC_ARG_WITH(linux, [ --with-linux=[path] set path to Linux source (default=/usr/src/linux)],LINUX=$with_linux,LINUX=/usr/src/linux)
+AC_MSG_CHECKING([for Linux sources])
+AC_ARG_WITH([linux],
+ AC_HELP_STRING([--with-linux=path],
+ [set path to Linux source (default=/usr/src/linux)]),
+ [LINUX=$with_linux],
+ [LINUX=/usr/src/linux])
+AC_MSG_RESULT([$LINUX])
AC_SUBST(LINUX)
if test x$enable_inkernel = xyes ; then
echo ln -s `pwd` $LINUX/fs/lustre
fi
# --------------------
-AC_MSG_CHECKING(if you are running user mode linux for $host_cpu ...)
-if test $host_cpu = "lib" ; then
- host_cpu="lib"
- AC_MSG_RESULT(no building Lustre library)
-else
- if test -e $LINUX/include/asm-um ; then
- if test X`ls -id $LINUX/include/asm/ | awk '{print $1}'` = X`ls -id $LINUX/include/asm-um | awk '{print $1}'` ; then
- host_cpu="um";
- AC_MSG_RESULT(yes)
- else
- AC_MSG_RESULT(no (asm doesn't point at asm-um))
- fi
-
- else
- AC_MSG_RESULT(no (asm-um missing))
- fi
+ARCH_UM=
+UML_CFLAGS=
+if test x$enable_modules != xno ; then
+ AC_MSG_CHECKING([if you are running user mode linux for $host_cpu])
+ if test -e $LINUX/include/asm-um ; then
+ if test X`ls -id $LINUX/include/asm/ | awk '{print $1}'` = X`ls -id $LINUX/include/asm-um | awk '{print $1}'` ; then
+ ARCH_UM='ARCH=um'
+ # see notes in Rules.in
+ UML_CFLAGS='-O0'
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT([no (asm doesn't point at asm-um)])
+ fi
+ else
+ AC_MSG_RESULT([no (asm-um missing)])
+ fi
fi
-
+AC_SUBST(ARCH_UM)
+AC_SUBST(UML_CFLAGS)
# --------- Linux 25 ------------------
-AC_MSG_CHECKING(if you are running linux 2.5)
+AC_MSG_CHECKING([if you are running linux 2.5])
if test -e $LINUX/include/linux/namei.h ; then
linux25="yes"
- AC_MSG_RESULT(yes)
+ KMODEXT=".ko"
else
+ KMODEXT=".o"
linux25="no"
- AC_MSG_RESULT(no)
fi
+AC_MSG_RESULT([$linux25])
AM_CONDITIONAL(LINUX25, test x$linux25 = xyes)
-echo "Makefiles for in linux 2.5 build: $LINUX25"
+AC_SUBST(KMODEXT)
# ------- Makeflags ------------------
-AC_MSG_CHECKING(setting make flags system architecture: )
-case ${host_cpu} in
- lib )
- AC_MSG_RESULT($host_cpu)
- KCFLAGS='-g -Wall '
- KCPPFLAGS='-D__arch_lib__ '
- libdir='${exec_prefix}/lib/lustre'
- MOD_LINK=elf_i386
-;;
- um )
- AC_MSG_RESULT($host_cpu)
- KCFLAGS='-g -Wall -pipe -Wno-trigraphs -Wstrict-prototypes -fno-strict-aliasing -fno-common '
- case ${linux25} in
- yes )
- KCPPFLAGS='-D__KERNEL__ -U__i386__ -Ui386 -DUM_FASTCALL -D__arch_um__ -DSUBARCH="i386" -DNESTING=0 -D_LARGEFILE64_SOURCE -Derrno=kernel_errno -DPATCHLEVEL=4 -DMODULE -I$(LINUX)/arch/um/include -I$(LINUX)/arch/um/kernel/tt/include -I$(LINUX)/arch/um/kernel/skas/include -O2 -nostdinc -iwithprefix include'
- ;;
- * )
- KCPPFLAGS='-D__KERNEL__ -U__i386__ -Ui386 -DUM_FASTCALL -D__arch_um__ -DSUBARCH="i386" -DNESTING=0 -D_LARGEFILE64_SOURCE -Derrno=kernel_errno -DPATCHLEVEL=4 -DMODULE -I$(LINUX)/arch/um/kernel/tt/include -I$(LINUX)/arch/um/include '
- ;;
- esac
-
- MOD_LINK=elf_i386
-;;
- i*86 )
- AC_MSG_RESULT($host_cpu)
- KCFLAGS='-g -O2 -Wall -Wstrict-prototypes -pipe'
- case ${linux25} in
- yes )
- KCPPFLAGS='-D__KERNEL__ -DMODULE -march=i686 -I$(LINUX)/include/asm-i386/mach-default -nostdinc -iwithprefix include '
- ;;
- * )
- KCPPFLAGS='-D__KERNEL__ -DMODULE '
- ;;
- esac
- MOD_LINK=elf_i386
-;;
-
- alphaev6 )
- AC_MSG_RESULT($host_cpu)
- KCFLAGS='-g -O2 -Wall -Wstrict-prototypes -Wno-trigraphs -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mno-fp-regs -ffixed-8 -mcpu=ev5 -Wa,-mev6'
- KCPPFLAGS='-D__KERNEL__ -DMODULE '
- MOD_LINK=elf64alpha
-;;
-
- alphaev67 )
- AC_MSG_RESULT($host_cpu)
- KCFLAGS='-g -O2 -Wall -Wstrict-prototypes -Wno-trigraphs -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mno-fp-regs -ffixed-8 -mcpu=ev5 -Wa,-mev6'
- KCPPFLAGS='-D__KERNEL__ -DMODULE '
- MOD_LINK=elf64alpha
-;;
-
- alpha* )
- AC_MSG_RESULT($host_cpu)
- KCFLAGS='-g -O2 -Wall -Wstrict-prototypes -Wno-trigraphs -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mno-fp-regs -ffixed-8 -mcpu=ev5 -Wa,-mev5'
- KCPPFLAGS='-D__KERNEL__ -DMODULE '
- MOD_LINK=elf64alpha
-;;
-
- ia64 )
- AC_MSG_RESULT($host_cpu)
- KCFLAGS='-g -O2 -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -pipe -ffixed-r13 -mfixed-range=f10-f15,f32-f127 -falign-functions=32 -mb-step'
- KCPPFLAGS='-D__KERNEL__ -DMODULE'
- MOD_LINK=elf64_ia64
-;;
-
- x86_64 )
- AC_MSG_RESULT($host_cpu)
- KCFLAGS='-g -O2 -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -fomit-frame-pointer -mno-red-zone -mcmodel=kernel -pipe -fno-reorder-blocks -finline-limit=2000 -fno-strength-reduce -fno-asynchronous-unwind-tables'
- KCPPFLAGS='-D__KERNEL__ -DMODULE'
- MOD_LINK=elf_x86_64
-;;
-
- sparc64 )
- AC_MSG_RESULT($host_cpu)
- KCFLAGS='-O2 -Wall -Wstrict-prototypes -Wno-trigraphs -fomit-frame-pointer -fno-strict-aliasing -fno-common -Wno-unused -m64 -pipe -mno-fpu -mcpu=ultrasparc -mcmodel=medlow -ffixed-g4 -fcall-used-g5 -fcall-used-g7 -Wno-sign-compare -Wa,--undeclared-regs'
- KCPPFLAGS='-D__KERNEL__'
- MOD_LINK=elf64_sparc
-
-;;
-
- powerpc )
- AC_MSG_RESULT($host_cpu)
- KCFLAGS='-O2 -g -Wall -Wstrict-prototypes -Wno-trigraphs -fomit-frame-pointer -fno-strict-aliasing -fno-common -D__powerpc__ -fsigned-char -msoft-float -pipe -ffixed-r2 -Wno-uninitialized -mmultiple -mstring'
- KCPPFLAGS='-D__KERNEL__ -DMODULE'
- MOD_LINK=elf32ppclinux
-;;
-
- *)
- AC_ERROR("Unknown Linux Platform: $host_cpu")
-;;
-esac
+CPPFLAGS="$CRAY_PORTALS_INCLUDE $CRAY_PORTALS_COMMANDLINE -I\$(top_srcdir)/include -I\$(top_srcdir)/portals/include"
+
+# liblustre are all the same
+LLCPPFLAGS="-D__arch_lib__ -D_LARGEFILE64_SOURCE=1"
+AC_SUBST(LLCPPFLAGS)
+
+LLCFLAGS="-g -Wall -fPIC"
+AC_SUBST(LLCFLAGS)
+
+# everyone builds against portals and lustre
+
+if test x$enable_ldiskfs = xyes ; then
+ AC_DEFINE(CONFIG_LDISKFS_FS_MODULE, 1, [build ldiskfs as a module])
+ AC_DEFINE(CONFIG_LDISKFS_FS_XATTR, 1, [enable extended attributes for ldiskfs])
+ AC_DEFINE(CONFIG_LDISKFS_POSIX_ACL, 1, [enable posix acls])
+ AC_DEFINE(CONFIG_LDISKFS_FS_SECURITY, 1, [enable fs security])
+fi
+
+EXTRA_KCFLAGS="-g -I$PWD/portals/include -I$PWD/include $CRAY_PORTALS_INCLUDE $CRAY_PORTALS_COMMANDLINE"
# ----------- make dep run? ------------------
-if test $host_cpu != "lib" ; then
- AC_MSG_CHECKING(if make dep has been run in kernel source (host $host_cpu) )
- if test -f $LINUX/include/linux/config.h ; then
- AC_MSG_RESULT(yes)
- else
- AC_MSG_ERROR(** cannot find $LINUX/include/linux/config.h. Run make dep in $LINUX.)
- fi
+if test x$enable_modules != xno ; then
+ AC_MSG_CHECKING([if make dep has been run in kernel source (host $host_cpu)])
+ if test -f $LINUX/include/linux/config.h ; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ AC_MSG_ERROR([** cannot find $LINUX/include/linux/config.h. Run make dep in $LINUX.])
+ fi
fi
# ------------ include paths ------------------
-KINCFLAGS="$CRAY_PORTALS_INCLUDE $CRAY_PORTALS_COMMANDLINE \
- -I\$(top_srcdir)/include \
- -I\$(top_srcdir)/portals/include"
-if test $host_cpu != "lib" ; then
- KINCFLAGS="$KINCFLAGS -I$LINUX/include -I$LINUX/include"
-else
- KINCFLAGS="$KINCFLAGS -I\$(top_srcdir)/utils -I\$(top_srcdir)/portals/unals"
-fi
-CPPFLAGS="$KINCFLAGS $ARCHCPPFLAGS"
-
-if test $host_cpu != "lib" ; then
-# ------------ autoconf.h ------------------
- AC_MSG_CHECKING(if autoconf.h is in kernel source)
- if test -f $LINUX/include/linux/autoconf.h ; then
- AC_MSG_RESULT(yes)
- else
- AC_MSG_ERROR(** cannot find $LINUX/include/linux/autoconf.h. Run make config in $LINUX.)
- fi
-
-# ------------ LINUXRELEASE and moduledir ------------------
- AC_MSG_CHECKING(for Linux release)
-
- dnl We need to rid ourselves of the nasty [ ] quotes.
- changequote(, )
- dnl Get release from version.h
- LINUXRELEASE="`sed -ne 's/.*UTS_RELEASE[ \"]*\([0-9.a-zA-Z_-]*\).*/\1/p' $LINUX/include/linux/version.h`"
- changequote([, ])
-
- moduledir='$(libdir)/modules/'$LINUXRELEASE/kernel
- AC_SUBST(moduledir)
-
- modulefsdir='$(moduledir)/fs/$(PACKAGE)'
- AC_SUBST(modulefsdir)
-
- AC_MSG_RESULT($LINUXRELEASE)
- AC_SUBST(LINUXRELEASE)
+if test x$enable_modules != xno ; then
+ # ------------ autoconf.h ------------------
+ AC_MSG_CHECKING([if autoconf.h is in kernel source])
+ if test -f $LINUX/include/linux/autoconf.h ; then
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ AC_MSG_ERROR([** cannot find $LINUX/include/linux/autoconf.h. Run make config in $LINUX.])
+ fi
+
+ # ------------ LINUXRELEASE and moduledir ------------------
+ AC_MSG_CHECKING([for Linux release])
+
+ # this is bogus, as it doesn't work against kernel-source rpms
+ dnl We need to rid ourselves of the nasty [ ] quotes.
+ changequote(, )
+ dnl Get release from version.h
+ LINUXRELEASE="`sed -ne 's/.*UTS_RELEASE[ \"]*\([0-9.a-zA-Z_-]*\).*/\1/p' $LINUX/include/linux/version.h`"
+ changequote([, ])
+
+ moduledir='$(libdir)/modules/'$LINUXRELEASE/kernel
+ AC_SUBST(moduledir)
-# ------------ RELEASE --------------------------------
- AC_MSG_CHECKING(lustre release)
+ modulefsdir='$(moduledir)/fs/$(PACKAGE)'
+ AC_SUBST(modulefsdir)
+
+ AC_MSG_RESULT($LINUXRELEASE)
+ AC_SUBST(LINUXRELEASE)
+
+ # ------------ RELEASE --------------------------------
+ AC_MSG_CHECKING([lustre release])
- dnl We need to rid ourselves of the nasty [ ] quotes.
- changequote(, )
- dnl Get release from version.h
- RELEASE="`sed -ne 's/-/_/g' -e 's/.*UTS_RELEASE[ \"]*\([0-9.a-zA-Z_]*\).*/\1/p' $LINUX/include/linux/version.h`_`date +%Y%m%d%H%M`"
- changequote([, ])
-
- AC_MSG_RESULT($RELEASE)
- AC_SUBST(RELEASE)
-
-# ---------- modversions? --------------------
- AC_MSG_CHECKING(for MODVERSIONS)
- if egrep -e 'MODVERSIONS.*1' $LINUX/include/linux/autoconf.h >/dev/null 2>&1;
- then
- if test $linux25 != "yes"; then
- MFLAGS="-DMODULE -DMODVERSIONS -include $LINUX/include/linux/modversions.h -DEXPORT_SYMTAB"
- AC_MSG_RESULT(yes)
- fi
- fi
+ dnl We need to rid ourselves of the nasty [ ] quotes.
+ changequote(, )
+ dnl Get release from version.h
+ RELEASE="`sed -ne 's/-/_/g' -e 's/.*UTS_RELEASE[ \"]*\([0-9.a-zA-Z_]*\).*/\1/p' $LINUX/include/linux/version.h`_`date +%Y%m%d%H%M`"
+ changequote([, ])
+
+ AC_MSG_RESULT($RELEASE)
+ AC_SUBST(RELEASE)
fi
# ---------- Portals flags --------------------
#fi
#AC_SUBST(usrprefix)
-AC_MSG_CHECKING(if kernel has CPU affinity support)
-SET_CPUS_ALLOW="`grep -c set_cpus_allowed $LINUX/kernel/softirq.c`"
-if test "$SET_CPUS_ALLOW" != 0 ; then
- enable_affinity_temp="-DCPU_AFFINITY=1"
- AC_MSG_RESULT(yes)
+AC_MSG_CHECKING([for zero-copy TCP support])
+AC_ARG_ENABLE([zerocopy],
+ AC_HELP_STRING([--disable-zerocopy],
+ [disable socknal zerocopy]),
+ [],[enable_zerocopy='yes'])
+if test x$enable_zerocopy = xno ; then
+ AC_MSG_RESULT([no (by request)])
else
- enable_affinity_temp=""
- AC_MSG_RESULT(no)
+ ZCCD="`grep -c zccd $LINUX/include/linux/skbuff.h`"
+ if test "$ZCCD" != 0 ; then
+ AC_DEFINE(SOCKNAL_ZC, 1, [use zero-copy TCP])
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT([no (no kernel support)])
+ fi
fi
-AC_MSG_CHECKING(if kernel has zero-copy TCP support)
-ZCCD="`grep -c zccd $LINUX/include/linux/skbuff.h`"
-if test "$ZCCD" != 0 ; then
- enable_zerocopy_temp="-DSOCKNAL_ZC=1"
- AC_MSG_RESULT(yes)
+AC_MSG_CHECKING([for CPU affinity support])
+AC_ARG_ENABLE([affinity],
+ AC_HELP_STRING([--disable-affinity],
+ [disable process/irq affinity]),
+ [],[enable_affinity='yes'])
+if test x$enable_affinity = xno ; then
+ AC_MSG_RESULT([no (by request)])
else
- enable_zerocopy_temp=""
- AC_MSG_RESULT(no)
+ SET_CPUS_ALLOW="`grep -c set_cpus_allowed $LINUX/kernel/softirq.c`"
+ if test "$SET_CPUS_ALLOW" != 0 ; then
+ AC_DEFINE(CPU_AFFINITY, 1, [kernel has cpu affinity support])
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no (no kernel support)])
+ fi
fi
-AC_ARG_ENABLE(zerocopy, [ --disable-zerocopy disable socknal zerocopy],enable_zerocopy="", enable_zerocopy=$enable_zerocopy_temp)
-AC_ARG_ENABLE(affinity, [ --disable-affinity disable process/irq affinity],enable_affinity="", enable_affinity=$enable_affinity_temp)
#####################################
-AC_MSG_CHECKING(if quadrics kernel headers are present)
+AC_MSG_CHECKING([if quadrics kernel headers are present])
if test -d $LINUX/drivers/net/qsnet ; then
- AC_MSG_RESULT(yes)
- QSWNAL="qswnal"
- AC_MSG_CHECKING(for multirail EKC)
- if test -f $LINUX/include/elan/epcomms.h; then
- AC_MSG_RESULT(supported)
- with_quadrics="-DMULTIRAIL_EKC=1"
- else
- AC_MSG_RESULT(not supported)
- with_quadrics="-I$LINUX/drivers/net/qsnet/include"
- fi
- :
+ AC_MSG_RESULT([yes])
+ QSWNAL="qswnal"
+ AC_MSG_CHECKING([for multirail EKC])
+ if test -f $LINUX/include/elan/epcomms.h; then
+ AC_MSG_RESULT([supported])
+ QSWCPPFLAGS="-DMULTIRAIL_EKC=1"
+ else
+ AC_MSG_RESULT([not supported])
+ QSWCPPFLAGS="-I$LINUX/drivers/net/qsnet/include"
+ fi
else
- AC_MSG_RESULT(no)
- QSWNAL=""
- with_quadrics=""
- :
+ AC_MSG_RESULT([no])
+ QSWNAL=""
+ QSWCPPFLAGS=""
fi
-AC_SUBST(with_quadrics)
+AC_SUBST(QSWCPPFLAGS)
AC_SUBST(QSWNAL)
-# R. Read 5/02
-GMNAL=""
-echo "checking with-gm=" ${with_gm}
-if test "${with_gm+set}" = set; then
- if test "${with_gm}" = yes; then
- with_gm="-I/usr/local/gm/include"
- else
- with_gm="-I$with_gm/include -I$with_gm/drivers -I$with_gm/drivers/linux/gm"
- fi
- GMNAL="gmnal"
-else
-# default case - no GM
- with_gm=""
-fi
-AC_SUBST(with_gm)
+AC_MSG_CHECKING([if gm support was requested])
+AC_ARG_WITH([gm],
+ AC_HELP_STRING([--with-gm=path],
+ [build gmnal against path]),
+ [
+ case $with_gm in
+ yes)
+ AC_MSG_RESULT([yes])
+ GMCPPFLAGS="-I/usr/local/gm/include"
+ GMNAL="gmnal"
+ ;;
+ no)
+ AC_MSG_RESULT([no])
+ GMCPPFLAGS=""
+ GMNAL=""
+ ;;
+ *)
+ AC_MSG_RESULT([yes])
+ GMCPPFLAGS="-I$with_gm/include -I$with_gm/drivers -I$with_gm/drivers/linux/gm"
+ GMNAL="gmnal"
+ ;;
+ esac
+ ],[
+ AC_MSG_RESULT([no])
+ GMCPPFLAGS=""
+ GMNAL=""
+ ])
+AC_SUBST(GMCPPFLAGS)
AC_SUBST(GMNAL)
default_ib_include_dir=/usr/local/ib/include
an_ib_include_file=vapi.h
-AC_ARG_WITH(ib, [ --with-ib=[yes/no/path] Path to IB includes], with_ib=$withval, with_ib=$default_ib)
-AC_MSG_CHECKING(if IB headers are present)
-if test "$with_ib" = yes; then
- with_ib=$default_ib_include_dir
-fi
-if test "$with_ib" != no -a -f ${with_ib}/${an_ib_include_file}; then
- AC_MSG_RESULT(yes)
- IBNAL="ibnal"
- with_ib="-I${with_ib}"
-else
- AC_MSG_RESULT(no)
- IBNAL=""
- with_ib=""
-fi
+AC_MSG_CHECKING([if ib nal support was requested])
+AC_ARG_WITH([ib],
+ AC_HELP_STRING([--with-ib=yes/no/path],
+ [Path to IB includes]),
+ [
+ case $with_ib in
+ yes)
+ AC_MSG_RESULT([yes])
+ IBCPPFLAGS="-I/usr/local/ib/include"
+ IBNAL="ibnal"
+ ;;
+ no)
+ AC_MSG_RESULT([no])
+ IBCPPFLAGS=""
+ IBNAL=""
+ ;;
+ *)
+ AC_MSG_RESULT([yes])
+ IBCPPFLAGS="-I$with_ib"
+ IBNAL=""
+ ;;
+ esac
+ ],[
+ AC_MSG_RESULT([no])
+ IBFLAGS=""
+ IBNAL=""
+ ])
AC_SUBST(IBNAL)
-AC_SUBST(with_ib)
+AC_SUBST(IBCPPFLAGS)
def_scamac=/opt/scali/include
-AC_ARG_WITH(scamac, [ --with-scamac=[yes/no/path] Path to ScaMAC includes (default=/opt/scali/include)], with_scamac=$withval, with_scamac=$def_scamac)
-AC_MSG_CHECKING(if ScaMAC headers are present)
-if test "$with_scamac" = yes; then
- with_scamac=$def_scamac
-fi
-if test "$with_scamac" != no -a -f ${with_scamac}/scamac.h; then
- AC_MSG_RESULT(yes)
- SCIMACNAL="scimacnal"
- with_scamac="-I${with_scamac} -I${with_scamac}/icm"
-else
- AC_MSG_RESULT(no)
- SCIMACNAL=""
- with_scamac=""
-fi
-
-AC_SUBST(with_scamac)
+AC_MSG_CHECKING([if ScaMAC support was requested])
+AC_ARG_WITH([scamac],
+ AC_HELP_STRING([--with-scamac=yes/no/path],
+ [Path to ScaMAC includes (default=/opt/scali/include)]),
+ [
+ case $with_scamac in
+ yes)
+ AC_MSG_RESULT([yes])
+ SCIMACCPPFLAGS="-I/opt/scali/include"
+ SCIMACNAL="scimacnal"
+ ;;
+ no)
+ AC_MSG_RESULT([no])
+ SCIMACCPPFLAGS=""
+ SCIMACNAL=""
+ ;;
+ *)
+ AC_MSG_RESULT([yes])
+ SCIMACCPPFLAGS="-I$with_scamac -I$with_scamac/icm"
+ SCIMACNAL="scimacnal"
+ ;;
+ esac
+ ],[
+ AC_MSG_RESULT([no])
+ SCIMACCPPFLAGS=""
+ SCIMACNAL=""
+ ])
+AC_SUBST(SCIMACCPPFLAGS)
AC_SUBST(SCIMACNAL)
+# if test "$with_scamac" != no -a -f ${with_scamac}/scamac.h; then
-CFLAGS="$KCFLAGS"
-CPPFLAGS="$KINCFLAGS $KCPPFLAGS $MFLAGS $enable_zerocopy $enable_affinity $with_quadrics $with_gm $with_scamac $with_ib"
-if test $host_cpu == "lib" ; then
-CPPFLAGS="$CPPFLAGS -fPIC -D_LARGEFILE64_SOURCE=1 -g"
-fi
-
-AM_CONDITIONAL(LIBLUSTRE, test x$host_cpu = xlib)
AC_SUBST(MOD_LINK)
AC_SUBST(LINUX25)
-AM_CONDITIONAL(LIBLUSTRE, test x$host_cpu = xlib)
+
+# these are like AC_TRY_COMPILE, but try to build modules against the
+# kernel, inside the kernel-tests directory
+
+AC_DEFUN([LUSTRE_MODULE_CONFTEST],
+[cat >conftest.c <<_ACEOF
+$1
+_ACEOF
+])
+
+AC_DEFUN([LUSTRE_MODULE_COMPILE_IFELSE],
+[m4_ifvaln([$1], [LUSTRE_MODULE_CONFTEST([$1])])dnl
+rm -f kernel-tests/conftest.o kernel-tests/conftest.mod.c kernel-tests/conftest.ko
+AS_IF([_AC_EVAL_STDERR([cp conftest.c kernel-tests && make modules -C $LINUX $ARCH_UM SUBDIRS=$PWD/kernel-tests >/dev/null]) &&
+ AC_TRY_COMMAND([test -s kernel-tests/conftest.o])],
+ [$2],
+ [_AC_MSG_LOG_CONFTEST
+m4_ifvaln([$3],[$3])dnl])dnl
+rm -f kernel-tests/conftest.o kernel-tests/conftest.mod.c kernel-tests/conftest.mod.o kernel-tests/conftest.ko m4_ifval([$1], [kernel-tests/conftest.c conftest.c])[]dnl
+])
+
+AC_DEFUN([LUSTRE_MODULE_TRY_COMPILE],
+[LUSTRE_MODULE_COMPILE_IFELSE([AC_LANG_PROGRAM([[$1]], [[$2]])], [$3], [$4])])
# ---------- Red Hat 2.4.18 has iobuf->dovary --------------
# But other kernels don't
AC_MSG_CHECKING([if struct kiobuf has a dovary field])
-AC_TRY_COMPILE([#define __KERNEL__
- #include <linux/iobuf.h>],
- [struct kiobuf iobuf;
- iobuf.dovary = 1;],
- [AC_MSG_RESULT([yes])
- CPPFLAGS="$CPPFLAGS -DHAVE_KIOBUF_DOVARY"],
- [AC_MSG_RESULT([no])])
+LUSTRE_MODULE_TRY_COMPILE(
+ [
+ #include <linux/iobuf.h>
+ ],[
+ struct kiobuf iobuf;
+ iobuf.dovary = 1;
+ ],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_KIOBUF_DOVARY, 1, [struct kiobuf has a dovary field])
+ ],[
+ AC_MSG_RESULT([no])
+ ])
+
+# ----------- 2.6.4 no longer has page->list ---------------
+AC_MSG_CHECKING([if struct page has a list field])
+LUSTRE_MODULE_TRY_COMPILE(
+ [
+ #include <linux/mm.h>
+ ],[
+ struct page page;
+ &page.list;
+ ],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_PAGE_LIST, 1, [struct page has a list field])
+ ],[
+ AC_MSG_RESULT([no])
+ ])
# ---------- Red Hat 2.4.20 backports some 2.5 bits --------
# This needs to run after we've defined the KCPPFLAGS
-AC_MSG_CHECKING(for kernel version)
-AC_TRY_COMPILE([#define __KERNEL__
- #include <linux/sched.h>],
- [struct task_struct p;
- p.sighand = NULL;],
- [RH_2_4_20=1],
- [RH_2_4_20=0])
-
-if test $RH_2_4_20 = 1; then
- AC_MSG_RESULT(redhat-2.4.20)
- CPPFLAGS="$CPPFLAGS -DCONFIG_RH_2_4_20"
-else
- AC_MSG_RESULT($LINUXRELEASE)
-fi
+AC_MSG_CHECKING([for kernel version])
+LUSTRE_MODULE_TRY_COMPILE(
+ [
+ #include <linux/sched.h>
+ ],[
+ struct task_struct p;
+ p.sighand = NULL;
+ ],[
+ AC_DEFINE(CONFIG_RH_2_4_20, 1, [this kernel contains Red Hat 2.4.20 patches])
+ AC_MSG_RESULT([redhat-2.4.20])
+ ],[
+ AC_MSG_RESULT([$LINUXRELEASE])
+ ])
# ---------- Red Hat 2.4.21 backports some more 2.5 bits --------
-AC_MSG_CHECKING(if kernel defines PDE)
+AC_MSG_CHECKING([if kernel defines PDE])
HAVE_PDE="`grep -c 'proc_dir_entry..PDE' $LINUX/include/linux/proc_fs.h`"
if test "$HAVE_PDE" != 0 ; then
- CPPFLAGS="$CPPFLAGS -DHAVE_PDE"
- AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_PDE, 1, [the kernel defines PDE])
+ AC_MSG_RESULT([yes])
else
- AC_MSG_RESULT(no)
+ AC_MSG_RESULT([no])
fi
-AC_MSG_CHECKING(if kernel passes struct file to direct_IO)
+AC_MSG_CHECKING([if kernel passes struct file to direct_IO])
HAVE_DIO_FILE="`grep -c 'direct_IO.*struct file' $LINUX/include/linux/fs.h`"
if test "$HAVE_DIO_FILE" != 0 ; then
- CPPFLAGS="$CPPFLAGS -DHAVE_DIO_FILE"
- AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_DIO_FILE, 1, [the kernel passes struct file to direct_IO])
+ AC_MSG_RESULT(yes)
else
- AC_MSG_RESULT(no)
+ AC_MSG_RESULT(no)
fi
-# --- Check that ext3 and ext3 xattr are enabled in the kernel
-if test "$host_cpu" != "lib" ; then
- AC_MSG_CHECKING([that ext3 is enabled in the kernel])
- AC_TRY_COMPILE([
-#define __KERNEL__
-#include <linux/config.h>
- ],
+if test x$enable_modules != xno ; then
+ # ---------- modules? ------------------------
+ AC_MSG_CHECKING([for module support])
+ LUSTRE_MODULE_TRY_COMPILE(
[
-#ifdef CONFIG_EXT3_FS
- return 0;
-#else
-#error CONFIG_EXT3_FS not #defined
-#endif
- ],[AC_MSG_RESULT([yes])],
- [AC_MSG_RESULT([no])
- AC_MSG_ERROR([Lustre requires that ext3 is enabled in the kernel (CONFIG_EXT3_FS)])
+ #include <linux/config.h>
+ ],[
+ #ifndef CONFIG_MODULES
+ #error CONFIG_MODULES not #defined
+ #endif
+ ],[
+ AC_MSG_RESULT([yes])
+ ],[
+ AC_MSG_RESULT([no])
+ AC_MSG_ERROR([module support is required to build Lustre kernel modules.])
])
-# disable this check until our xattr patches define it!
-# AC_MSG_CHECKING([that extended attributes for ext3 are enabled in the kernel])
-# AC_TRY_COMPILE([
-##define __KERNEL__
-##include <linux/config.h>
-# ],
-# [
-##ifdef CONFIG_EXT3_FS_XATTR
-# return 0;
-##else
-##error CONFIG_EXT3_FS_XATTR not #defined
-##endif
-# ],[AC_MSG_RESULT([yes])],
-# [AC_MSG_RESULT([no])
-# AC_MSG_ERROR([Lustre requires that extended attributes for ext3 are enabled in the kernel (CONFIG_EXT3_FS_XATTR)])
-# ])
+
+ # ---------- modversions? --------------------
+ AC_MSG_CHECKING([for MODVERSIONS])
+ LUSTRE_MODULE_TRY_COMPILE(
+ [
+ #include <linux/config.h>
+ ],[
+ #ifndef CONFIG_MODVERSIONS
+ #error CONFIG_MODVERSIONS not #defined
+ #endif
+ ],[
+ AC_MSG_RESULT([yes])
+ ],[
+ AC_MSG_RESULT([no])
+ ])
+
+ if test $BACKINGFS = 'ext3' ; then
+ # --- Check that ext3 and ext3 xattr are enabled in the kernel
+ AC_MSG_CHECKING([that ext3 is enabled in the kernel])
+ LUSTRE_MODULE_TRY_COMPILE(
+ [
+ #include <linux/config.h>
+ ],[
+ #ifndef CONFIG_EXT3_FS
+ #ifndef CONFIG_EXT3_FS_MODULE
+ #error CONFIG_EXT3_FS not #defined
+ #endif
+ #endif
+ ],[
+ AC_MSG_RESULT([yes])
+ ],[
+ AC_MSG_RESULT([no])
+ AC_MSG_ERROR([Lustre requires that ext3 is enabled in the kernel (CONFIG_EXT3_FS)])
+ ])
+
+ AC_MSG_CHECKING([that extended attributes for ext3 are enabled in the kernel])
+ LUSTRE_MODULE_TRY_COMPILE(
+ [
+ #include <linux/config.h>
+ ],[
+ #ifndef CONFIG_EXT3_FS_XATTR
+ #error CONFIG_EXT3_FS_XATTR not #defined
+ #endif
+ ],[
+ AC_MSG_RESULT([yes])
+ ],[
+ AC_MSG_RESULT([no])
+ AC_MSG_WARN([Lustre requires that extended attributes for ext3 are enabled in the kernel (CONFIG_EXT3_FS_XATTR.)])
+ AC_MSG_WARN([This build may fail.])
+ ])
+ fi # BACKINGFS = ext3
fi
+CPPFLAGS="-include \$(top_builddir)/include/config.h $CPPFLAGS"
+EXTRA_KCFLAGS="-include $PWD/include/config.h $EXTRA_KCFLAGS"
+AC_SUBST(EXTRA_KCFLAGS)
+
+#echo "KCPPFLAGS: $KCPPFLAGS"
+#echo "KCFLAGS: $KCFLAGS"
+#echo "LLCPPFLAGS: $LLCPPFLAGS"
+#echo "LLCFLAGS: $LLCFLAGS"
+#echo "MOD_LINK: $MOD_LINK"
+#echo "CFLAGS: $CFLAGS"
+#echo "CPPFLAGS: $CPPFLAGS"
+++ /dev/null
---- linux-2.6.0/arch/alpha/kernel/irq.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/alpha/kernel/irq.c 2003-12-28 23:22:10.000000000 -0800
-@@ -252,9 +252,11 @@ static int
- irq_affinity_read_proc (char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
-- if (count < HEX_DIGITS+1)
-+ int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
-+ if (count - len < 2)
- return -EINVAL;
-- return sprintf (page, "%016lx\n", irq_affinity[(long)data]);
-+ len += sprintf(page + len, "\n");
-+ return len;
- }
-
- static unsigned int
-@@ -331,10 +333,11 @@ static int
- prof_cpu_mask_read_proc(char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
-- unsigned long *mask = (unsigned long *) data;
-- if (count < HEX_DIGITS+1)
-+ int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
-+ if (count - len < 2)
- return -EINVAL;
-- return sprintf (page, "%016lx\n", *mask);
-+ len += sprintf(page + len, "\n");
-+ return len;
- }
-
- static int
-@@ -529,19 +532,21 @@ show_interrupts(struct seq_file *p, void
- #ifdef CONFIG_SMP
- int j;
- #endif
-- int i;
-+ int i = *(loff_t *) v;
- struct irqaction * action;
- unsigned long flags;
-
- #ifdef CONFIG_SMP
-- seq_puts(p, " ");
-- for (i = 0; i < NR_CPUS; i++)
-- if (cpu_online(i))
-- seq_printf(p, "CPU%d ", i);
-- seq_putc(p, '\n');
-+ if (i == 0) {
-+ seq_puts(p, " ");
-+ for (i = 0; i < NR_CPUS; i++)
-+ if (cpu_online(i))
-+ seq_printf(p, "CPU%d ", i);
-+ seq_putc(p, '\n');
-+ }
- #endif
-
-- for (i = 0; i < ACTUAL_NR_IRQS; i++) {
-+ if (i < ACTUAL_NR_IRQS) {
- spin_lock_irqsave(&irq_desc[i].lock, flags);
- action = irq_desc[i].action;
- if (!action)
-@@ -568,15 +573,16 @@ show_interrupts(struct seq_file *p, void
- seq_putc(p, '\n');
- unlock:
- spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-- }
-+ } else if (i == ACTUAL_NR_IRQS) {
- #ifdef CONFIG_SMP
-- seq_puts(p, "IPI: ");
-- for (i = 0; i < NR_CPUS; i++)
-- if (cpu_online(i))
-- seq_printf(p, "%10lu ", cpu_data[i].ipi_count);
-- seq_putc(p, '\n');
-+ seq_puts(p, "IPI: ");
-+ for (i = 0; i < NR_CPUS; i++)
-+ if (cpu_online(i))
-+ seq_printf(p, "%10lu ", cpu_data[i].ipi_count);
-+ seq_putc(p, '\n');
- #endif
-- seq_printf(p, "ERR: %10lu\n", irq_err_count);
-+ seq_printf(p, "ERR: %10lu\n", irq_err_count);
-+ }
- return 0;
- }
-
---- linux-2.6.0/arch/alpha/kernel/traps.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/alpha/kernel/traps.c 2003-12-28 23:22:11.000000000 -0800
-@@ -636,6 +636,7 @@ do_entUna(void * va, unsigned long opcod
- lock_kernel();
- printk("Bad unaligned kernel access at %016lx: %p %lx %ld\n",
- pc, va, opcode, reg);
-+ dump_stack();
- do_exit(SIGSEGV);
-
- got_exception:
---- linux-2.6.0/arch/arm26/kernel/irq.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/arm26/kernel/irq.c 2003-12-28 23:22:06.000000000 -0800
-@@ -135,10 +135,10 @@ void enable_irq(unsigned int irq)
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i;
-+ int i = *(loff_t *) v;
- struct irqaction * action;
-
-- for (i = 0 ; i < NR_IRQS ; i++) {
-+ if (i < NR_IRQS) {
- action = irq_desc[i].action;
- if (!action)
- continue;
-@@ -148,10 +148,10 @@ int show_interrupts(struct seq_file *p,
- seq_printf(p, ", %s", action->name);
- }
- seq_putc(p, '\n');
-+ } else if (i == NR_IRQS) {
-+ show_fiq_list(p, v);
-+ seq_printf(p, "Err: %10lu\n", irq_err_count);
- }
--
-- show_fiq_list(p, v);
-- seq_printf(p, "Err: %10lu\n", irq_err_count);
- return 0;
- }
-
---- linux-2.6.0/arch/arm/kernel/irq.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/arm/kernel/irq.c 2003-12-28 23:22:06.000000000 -0800
-@@ -169,11 +169,11 @@ void disable_irq_wake(unsigned int irq)
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i;
-+ int i = *(loff_t *) v;
- struct irqaction * action;
- unsigned long flags;
-
-- for (i = 0 ; i < NR_IRQS ; i++) {
-+ if (i < NR_IRQS) {
- spin_lock_irqsave(&irq_controller_lock, flags);
- action = irq_desc[i].action;
- if (!action)
-@@ -187,12 +187,12 @@ int show_interrupts(struct seq_file *p,
- seq_putc(p, '\n');
- unlock:
- spin_unlock_irqrestore(&irq_controller_lock, flags);
-- }
--
-+ } else if (i == NR_IRQS) {
- #ifdef CONFIG_ARCH_ACORN
-- show_fiq_list(p, v);
-+ show_fiq_list(p, v);
- #endif
-- seq_printf(p, "Err: %10lu\n", irq_err_count);
-+ seq_printf(p, "Err: %10lu\n", irq_err_count);
-+ }
- return 0;
- }
-
---- linux-2.6.0/arch/arm/mach-sa1100/Kconfig 2003-06-14 12:18:52.000000000 -0700
-+++ 25/arch/arm/mach-sa1100/Kconfig 2003-12-28 23:23:06.000000000 -0800
-@@ -304,7 +304,7 @@ config SA1100_YOPY
- depends on ARCH_SA1100
- help
- Say Y here to support the Yopy PDA. Product information at
-- <http://www.yopy.com/>. See Documentation/arm/SA110/Yopy
-+ <http://www.yopy.com/>. See Documentation/arm/SA1100/Yopy
- for more.
-
- config SA1100_STORK
---- linux-2.6.0/arch/arm/Makefile 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/arm/Makefile 2003-12-28 23:21:55.000000000 -0800
-@@ -14,8 +14,6 @@ OBJCOPYFLAGS :=-O binary -R .note -R .co
- GZFLAGS :=-9
- #CFLAGS +=-pipe
-
--CFLAGS :=$(CFLAGS:-O2=-Os)
--
- ifeq ($(CONFIG_FRAME_POINTER),y)
- CFLAGS +=-fno-omit-frame-pointer -mapcs -mno-sched-prolog
- endif
---- linux-2.6.0/arch/cris/kernel/irq.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/cris/kernel/irq.c 2003-12-28 23:22:06.000000000 -0800
-@@ -89,11 +89,11 @@ static struct irqaction *irq_action[NR_I
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i;
-+ int i = *(loff_t *) v;
- struct irqaction * action;
- unsigned long flags;
-
-- for (i = 0; i < NR_IRQS; i++) {
-+ if (i < NR_IRQS) {
- local_irq_save(flags);
- action = irq_action[i];
- if (!action)
---- linux-2.6.0/arch/h8300/Kconfig 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/h8300/Kconfig 2003-12-28 23:21:55.000000000 -0800
-@@ -5,6 +5,10 @@
-
- mainmenu "uClinux/h8300 (w/o MMU) Kernel Configuration"
-
-+config H8300
-+ bool
-+ default y
-+
- config MMU
- bool
- default n
---- linux-2.6.0/arch/h8300/Makefile 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/h8300/Makefile 2003-12-28 23:21:55.000000000 -0800
-@@ -34,7 +34,7 @@ cflags-$(CONFIG_CPU_H8S) := -ms
- ldflags-$(CONFIG_CPU_H8S) := -mh8300self
-
- CFLAGS += $(cflags-y)
--CFLAGS += -mint32 -fno-builtin -Os
-+CFLAGS += -mint32 -fno-builtin
- CFLAGS += -g
- CFLAGS += -D__linux__
- CFLAGS += -DUTS_SYSNAME=\"uClinux\"
---- linux-2.6.0/arch/h8300/platform/h8300h/ints.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/h8300/platform/h8300h/ints.c 2003-12-28 23:22:06.000000000 -0800
-@@ -228,9 +228,9 @@ asmlinkage void process_int(int vec, str
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i;
-+ int i = *(loff_t *) v;
-
-- for (i = 0; i < NR_IRQS; i++) {
-+ if (i < NR_IRQS) {
- if (irq_list[i]) {
- seq_printf(p, "%3d: %10u ",i,irq_list[i]->count);
- seq_printf(p, "%s\n", irq_list[i]->devname);
---- linux-2.6.0/arch/h8300/platform/h8s/ints.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/arch/h8300/platform/h8s/ints.c 2003-12-28 23:22:06.000000000 -0800
-@@ -280,9 +280,9 @@ asmlinkage void process_int(unsigned lon
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i;
-+ int i = *(loff_t *) v;
-
-- for (i = 0; i < NR_IRQS; i++) {
-+ if (i < NR_IRQS) {
- if (irq_list[i]) {
- seq_printf(p, "%3d: %10u ",i,irq_list[i]->count);
- seq_printf(p, "%s\n", irq_list[i]->devname);
---- linux-2.6.0/arch/i386/boot/setup.S 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/boot/setup.S 2003-12-28 23:26:36.000000000 -0800
-@@ -162,7 +162,7 @@ cmd_line_ptr: .long 0 # (Header versio
- # can be located anywhere in
- # low memory 0x10000 or higher.
-
--ramdisk_max: .long MAXMEM-1 # (Header version 0x0203 or later)
-+ramdisk_max: .long __MAXMEM-1 # (Header version 0x0203 or later)
- # The highest safe address for
- # the contents of an initrd
-
---- linux-2.6.0/arch/i386/Kconfig 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/Kconfig 2003-12-28 23:26:36.000000000 -0800
-@@ -115,10 +115,15 @@ config ACPI_SRAT
- default y
- depends on NUMA && (X86_SUMMIT || X86_GENERICARCH)
-
-+config X86_SUMMIT_NUMA
-+ bool
-+ default y
-+ depends on NUMA && (X86_SUMMIT || X86_GENERICARCH)
-+
- config X86_CYCLONE_TIMER
-- bool
-- default y
-- depends on X86_SUMMIT || X86_GENERICARCH
-+ bool
-+ default y
-+ depends on X86_SUMMIT || X86_GENERICARCH
-
- config ES7000_CLUSTERED_APIC
- bool
-@@ -397,6 +402,54 @@ config X86_OOSTORE
- depends on MWINCHIP3D || MWINCHIP2 || MWINCHIPC6
- default y
-
-+config X86_4G
-+ bool "4 GB kernel-space and 4 GB user-space virtual memory support"
-+ help
-+ This option is only useful for systems that have more than 1 GB
-+ of RAM.
-+
-+ The default kernel VM layout leaves 1 GB of virtual memory for
-+ kernel-space mappings, and 3 GB of VM for user-space applications.
-+ This option ups both the kernel-space VM and the user-space VM to
-+ 4 GB.
-+
-+ The cost of this option is additional TLB flushes done at
-+ system-entry points that transition from user-mode into kernel-mode.
-+ I.e. system calls and page faults, and IRQs that interrupt user-mode
-+ code. There's also additional overhead to kernel operations that copy
-+ memory to/from user-space. The overhead from this is hard to tell and
-+ depends on the workload - it can be anything from no visible overhead
-+ to 20-30% overhead. A good rule of thumb is to count with a runtime
-+ overhead of 20%.
-+
-+ The upside is the much increased kernel-space VM, which more than
-+ quadruples the maximum amount of RAM supported. Kernels compiled with
-+ this option boot on 64GB of RAM and still have more than 3.1 GB of
-+ 'lowmem' left. Another bonus is that highmem IO bouncing decreases,
-+ if used with drivers that still use bounce-buffers.
-+
-+ There's also a 33% increase in user-space VM size - database
-+ applications might see a boost from this.
-+
-+ But the cost of the TLB flushes and the runtime overhead has to be
-+ weighed against the bonuses offered by the larger VM spaces. The
-+ dividing line depends on the actual workload - there might be 4 GB
-+ systems that benefit from this option. Systems with less than 4 GB
-+ of RAM will rarely see a benefit from this option - but it's not
-+ out of question, the exact circumstances have to be considered.
-+
-+config X86_SWITCH_PAGETABLES
-+ def_bool X86_4G
-+
-+config X86_4G_VM_LAYOUT
-+ def_bool X86_4G
-+
-+config X86_UACCESS_INDIRECT
-+ def_bool X86_4G
-+
-+config X86_HIGH_ENTRY
-+ def_bool X86_4G
-+
- config HPET_TIMER
- bool "HPET Timer Support"
- help
-@@ -784,6 +837,25 @@ config MTRR
-
- See <file:Documentation/mtrr.txt> for more information.
-
-+config EFI
-+ bool "Boot from EFI support (EXPERIMENTAL)"
-+ depends on ACPI
-+ default n
-+ ---help---
-+
-+ This enables the the kernel to boot on EFI platforms using
-+ system configuration information passed to it from the firmware.
-+ This also enables the kernel to use any EFI runtime services that are
-+ available (such as the EFI variable services).
-+
-+ This option is only useful on systems that have EFI firmware
-+ and will result in a kernel image that is ~8k larger. In addition,
-+ you must use the latest ELILO loader available at
-+ ftp.hpl.hp.com/pub/linux-ia64/ in order to take advantage of kernel
-+ initialization using EFI information (neither GRUB nor LILO know
-+ anything about EFI). However, even with this option, the resultant
-+ kernel should continue to boot on existing non-EFI platforms.
-+
- config HAVE_DEC_LOCK
- bool
- depends on (SMP || PREEMPT) && X86_CMPXCHG
-@@ -793,7 +865,7 @@ config HAVE_DEC_LOCK
- # Summit needs it only when NUMA is on
- config BOOT_IOREMAP
- bool
-- depends on ((X86_SUMMIT || X86_GENERICARCH) && NUMA)
-+ depends on (((X86_SUMMIT || X86_GENERICARCH) && NUMA) || (X86 && EFI))
- default y
-
- endmenu
-@@ -1030,6 +1102,25 @@ config PCI_DIRECT
- depends on PCI && ((PCI_GODIRECT || PCI_GOANY) || X86_VISWS)
- default y
-
-+config PCI_USE_VECTOR
-+ bool "Vector-based interrupt indexing"
-+ depends on X86_LOCAL_APIC
-+ default n
-+ help
-+ This replaces the current existing IRQ-based index interrupt scheme
-+ with the vector-base index scheme. The advantages of vector base
-+ over IRQ base are listed below:
-+ 1) Support MSI implementation.
-+ 2) Support future IOxAPIC hotplug
-+
-+ Note that this enables MSI, Message Signaled Interrupt, on all
-+ MSI capable device functions detected if users also install the
-+ MSI patch. Message Signal Interrupt enables an MSI-capable
-+ hardware device to send an inbound Memory Write on its PCI bus
-+ instead of asserting IRQ signal on device IRQ pin.
-+
-+ If you don't know what to do here, say N.
-+
- source "drivers/pci/Kconfig"
-
- config ISA
-@@ -1187,6 +1278,15 @@ config DEBUG_PAGEALLOC
- This results in a large slowdown, but helps to find certain types
- of memory corruptions.
-
-+config SPINLINE
-+ bool "Spinlock inlining"
-+ depends on DEBUG_KERNEL
-+ help
-+ This will change spinlocks from out of line to inline, making them
-+ account cost to the callers in readprofile, rather than the lock
-+ itself (as ".text.lock.filename"). This can be helpful for finding
-+ the callers of locks.
-+
- config DEBUG_HIGHMEM
- bool "Highmem debugging"
- depends on DEBUG_KERNEL && HIGHMEM
-@@ -1203,20 +1303,208 @@ config DEBUG_INFO
- Say Y here only if you plan to use gdb to debug the kernel.
- If you don't debug the kernel, you can say N.
-
-+config LOCKMETER
-+ bool "Kernel lock metering"
-+ depends on SMP
-+ help
-+ Say Y to enable kernel lock metering, which adds overhead to SMP locks,
-+ but allows you to see various statistics using the lockstat command.
-+
- config DEBUG_SPINLOCK_SLEEP
- bool "Sleep-inside-spinlock checking"
- help
- If you say Y here, various routines which may sleep will become very
- noisy if they are called with a spinlock held.
-
-+config KGDB
-+ bool "Include kgdb kernel debugger"
-+ depends on DEBUG_KERNEL
-+ help
-+ If you say Y here, the system will be compiled with the debug
-+ option (-g) and a debugging stub will be included in the
-+ kernel. This stub communicates with gdb on another (host)
-+ computer via a serial port. The host computer should have
-+ access to the kernel binary file (vmlinux) and a serial port
-+ that is connected to the target machine. Gdb can be made to
-+ configure the serial port or you can use stty and setserial to
-+ do this. See the 'target' command in gdb. This option also
-+ configures in the ability to request a breakpoint early in the
-+ boot process. To request the breakpoint just include 'kgdb'
-+ as a boot option when booting the target machine. The system
-+ will then break as soon as it looks at the boot options. This
-+ option also installs a breakpoint in panic and sends any
-+ kernel faults to the debugger. For more information see the
-+ Documentation/i386/kgdb.txt file.
-+
-+choice
-+ depends on KGDB
-+ prompt "Debug serial port BAUD"
-+ default KGDB_115200BAUD
-+ help
-+ Gdb and the kernel stub need to agree on the baud rate to be
-+ used. Some systems (x86 family at this writing) allow this to
-+ be configured.
-+
-+config KGDB_9600BAUD
-+ bool "9600"
-+
-+config KGDB_19200BAUD
-+ bool "19200"
-+
-+config KGDB_38400BAUD
-+ bool "38400"
-+
-+config KGDB_57600BAUD
-+ bool "57600"
-+
-+config KGDB_115200BAUD
-+ bool "115200"
-+endchoice
-+
-+config KGDB_PORT
-+ hex "hex I/O port address of the debug serial port"
-+ depends on KGDB
-+ default 3f8
-+ help
-+ Some systems (x86 family at this writing) allow the port
-+ address to be configured. The number entered is assumed to be
-+ hex, don't put 0x in front of it. The standard address are:
-+ COM1 3f8 , irq 4 and COM2 2f8 irq 3. Setserial /dev/ttySx
-+ will tell you what you have. It is good to test the serial
-+ connection with a live system before trying to debug.
-+
-+config KGDB_IRQ
-+ int "IRQ of the debug serial port"
-+ depends on KGDB
-+ default 4
-+ help
-+ This is the irq for the debug port. If everything is working
-+ correctly and the kernel has interrupts on a control C to the
-+ port should cause a break into the kernel debug stub.
-+
-+config DEBUG_INFO
-+ bool
-+ depends on KGDB
-+ default y
-+
-+config KGDB_MORE
-+ bool "Add any additional compile options"
-+ depends on KGDB
-+ default n
-+ help
-+ Saying yes here turns on the ability to enter additional
-+ compile options.
-+
-+
-+config KGDB_OPTIONS
-+ depends on KGDB_MORE
-+ string "Additional compile arguments"
-+ default "-O1"
-+ help
-+ This option allows you enter additional compile options for
-+ the whole kernel compile. Each platform will have a default
-+ that seems right for it. For example on PPC "-ggdb -O1", and
-+ for i386 "-O1". Note that by configuring KGDB "-g" is already
-+ turned on. In addition, on i386 platforms
-+ "-fomit-frame-pointer" is deleted from the standard compile
-+ options.
-+
-+config NO_KGDB_CPUS
-+ int "Number of CPUs"
-+ depends on KGDB && SMP
-+ default NR_CPUS
-+ help
-+
-+ This option sets the number of cpus for kgdb ONLY. It is used
-+ to prune some internal structures so they look "nice" when
-+ displayed with gdb. This is to overcome possibly larger
-+ numbers that may have been entered above. Enter the real
-+ number to get nice clean kgdb_info displays.
-+
-+config KGDB_TS
-+ bool "Enable kgdb time stamp macros?"
-+ depends on KGDB
-+ default n
-+ help
-+ Kgdb event macros allow you to instrument your code with calls
-+ to the kgdb event recording function. The event log may be
-+ examined with gdb at a break point. Turning on this
-+ capability also allows you to choose how many events to
-+ keep. Kgdb always keeps the lastest events.
-+
-+choice
-+ depends on KGDB_TS
-+ prompt "Max number of time stamps to save?"
-+ default KGDB_TS_128
-+
-+config KGDB_TS_64
-+ bool "64"
-+
-+config KGDB_TS_128
-+ bool "128"
-+
-+config KGDB_TS_256
-+ bool "256"
-+
-+config KGDB_TS_512
-+ bool "512"
-+
-+config KGDB_TS_1024
-+ bool "1024"
-+
-+endchoice
-+
-+config STACK_OVERFLOW_TEST
-+ bool "Turn on kernel stack overflow testing?"
-+ depends on KGDB
-+ default n
-+ help
-+ This option enables code in the front line interrupt handlers
-+ to check for kernel stack overflow on interrupts and system
-+ calls. This is part of the kgdb code on x86 systems.
-+
-+config KGDB_CONSOLE
-+ bool "Enable serial console thru kgdb port"
-+ depends on KGDB
-+ default n
-+ help
-+ This option enables the command line "console=kgdb" option.
-+ When the system is booted with this option in the command line
-+ all kernel printk output is sent to gdb (as well as to other
-+ consoles). For this to work gdb must be connected. For this
-+ reason, this command line option will generate a breakpoint if
-+ gdb has not yet connected. After the gdb continue command is
-+ given all pent up console output will be printed by gdb on the
-+ host machine. Neither this option, nor KGDB require the
-+ serial driver to be configured.
-+
-+config KGDB_SYSRQ
-+ bool "Turn on SysRq 'G' command to do a break?"
-+ depends on KGDB
-+ default y
-+ help
-+ This option includes an option in the SysRq code that allows
-+ you to enter SysRq G which generates a breakpoint to the KGDB
-+ stub. This will work if the keyboard is alive and can
-+ interrupt the system. Because of constraints on when the
-+ serial port interrupt can be enabled, this code may allow you
-+ to interrupt the system before the serial port control C is
-+ available. Just say yes here.
-+
- config FRAME_POINTER
- bool "Compile the kernel with frame pointers"
-+ default KGDB
- help
- If you say Y here the resulting kernel image will be slightly larger
- and slower, but it will give very useful debugging information.
- If you don't debug the kernel, you can say N, but we may not be able
- to solve problems without frame pointers.
-
-+config MAGIC_SYSRQ
-+ bool
-+ depends on KGDB_SYSRQ
-+ default y
-+
- config X86_EXTRA_IRQS
- bool
- depends on X86_LOCAL_APIC || X86_VOYAGER
---- linux-2.6.0/arch/i386/kernel/acpi/boot.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/i386/kernel/acpi/boot.c 2003-12-28 23:21:57.000000000 -0800
-@@ -26,6 +26,7 @@
- #include <linux/init.h>
- #include <linux/config.h>
- #include <linux/acpi.h>
-+#include <linux/efi.h>
- #include <asm/pgalloc.h>
- #include <asm/io_apic.h>
- #include <asm/apic.h>
-@@ -40,9 +41,8 @@
-
- #define PREFIX "ACPI: "
-
--extern int acpi_disabled;
--extern int acpi_irq;
--extern int acpi_ht;
-+int acpi_noirq __initdata = 0; /* skip ACPI IRQ initialization */
-+int acpi_ht __initdata = 1; /* enable HT */
-
- int acpi_lapic = 0;
- int acpi_ioapic = 0;
-@@ -249,29 +249,66 @@ acpi_parse_nmi_src (
-
- #ifdef CONFIG_ACPI_BUS
- /*
-- * Set specified PIC IRQ to level triggered mode.
-+ * "acpi_pic_sci=level" (current default)
-+ * programs the PIC-mode SCI to Level Trigger.
-+ * (NO-OP if the BIOS set Level Trigger already)
-+ *
-+ * If a PIC-mode SCI is not recogznied or gives spurious IRQ7's
-+ * it may require Edge Trigger -- use "acpi_pic_sci=edge"
-+ * (NO-OP if the BIOS set Edge Trigger already)
- *
- * Port 0x4d0-4d1 are ECLR1 and ECLR2, the Edge/Level Control Registers
- * for the 8259 PIC. bit[n] = 1 means irq[n] is Level, otherwise Edge.
- * ECLR1 is IRQ's 0-7 (IRQ 0, 1, 2 must be 0)
- * ECLR2 is IRQ's 8-15 (IRQ 8, 13 must be 0)
-- *
-- * As the BIOS should have done this for us,
-- * print a warning if the IRQ wasn't already set to level.
- */
-
--void acpi_pic_set_level_irq(unsigned int irq)
-+static int __initdata acpi_pic_sci_trigger; /* 0: level, 1: edge */
-+
-+void __init
-+acpi_pic_sci_set_trigger(unsigned int irq)
- {
- unsigned char mask = 1 << (irq & 7);
- unsigned int port = 0x4d0 + (irq >> 3);
- unsigned char val = inb(port);
-
-+
-+ printk(PREFIX "IRQ%d SCI:", irq);
- if (!(val & mask)) {
-- printk(KERN_WARNING PREFIX "IRQ %d was Edge Triggered, "
-- "setting to Level Triggerd\n", irq);
-- outb(val | mask, port);
-+ printk(" Edge");
-+
-+ if (!acpi_pic_sci_trigger) {
-+ printk(" set to Level");
-+ outb(val | mask, port);
-+ }
-+ } else {
-+ printk(" Level");
-+
-+ if (acpi_pic_sci_trigger) {
-+ printk(" set to Edge");
-+ outb(val | mask, port);
-+ }
-+ }
-+ printk(" Trigger.\n");
-+}
-+
-+int __init
-+acpi_pic_sci_setup(char *str)
-+{
-+ while (str && *str) {
-+ if (strncmp(str, "level", 5) == 0)
-+ acpi_pic_sci_trigger = 0; /* force level trigger */
-+ if (strncmp(str, "edge", 4) == 0)
-+ acpi_pic_sci_trigger = 1; /* force edge trigger */
-+ str = strchr(str, ',');
-+ if (str)
-+ str += strspn(str, ", \t");
- }
-+ return 1;
- }
-+
-+__setup("acpi_pic_sci=", acpi_pic_sci_setup);
-+
- #endif /* CONFIG_ACPI_BUS */
-
-
-@@ -326,11 +363,48 @@ static int __init acpi_parse_hpet(unsign
- }
- #endif
-
-+/* detect the location of the ACPI PM Timer */
-+#ifdef CONFIG_X86_PM_TIMER
-+extern u32 pmtmr_ioport;
-+
-+static int __init acpi_parse_fadt(unsigned long phys, unsigned long size)
-+{
-+ struct fadt_descriptor_rev2 *fadt =0;
-+
-+ fadt = (struct fadt_descriptor_rev2*) __acpi_map_table(phys,size);
-+ if(!fadt) {
-+ printk(KERN_WARNING PREFIX "Unable to map FADT\n");
-+ return 0;
-+ }
-+
-+ if (fadt->revision >= FADT2_REVISION_ID) {
-+ /* FADT rev. 2 */
-+ if (fadt->xpm_tmr_blk.address_space_id != ACPI_ADR_SPACE_SYSTEM_IO)
-+ return 0;
-+
-+ pmtmr_ioport = fadt->xpm_tmr_blk.address;
-+ } else {
-+ /* FADT rev. 1 */
-+ pmtmr_ioport = fadt->V1_pm_tmr_blk;
-+ }
-+ if (pmtmr_ioport)
-+ printk(KERN_INFO PREFIX "PM-Timer IO Port: %#x\n", pmtmr_ioport);
-+ return 0;
-+}
-+#endif
-+
-+
- unsigned long __init
- acpi_find_rsdp (void)
- {
- unsigned long rsdp_phys = 0;
-
-+ if (efi_enabled) {
-+ if (efi.acpi20)
-+ return __pa(efi.acpi20);
-+ else if (efi.acpi)
-+ return __pa(efi.acpi);
-+ }
- /*
- * Scan memory looking for the RSDP signature. First search EBDA (low
- * memory) paragraphs and then search upper memory (E0000-FFFFF).
-@@ -380,8 +454,10 @@ acpi_boot_init (void)
- * Initialize the ACPI boot-time table parser.
- */
- result = acpi_table_init();
-- if (result)
-+ if (result) {
-+ acpi_disabled = 1;
- return result;
-+ }
-
- result = acpi_blacklisted();
- if (result) {
-@@ -462,7 +538,7 @@ acpi_boot_init (void)
- * If MPS is present, it will handle them,
- * otherwise the system will stay in PIC mode
- */
-- if (acpi_disabled || !acpi_irq) {
-+ if (acpi_disabled || acpi_noirq) {
- return 1;
- }
-
-@@ -504,6 +580,8 @@ acpi_boot_init (void)
-
- acpi_irq_model = ACPI_IRQ_MODEL_IOAPIC;
-
-+ acpi_irq_balance_set(NULL);
-+
- acpi_ioapic = 1;
-
- #endif /* CONFIG_X86_IO_APIC && CONFIG_ACPI_INTERPRETER */
-@@ -519,5 +597,9 @@ acpi_boot_init (void)
- acpi_table_parse(ACPI_HPET, acpi_parse_hpet);
- #endif
-
-+#ifdef CONFIG_X86_PM_TIMER
-+ acpi_table_parse(ACPI_FADT, acpi_parse_fadt);
-+#endif
-+
- return 0;
- }
---- linux-2.6.0/arch/i386/kernel/asm-offsets.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/asm-offsets.c 2003-12-28 23:26:36.000000000 -0800
-@@ -4,9 +4,11 @@
- * to extract and format the required data.
- */
-
-+#include <linux/sched.h>
- #include <linux/signal.h>
- #include <asm/ucontext.h>
- #include "sigframe.h"
-+#include <asm/fixmap.h>
-
- #define DEFINE(sym, val) \
- asm volatile("\n->" #sym " %0 " #val : : "i" (val))
-@@ -28,4 +30,17 @@ void foo(void)
-
- DEFINE(RT_SIGFRAME_sigcontext,
- offsetof (struct rt_sigframe, uc.uc_mcontext));
-+ DEFINE(TI_task, offsetof (struct thread_info, task));
-+ DEFINE(TI_exec_domain, offsetof (struct thread_info, exec_domain));
-+ DEFINE(TI_flags, offsetof (struct thread_info, flags));
-+ DEFINE(TI_preempt_count, offsetof (struct thread_info, preempt_count));
-+ DEFINE(TI_addr_limit, offsetof (struct thread_info, addr_limit));
-+ DEFINE(TI_real_stack, offsetof (struct thread_info, real_stack));
-+ DEFINE(TI_virtual_stack, offsetof (struct thread_info, virtual_stack));
-+ DEFINE(TI_user_pgd, offsetof (struct thread_info, user_pgd));
-+
-+ DEFINE(FIX_ENTRY_TRAMPOLINE_0_addr, __fix_to_virt(FIX_ENTRY_TRAMPOLINE_0));
-+ DEFINE(FIX_VSYSCALL_addr, __fix_to_virt(FIX_VSYSCALL));
-+ DEFINE(PAGE_SIZE_asm, PAGE_SIZE);
-+ DEFINE(task_thread_db7, offsetof (struct task_struct, thread.debugreg[7]));
- }
---- linux-2.6.0/arch/i386/kernel/cpu/common.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/cpu/common.c 2003-12-28 23:26:36.000000000 -0800
-@@ -510,16 +510,20 @@ void __init cpu_init (void)
- BUG();
- enter_lazy_tlb(&init_mm, current);
-
-- load_esp0(t, thread->esp0);
-+ load_esp0(t, thread);
- set_tss_desc(cpu,t);
- cpu_gdt_table[cpu][GDT_ENTRY_TSS].b &= 0xfffffdff;
- load_TR_desc();
-- load_LDT(&init_mm.context);
-+ if (cpu)
-+ load_LDT(&init_mm.context);
-
- /* Set up doublefault TSS pointer in the GDT */
- __set_tss_desc(cpu, GDT_ENTRY_DOUBLEFAULT_TSS, &doublefault_tss);
- cpu_gdt_table[cpu][GDT_ENTRY_DOUBLEFAULT_TSS].b &= 0xfffffdff;
-
-+ if (cpu)
-+ trap_init_virtual_GDT();
-+
- /* Clear %fs and %gs. */
- asm volatile ("xorl %eax, %eax; movl %eax, %fs; movl %eax, %gs");
-
---- linux-2.6.0/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c 2003-09-08 13:58:55.000000000 -0700
-+++ 25/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c 2003-12-28 23:22:07.000000000 -0800
-@@ -73,6 +73,16 @@ static struct cpufreq_frequency_table op
- { .frequency = CPUFREQ_TABLE_END }
- };
-
-+/* Ultra Low Voltage Intel Pentium M processor 1000MHz */
-+static struct cpufreq_frequency_table op_1000[] =
-+ {
-+ OP(600, 844),
-+ OP(800, 972),
-+ OP(900, 988),
-+ OP(1000, 1004),
-+ { .frequency = CPUFREQ_TABLE_END }
-+ };
-+
- /* Low Voltage Intel Pentium M processor 1.10GHz */
- static struct cpufreq_frequency_table op_1100[] =
- {
-@@ -165,6 +175,7 @@ static struct cpufreq_frequency_table op
- static const struct cpu_model models[] =
- {
- _CPU( 900, " 900"),
-+ CPU(1000),
- CPU(1100),
- CPU(1200),
- CPU(1300),
---- linux-2.6.0/arch/i386/kernel/cpu/intel.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/i386/kernel/cpu/intel.c 2003-12-28 23:26:36.000000000 -0800
-@@ -1,5 +1,7 @@
-+#include <linux/config.h>
- #include <linux/init.h>
- #include <linux/kernel.h>
-+
- #include <linux/string.h>
- #include <linux/bitops.h>
- #include <linux/smp.h>
-@@ -8,10 +10,15 @@
- #include <asm/processor.h>
- #include <asm/msr.h>
- #include <asm/uaccess.h>
-+#include <asm/desc.h>
-
- #include "cpu.h"
-
--extern int trap_init_f00f_bug(void);
-+#ifdef CONFIG_X86_LOCAL_APIC
-+#include <asm/mpspec.h>
-+#include <asm/apic.h>
-+#include <mach_apic.h>
-+#endif
-
- #ifdef CONFIG_X86_INTEL_USERCOPY
- /*
-@@ -157,7 +164,7 @@ static void __init init_intel(struct cpu
-
- c->f00f_bug = 1;
- if ( !f00f_workaround_enabled ) {
-- trap_init_f00f_bug();
-+ trap_init_virtual_IDT();
- printk(KERN_NOTICE "Intel Pentium with F0 0F bug - workaround enabled.\n");
- f00f_workaround_enabled = 1;
- }
-@@ -240,6 +247,12 @@ static void __init init_intel(struct cpu
- /* SEP CPUID bug: Pentium Pro reports SEP but doesn't have it until model 3 mask 3 */
- if ((c->x86<<8 | c->x86_model<<4 | c->x86_mask) < 0x633)
- clear_bit(X86_FEATURE_SEP, c->x86_capability);
-+ /*
-+ * FIXME: SEP is disabled for 4G/4G for now:
-+ */
-+#ifdef CONFIG_X86_HIGH_ENTRY
-+ clear_bit(X86_FEATURE_SEP, c->x86_capability);
-+#endif
-
- /* Names for the Pentium II/Celeron processors
- detectable only by also checking the cache size.
-@@ -277,6 +290,7 @@ static void __init init_intel(struct cpu
- extern int phys_proc_id[NR_CPUS];
-
- u32 eax, ebx, ecx, edx;
-+ int index_lsb, index_msb, tmp;
- int cpu = smp_processor_id();
-
- cpuid(1, &eax, &ebx, &ecx, &edx);
-@@ -285,6 +299,8 @@ static void __init init_intel(struct cpu
- if (smp_num_siblings == 1) {
- printk(KERN_INFO "CPU: Hyper-Threading is disabled\n");
- } else if (smp_num_siblings > 1 ) {
-+ index_lsb = 0;
-+ index_msb = 31;
- /*
- * At this point we only support two siblings per
- * processor package.
-@@ -295,13 +311,19 @@ static void __init init_intel(struct cpu
- smp_num_siblings = 1;
- goto too_many_siblings;
- }
-- /* cpuid returns the value latched in the HW at reset,
-- * not the APIC ID register's value. For any box
-- * whose BIOS changes APIC IDs, like clustered APIC
-- * systems, we must use hard_smp_processor_id.
-- * See Intel's IA-32 SW Dev's Manual Vol2 under CPUID.
-- */
-- phys_proc_id[cpu] = hard_smp_processor_id() & ~(smp_num_siblings - 1);
-+ tmp = smp_num_siblings;
-+ while ((tmp & 1) == 0) {
-+ tmp >>=1 ;
-+ index_lsb++;
-+ }
-+ tmp = smp_num_siblings;
-+ while ((tmp & 0x80000000 ) == 0) {
-+ tmp <<=1 ;
-+ index_msb--;
-+ }
-+ if (index_lsb != index_msb )
-+ index_msb++;
-+ phys_proc_id[cpu] = phys_pkg_id((ebx >> 24) & 0xFF, index_msb);
-
- printk(KERN_INFO "CPU: Physical Processor ID: %d\n",
- phys_proc_id[cpu]);
---- linux-2.6.0/arch/i386/kernel/dmi_scan.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/i386/kernel/dmi_scan.c 2003-12-28 23:21:33.000000000 -0800
-@@ -6,6 +6,7 @@
- #include <linux/module.h>
- #include <linux/apm_bios.h>
- #include <linux/slab.h>
-+#include <asm/acpi.h>
- #include <asm/io.h>
- #include <linux/pm.h>
- #include <asm/system.h>
-@@ -16,6 +17,7 @@ EXPORT_SYMBOL(dmi_broken);
-
- int is_sony_vaio_laptop;
- int is_unsafe_smbus;
-+int es7000_plat = 0;
-
- struct dmi_header
- {
-@@ -504,6 +506,7 @@ static __init int print_if_true(struct d
- }
-
-
-+#ifdef CONFIG_ACPI_BOOT
- extern int acpi_disabled, acpi_force;
-
- static __init __attribute__((unused)) int acpi_disable(struct dmi_blacklist *d)
-@@ -518,8 +521,6 @@ static __init __attribute__((unused)) in
- return 0;
- }
-
--
--#ifdef CONFIG_ACPI_BOOT
- extern int acpi_ht;
-
- /*
-@@ -542,10 +543,8 @@ static __init __attribute__((unused)) in
- #ifdef CONFIG_ACPI_PCI
- static __init int disable_acpi_pci(struct dmi_blacklist *d)
- {
-- extern __init void pci_disable_acpi(void) ;
--
- printk(KERN_NOTICE "%s detected: force use of pci=noacpi\n", d->ident);
-- pci_disable_acpi();
-+ acpi_noirq_set();
- return 0;
- }
- #endif
-@@ -1011,6 +1010,7 @@ static __init void dmi_check_blacklist(v
- printk(KERN_NOTICE "ACPI disabled because your bios is from %s and too old\n", s);
- printk(KERN_NOTICE "You can enable it with acpi=force\n");
- acpi_disabled = 1;
-+ acpi_ht = 0;
- }
- }
- }
---- linux-2.6.0/arch/i386/kernel/doublefault.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/doublefault.c 2003-12-28 23:26:36.000000000 -0800
-@@ -7,12 +7,13 @@
- #include <asm/uaccess.h>
- #include <asm/pgtable.h>
- #include <asm/desc.h>
-+#include <asm/fixmap.h>
-
- #define DOUBLEFAULT_STACKSIZE (1024)
- static unsigned long doublefault_stack[DOUBLEFAULT_STACKSIZE];
- #define STACK_START (unsigned long)(doublefault_stack+DOUBLEFAULT_STACKSIZE)
-
--#define ptr_ok(x) ((x) > 0xc0000000 && (x) < 0xc1000000)
-+#define ptr_ok(x) (((x) > __PAGE_OFFSET && (x) < (__PAGE_OFFSET + 0x01000000)) || ((x) >= FIXADDR_START))
-
- static void doublefault_fn(void)
- {
-@@ -38,8 +39,8 @@ static void doublefault_fn(void)
-
- printk("eax = %08lx, ebx = %08lx, ecx = %08lx, edx = %08lx\n",
- t->eax, t->ebx, t->ecx, t->edx);
-- printk("esi = %08lx, edi = %08lx\n",
-- t->esi, t->edi);
-+ printk("esi = %08lx, edi = %08lx, ebp = %08lx\n",
-+ t->esi, t->edi, t->ebp);
- }
- }
-
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/arch/i386/kernel/efi.c 2003-12-28 23:21:45.000000000 -0800
-@@ -0,0 +1,645 @@
-+/*
-+ * Extensible Firmware Interface
-+ *
-+ * Based on Extensible Firmware Interface Specification version 1.0
-+ *
-+ * Copyright (C) 1999 VA Linux Systems
-+ * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
-+ * Copyright (C) 1999-2002 Hewlett-Packard Co.
-+ * David Mosberger-Tang <davidm@hpl.hp.com>
-+ * Stephane Eranian <eranian@hpl.hp.com>
-+ *
-+ * All EFI Runtime Services are not implemented yet as EFI only
-+ * supports physical mode addressing on SoftSDV. This is to be fixed
-+ * in a future version. --drummond 1999-07-20
-+ *
-+ * Implemented EFI runtime services and virtual mode calls. --davidm
-+ *
-+ * Goutham Rao: <goutham.rao@intel.com>
-+ * Skip non-WB memory and ignore empty memory ranges.
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/mm.h>
-+#include <linux/types.h>
-+#include <linux/time.h>
-+#include <linux/spinlock.h>
-+#include <linux/bootmem.h>
-+#include <linux/ioport.h>
-+#include <linux/proc_fs.h>
-+#include <linux/efi.h>
-+
-+#include <asm/setup.h>
-+#include <asm/io.h>
-+#include <asm/page.h>
-+#include <asm/pgtable.h>
-+#include <asm/processor.h>
-+#include <asm/desc.h>
-+#include <asm/pgalloc.h>
-+#include <asm/tlbflush.h>
-+
-+#define EFI_DEBUG 0
-+#define PFX "EFI: "
-+
-+extern efi_status_t asmlinkage efi_call_phys(void *, ...);
-+
-+struct efi efi;
-+struct efi efi_phys __initdata;
-+struct efi_memory_map memmap __initdata;
-+
-+/*
-+ * We require an early boot_ioremap mapping mechanism initially
-+ */
-+extern void * boot_ioremap(unsigned long, unsigned long);
-+
-+/*
-+ * efi_dir is allocated here, but the directory isn't created
-+ * here, as proc_mkdir() doesn't work this early in the bootup
-+ * process. Therefore, each module, like efivars, must test for
-+ * if (!efi_dir) efi_dir = proc_mkdir("efi", NULL);
-+ * prior to creating their own entries under /proc/efi.
-+ */
-+#ifdef CONFIG_PROC_FS
-+struct proc_dir_entry *efi_dir;
-+#endif
-+
-+
-+/*
-+ * To make EFI call EFI runtime service in physical addressing mode we need
-+ * prelog/epilog before/after the invocation to disable interrupt, to
-+ * claim EFI runtime service handler exclusively and to duplicate a memory in
-+ * low memory space say 0 - 3G.
-+ */
-+
-+static unsigned long efi_rt_eflags;
-+static spinlock_t efi_rt_lock = SPIN_LOCK_UNLOCKED;
-+static pgd_t efi_bak_pg_dir_pointer[2];
-+
-+static void efi_call_phys_prelog(void)
-+{
-+ unsigned long cr4;
-+ unsigned long temp;
-+
-+ spin_lock(&efi_rt_lock);
-+ local_irq_save(efi_rt_eflags);
-+
-+ /*
-+ * If I don't have PSE, I should just duplicate two entries in page
-+ * directory. If I have PSE, I just need to duplicate one entry in
-+ * page directory.
-+ */
-+ __asm__ __volatile__("movl %%cr4, %0":"=r"(cr4));
-+
-+ if (cr4 & X86_CR4_PSE) {
-+ efi_bak_pg_dir_pointer[0].pgd =
-+ swapper_pg_dir[pgd_index(0)].pgd;
-+ swapper_pg_dir[0].pgd =
-+ swapper_pg_dir[pgd_index(PAGE_OFFSET)].pgd;
-+ } else {
-+ efi_bak_pg_dir_pointer[0].pgd =
-+ swapper_pg_dir[pgd_index(0)].pgd;
-+ efi_bak_pg_dir_pointer[1].pgd =
-+ swapper_pg_dir[pgd_index(0x400000)].pgd;
-+ swapper_pg_dir[pgd_index(0)].pgd =
-+ swapper_pg_dir[pgd_index(PAGE_OFFSET)].pgd;
-+ temp = PAGE_OFFSET + 0x400000;
-+ swapper_pg_dir[pgd_index(0x400000)].pgd =
-+ swapper_pg_dir[pgd_index(temp)].pgd;
-+ }
-+
-+ /*
-+ * After the lock is released, the original page table is restored.
-+ */
-+ local_flush_tlb();
-+
-+ cpu_gdt_descr[0].address = __pa(cpu_gdt_descr[0].address);
-+ __asm__ __volatile__("lgdt %0":"=m"
-+ (*(struct Xgt_desc_struct *) __pa(&cpu_gdt_descr[0])));
-+}
-+
-+static void efi_call_phys_epilog(void)
-+{
-+ unsigned long cr4;
-+
-+ cpu_gdt_descr[0].address =
-+ (unsigned long) __va(cpu_gdt_descr[0].address);
-+ __asm__ __volatile__("lgdt %0":"=m"(cpu_gdt_descr));
-+ __asm__ __volatile__("movl %%cr4, %0":"=r"(cr4));
-+
-+ if (cr4 & X86_CR4_PSE) {
-+ swapper_pg_dir[pgd_index(0)].pgd =
-+ efi_bak_pg_dir_pointer[0].pgd;
-+ } else {
-+ swapper_pg_dir[pgd_index(0)].pgd =
-+ efi_bak_pg_dir_pointer[0].pgd;
-+ swapper_pg_dir[pgd_index(0x400000)].pgd =
-+ efi_bak_pg_dir_pointer[1].pgd;
-+ }
-+
-+ /*
-+ * After the lock is released, the original page table is restored.
-+ */
-+ local_flush_tlb();
-+
-+ local_irq_restore(efi_rt_eflags);
-+ spin_unlock(&efi_rt_lock);
-+}
-+
-+static efi_status_t
-+phys_efi_set_virtual_address_map(unsigned long memory_map_size,
-+ unsigned long descriptor_size,
-+ u32 descriptor_version,
-+ efi_memory_desc_t *virtual_map)
-+{
-+ efi_status_t status;
-+
-+ efi_call_phys_prelog();
-+ status = efi_call_phys(efi_phys.set_virtual_address_map,
-+ memory_map_size, descriptor_size,
-+ descriptor_version, virtual_map);
-+ efi_call_phys_epilog();
-+ return status;
-+}
-+
-+efi_status_t
-+phys_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc)
-+{
-+ efi_status_t status;
-+
-+ efi_call_phys_prelog();
-+ status = efi_call_phys(efi_phys.get_time, tm, tc);
-+ efi_call_phys_epilog();
-+ return status;
-+}
-+
-+int inline efi_set_rtc_mmss(unsigned long nowtime)
-+{
-+ int real_seconds, real_minutes;
-+ efi_status_t status;
-+ efi_time_t eft;
-+ efi_time_cap_t cap;
-+
-+ spin_lock(&efi_rt_lock);
-+ status = efi.get_time(&eft, &cap);
-+ spin_unlock(&efi_rt_lock);
-+ if (status != EFI_SUCCESS)
-+ panic("Ooops, efitime: can't read time!\n");
-+ real_seconds = nowtime % 60;
-+ real_minutes = nowtime / 60;
-+
-+ if (((abs(real_minutes - eft.minute) + 15)/30) & 1)
-+ real_minutes += 30;
-+ real_minutes %= 60;
-+
-+ eft.minute = real_minutes;
-+ eft.second = real_seconds;
-+
-+ if (status != EFI_SUCCESS) {
-+ printk("Ooops: efitime: can't read time!\n");
-+ return -1;
-+ }
-+ return 0;
-+}
-+/*
-+ * This should only be used during kernel init and before runtime
-+ * services have been remapped, therefore, we'll need to call in physical
-+ * mode. Note, this call isn't used later, so mark it __init.
-+ */
-+unsigned long inline __init efi_get_time(void)
-+{
-+ efi_status_t status;
-+ efi_time_t eft;
-+ efi_time_cap_t cap;
-+
-+ status = phys_efi_get_time(&eft, &cap);
-+ if (status != EFI_SUCCESS)
-+ printk("Oops: efitime: can't read time status: 0x%lx\n",status);
-+
-+ return mktime(eft.year, eft.month, eft.day, eft.hour,
-+ eft.minute, eft.second);
-+}
-+
-+int is_available_memory(efi_memory_desc_t * md)
-+{
-+ if (!(md->attribute & EFI_MEMORY_WB))
-+ return 0;
-+
-+ switch (md->type) {
-+ case EFI_LOADER_CODE:
-+ case EFI_LOADER_DATA:
-+ case EFI_BOOT_SERVICES_CODE:
-+ case EFI_BOOT_SERVICES_DATA:
-+ case EFI_CONVENTIONAL_MEMORY:
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+/*
-+ * We need to map the EFI memory map again after paging_init().
-+ */
-+void __init efi_map_memmap(void)
-+{
-+ memmap.map = NULL;
-+
-+ memmap.map = (efi_memory_desc_t *)
-+ bt_ioremap((unsigned long) memmap.phys_map,
-+ (memmap.nr_map * sizeof(efi_memory_desc_t)));
-+
-+ if (memmap.map == NULL)
-+ printk(KERN_ERR PFX "Could not remap the EFI memmap!\n");
-+}
-+
-+void __init print_efi_memmap(void)
-+{
-+ efi_memory_desc_t *md;
-+ int i;
-+
-+ for (i = 0; i < memmap.nr_map; i++) {
-+ md = &memmap.map[i];
-+ printk(KERN_INFO "mem%02u: type=%u, attr=0x%llx, "
-+ "range=[0x%016llx-0x%016llx) (%lluMB)\n",
-+ i, md->type, md->attribute, md->phys_addr,
-+ md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT),
-+ (md->num_pages >> (20 - EFI_PAGE_SHIFT)));
-+ }
-+}
-+
-+/*
-+ * Walks the EFI memory map and calls CALLBACK once for each EFI
-+ * memory descriptor that has memory that is available for kernel use.
-+ */
-+void efi_memmap_walk(efi_freemem_callback_t callback, void *arg)
-+{
-+ int prev_valid = 0;
-+ struct range {
-+ unsigned long start;
-+ unsigned long end;
-+ } prev, curr;
-+ efi_memory_desc_t *md;
-+ unsigned long start, end;
-+ int i;
-+
-+ for (i = 0; i < memmap.nr_map; i++) {
-+ md = &memmap.map[i];
-+
-+ if ((md->num_pages == 0) || (!is_available_memory(md)))
-+ continue;
-+
-+ curr.start = md->phys_addr;
-+ curr.end = curr.start + (md->num_pages << EFI_PAGE_SHIFT);
-+
-+ if (!prev_valid) {
-+ prev = curr;
-+ prev_valid = 1;
-+ } else {
-+ if (curr.start < prev.start)
-+ printk(KERN_INFO PFX "Unordered memory map\n");
-+ if (prev.end == curr.start)
-+ prev.end = curr.end;
-+ else {
-+ start =
-+ (unsigned long) (PAGE_ALIGN(prev.start));
-+ end = (unsigned long) (prev.end & PAGE_MASK);
-+ if ((end > start)
-+ && (*callback) (start, end, arg) < 0)
-+ return;
-+ prev = curr;
-+ }
-+ }
-+ }
-+ if (prev_valid) {
-+ start = (unsigned long) PAGE_ALIGN(prev.start);
-+ end = (unsigned long) (prev.end & PAGE_MASK);
-+ if (end > start)
-+ (*callback) (start, end, arg);
-+ }
-+}
-+
-+void __init efi_init(void)
-+{
-+ efi_config_table_t *config_tables;
-+ efi_runtime_services_t *runtime;
-+ efi_char16_t *c16;
-+ char vendor[100] = "unknown";
-+ unsigned long num_config_tables;
-+ int i = 0;
-+
-+ memset(&efi, 0, sizeof(efi) );
-+ memset(&efi_phys, 0, sizeof(efi_phys));
-+
-+ efi_phys.systab = EFI_SYSTAB;
-+ memmap.phys_map = EFI_MEMMAP;
-+ memmap.nr_map = EFI_MEMMAP_SIZE/EFI_MEMDESC_SIZE;
-+ memmap.desc_version = EFI_MEMDESC_VERSION;
-+
-+ efi.systab = (efi_system_table_t *)
-+ boot_ioremap((unsigned long) efi_phys.systab,
-+ sizeof(efi_system_table_t));
-+ /*
-+ * Verify the EFI Table
-+ */
-+ if (efi.systab == NULL)
-+ printk(KERN_ERR PFX "Woah! Couldn't map the EFI system table.\n");
-+ if (efi.systab->hdr.signature != EFI_SYSTEM_TABLE_SIGNATURE)
-+ printk(KERN_ERR PFX "Woah! EFI system table signature incorrect\n");
-+ if ((efi.systab->hdr.revision ^ EFI_SYSTEM_TABLE_REVISION) >> 16 != 0)
-+ printk(KERN_ERR PFX
-+ "Warning: EFI system table major version mismatch: "
-+ "got %d.%02d, expected %d.%02d\n",
-+ efi.systab->hdr.revision >> 16,
-+ efi.systab->hdr.revision & 0xffff,
-+ EFI_SYSTEM_TABLE_REVISION >> 16,
-+ EFI_SYSTEM_TABLE_REVISION & 0xffff);
-+ /*
-+ * Grab some details from the system table
-+ */
-+ num_config_tables = efi.systab->nr_tables;
-+ config_tables = (efi_config_table_t *)efi.systab->tables;
-+ runtime = efi.systab->runtime;
-+
-+ /*
-+ * Show what we know for posterity
-+ */
-+ c16 = (efi_char16_t *) boot_ioremap(efi.systab->fw_vendor, 2);
-+ if (c16) {
-+ for (i = 0; i < sizeof(vendor) && *c16; ++i)
-+ vendor[i] = *c16++;
-+ vendor[i] = '\0';
-+ } else
-+ printk(KERN_ERR PFX "Could not map the firmware vendor!\n");
-+
-+ printk(KERN_INFO PFX "EFI v%u.%.02u by %s \n",
-+ efi.systab->hdr.revision >> 16,
-+ efi.systab->hdr.revision & 0xffff, vendor);
-+
-+ /*
-+ * Let's see what config tables the firmware passed to us.
-+ */
-+ config_tables = (efi_config_table_t *)
-+ boot_ioremap((unsigned long) config_tables,
-+ num_config_tables * sizeof(efi_config_table_t));
-+
-+ if (config_tables == NULL)
-+ printk(KERN_ERR PFX "Could not map EFI Configuration Table!\n");
-+
-+ for (i = 0; i < num_config_tables; i++) {
-+ if (efi_guidcmp(config_tables[i].guid, MPS_TABLE_GUID) == 0) {
-+ efi.mps = (void *)config_tables[i].table;
-+ printk(KERN_INFO " MPS=0x%lx ", config_tables[i].table);
-+ } else
-+ if (efi_guidcmp(config_tables[i].guid, ACPI_20_TABLE_GUID) == 0) {
-+ efi.acpi20 = __va(config_tables[i].table);
-+ printk(KERN_INFO " ACPI 2.0=0x%lx ", config_tables[i].table);
-+ } else
-+ if (efi_guidcmp(config_tables[i].guid, ACPI_TABLE_GUID) == 0) {
-+ efi.acpi = __va(config_tables[i].table);
-+ printk(KERN_INFO " ACPI=0x%lx ", config_tables[i].table);
-+ } else
-+ if (efi_guidcmp(config_tables[i].guid, SMBIOS_TABLE_GUID) == 0) {
-+ efi.smbios = (void *) config_tables[i].table;
-+ printk(KERN_INFO " SMBIOS=0x%lx ", config_tables[i].table);
-+ } else
-+ if (efi_guidcmp(config_tables[i].guid, HCDP_TABLE_GUID) == 0) {
-+ efi.hcdp = (void *)config_tables[i].table;
-+ printk(KERN_INFO " HCDP=0x%lx ", config_tables[i].table);
-+ } else
-+ if (efi_guidcmp(config_tables[i].guid, UGA_IO_PROTOCOL_GUID) == 0) {
-+ efi.uga = (void *)config_tables[i].table;
-+ printk(KERN_INFO " UGA=0x%lx ", config_tables[i].table);
-+ }
-+ }
-+ printk("\n");
-+
-+ /*
-+ * Check out the runtime services table. We need to map
-+ * the runtime services table so that we can grab the physical
-+ * address of several of the EFI runtime functions, needed to
-+ * set the firmware into virtual mode.
-+ */
-+
-+ runtime = (efi_runtime_services_t *) boot_ioremap((unsigned long)
-+ runtime,
-+ sizeof(efi_runtime_services_t));
-+ if (runtime != NULL) {
-+ /*
-+ * We will only need *early* access to the following
-+ * two EFI runtime services before set_virtual_address_map
-+ * is invoked.
-+ */
-+ efi_phys.get_time = (efi_get_time_t *) runtime->get_time;
-+ efi_phys.set_virtual_address_map =
-+ (efi_set_virtual_address_map_t *)
-+ runtime->set_virtual_address_map;
-+ } else
-+ printk(KERN_ERR PFX "Could not map the runtime service table!\n");
-+
-+ /* Map the EFI memory map for use until paging_init() */
-+
-+ memmap.map = (efi_memory_desc_t *)
-+ boot_ioremap((unsigned long) EFI_MEMMAP, EFI_MEMMAP_SIZE);
-+
-+ if (memmap.map == NULL)
-+ printk(KERN_ERR PFX "Could not map the EFI memory map!\n");
-+
-+ if (EFI_MEMDESC_SIZE != sizeof(efi_memory_desc_t)) {
-+ printk(KERN_WARNING PFX "Warning! Kernel-defined memdesc doesn't "
-+ "match the one from EFI!\n");
-+ }
-+#if EFI_DEBUG
-+ print_efi_memmap();
-+#endif
-+}
-+
-+/*
-+ * This function will switch the EFI runtime services to virtual mode.
-+ * Essentially, look through the EFI memmap and map every region that
-+ * has the runtime attribute bit set in its memory descriptor and update
-+ * that memory descriptor with the virtual address obtained from ioremap().
-+ * This enables the runtime services to be called without having to
-+ * thunk back into physical mode for every invocation.
-+ */
-+
-+void __init efi_enter_virtual_mode(void)
-+{
-+ efi_memory_desc_t *md;
-+ efi_status_t status;
-+ int i;
-+
-+ efi.systab = NULL;
-+
-+ for (i = 0; i < memmap.nr_map; i++) {
-+ md = &memmap.map[i];
-+
-+ if (md->attribute & EFI_MEMORY_RUNTIME) {
-+ md->virt_addr =
-+ (unsigned long)ioremap(md->phys_addr,
-+ md->num_pages << EFI_PAGE_SHIFT);
-+ if (!(unsigned long)md->virt_addr) {
-+ printk(KERN_ERR PFX "ioremap of 0x%lX failed\n",
-+ (unsigned long)md->phys_addr);
-+ }
-+
-+ if (((unsigned long)md->phys_addr <=
-+ (unsigned long)efi_phys.systab) &&
-+ ((unsigned long)efi_phys.systab <
-+ md->phys_addr +
-+ ((unsigned long)md->num_pages <<
-+ EFI_PAGE_SHIFT))) {
-+ unsigned long addr;
-+
-+ addr = md->virt_addr - md->phys_addr +
-+ (unsigned long)efi_phys.systab;
-+ efi.systab = (efi_system_table_t *)addr;
-+ }
-+ }
-+ }
-+
-+ if (!efi.systab)
-+ BUG();
-+
-+ status = phys_efi_set_virtual_address_map(
-+ sizeof(efi_memory_desc_t) * memmap.nr_map,
-+ sizeof(efi_memory_desc_t),
-+ memmap.desc_version,
-+ memmap.phys_map);
-+
-+ if (status != EFI_SUCCESS) {
-+ printk (KERN_ALERT "You are screwed! "
-+ "Unable to switch EFI into virtual mode "
-+ "(status=%lx)\n", status);
-+ panic("EFI call to SetVirtualAddressMap() failed!");
-+ }
-+
-+ /*
-+ * Now that EFI is in virtual mode, update the function
-+ * pointers in the runtime service table to the new virtual addresses.
-+ */
-+
-+ efi.get_time = (efi_get_time_t *) efi.systab->runtime->get_time;
-+ efi.set_time = (efi_set_time_t *) efi.systab->runtime->set_time;
-+ efi.get_wakeup_time = (efi_get_wakeup_time_t *)
-+ efi.systab->runtime->get_wakeup_time;
-+ efi.set_wakeup_time = (efi_set_wakeup_time_t *)
-+ efi.systab->runtime->set_wakeup_time;
-+ efi.get_variable = (efi_get_variable_t *)
-+ efi.systab->runtime->get_variable;
-+ efi.get_next_variable = (efi_get_next_variable_t *)
-+ efi.systab->runtime->get_next_variable;
-+ efi.set_variable = (efi_set_variable_t *)
-+ efi.systab->runtime->set_variable;
-+ efi.get_next_high_mono_count = (efi_get_next_high_mono_count_t *)
-+ efi.systab->runtime->get_next_high_mono_count;
-+ efi.reset_system = (efi_reset_system_t *)
-+ efi.systab->runtime->reset_system;
-+}
-+
-+void __init
-+efi_initialize_iomem_resources(struct resource *code_resource,
-+ struct resource *data_resource)
-+{
-+ struct resource *res;
-+ efi_memory_desc_t *md;
-+ int i;
-+
-+ for (i = 0; i < memmap.nr_map; i++) {
-+ md = &memmap.map[i];
-+
-+ if ((md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT)) >
-+ 0x100000000ULL)
-+ continue;
-+ res = alloc_bootmem_low(sizeof(struct resource));
-+ switch (md->type) {
-+ case EFI_RESERVED_TYPE:
-+ res->name = "Reserved Memory";
-+ break;
-+ case EFI_LOADER_CODE:
-+ res->name = "Loader Code";
-+ break;
-+ case EFI_LOADER_DATA:
-+ res->name = "Loader Data";
-+ break;
-+ case EFI_BOOT_SERVICES_DATA:
-+ res->name = "BootServices Data";
-+ break;
-+ case EFI_BOOT_SERVICES_CODE:
-+ res->name = "BootServices Code";
-+ break;
-+ case EFI_RUNTIME_SERVICES_CODE:
-+ res->name = "Runtime Service Code";
-+ break;
-+ case EFI_RUNTIME_SERVICES_DATA:
-+ res->name = "Runtime Service Data";
-+ break;
-+ case EFI_CONVENTIONAL_MEMORY:
-+ res->name = "Conventional Memory";
-+ break;
-+ case EFI_UNUSABLE_MEMORY:
-+ res->name = "Unusable Memory";
-+ break;
-+ case EFI_ACPI_RECLAIM_MEMORY:
-+ res->name = "ACPI Reclaim";
-+ break;
-+ case EFI_ACPI_MEMORY_NVS:
-+ res->name = "ACPI NVS";
-+ break;
-+ case EFI_MEMORY_MAPPED_IO:
-+ res->name = "Memory Mapped IO";
-+ break;
-+ case EFI_MEMORY_MAPPED_IO_PORT_SPACE:
-+ res->name = "Memory Mapped IO Port Space";
-+ break;
-+ default:
-+ res->name = "Reserved";
-+ break;
-+ }
-+ res->start = md->phys_addr;
-+ res->end = res->start + ((md->num_pages << EFI_PAGE_SHIFT) - 1);
-+ res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
-+ if (request_resource(&iomem_resource, res) < 0)
-+ printk(KERN_ERR PFX "Failed to allocate res %s : 0x%lx-0x%lx\n",
-+ res->name, res->start, res->end);
-+ /*
-+ * We don't know which region contains kernel data so we try
-+ * it repeatedly and let the resource manager test it.
-+ */
-+ if (md->type == EFI_CONVENTIONAL_MEMORY) {
-+ request_resource(res, code_resource);
-+ request_resource(res, data_resource);
-+ }
-+ }
-+}
-+
-+/*
-+ * Convenience functions to obtain memory types and attributes
-+ */
-+
-+u32 efi_mem_type(unsigned long phys_addr)
-+{
-+ efi_memory_desc_t *md;
-+ int i;
-+
-+ for (i = 0; i < memmap.nr_map; i++) {
-+ md = &memmap.map[i];
-+ if ((md->phys_addr <= phys_addr) && (phys_addr <
-+ (md->phys_addr + (md-> num_pages << EFI_PAGE_SHIFT)) ))
-+ return md->type;
-+ }
-+ return 0;
-+}
-+
-+u64 efi_mem_attributes(unsigned long phys_addr)
-+{
-+ efi_memory_desc_t *md;
-+ int i;
-+
-+ for (i = 0; i < memmap.nr_map; i++) {
-+ md = &memmap.map[i];
-+ if ((md->phys_addr <= phys_addr) && (phys_addr <
-+ (md->phys_addr + (md-> num_pages << EFI_PAGE_SHIFT)) ))
-+ return md->attribute;
-+ }
-+ return 0;
-+}
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/arch/i386/kernel/efi_stub.S 2003-12-28 23:21:45.000000000 -0800
-@@ -0,0 +1,124 @@
-+/*
-+ * EFI call stub for IA32.
-+ *
-+ * This stub allows us to make EFI calls in physical mode with interrupts
-+ * turned off.
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/linkage.h>
-+#include <asm/page.h>
-+#include <asm/pgtable.h>
-+
-+/*
-+ * efi_call_phys(void *, ...) is a function with variable parameters.
-+ * All the callers of this function assure that all the parameters are 4-bytes.
-+ */
-+
-+/*
-+ * In gcc calling convention, EBX, ESP, EBP, ESI and EDI are all callee save.
-+ * So we'd better save all of them at the beginning of this function and restore
-+ * at the end no matter how many we use, because we can not assure EFI runtime
-+ * service functions will comply with gcc calling convention, too.
-+ */
-+
-+.text
-+ENTRY(efi_call_phys)
-+ /*
-+ * 0. The function can only be called in Linux kernel. So CS has been
-+ * set to 0x0010, DS and SS have been set to 0x0018. In EFI, I found
-+ * the values of these registers are the same. And, the corresponding
-+ * GDT entries are identical. So I will do nothing about segment reg
-+ * and GDT, but change GDT base register in prelog and epilog.
-+ */
-+
-+ /*
-+ * 1. Now I am running with EIP = <physical address> + PAGE_OFFSET.
-+ * But to make it smoothly switch from virtual mode to flat mode.
-+ * The mapping of lower virtual memory has been created in prelog and
-+ * epilog.
-+ */
-+ movl $1f, %edx
-+ subl $__PAGE_OFFSET, %edx
-+ jmp *%edx
-+1:
-+
-+ /*
-+ * 2. Now on the top of stack is the return
-+ * address in the caller of efi_call_phys(), then parameter 1,
-+ * parameter 2, ..., param n. To make things easy, we save the return
-+ * address of efi_call_phys in a global variable.
-+ */
-+ popl %edx
-+ movl %edx, saved_return_addr
-+ /* get the function pointer into ECX*/
-+ popl %ecx
-+ movl %ecx, efi_rt_function_ptr
-+ movl $2f, %edx
-+ subl $__PAGE_OFFSET, %edx
-+ pushl %edx
-+
-+ /*
-+ * 3. Clear PG bit in %CR0.
-+ */
-+ movl %cr0, %edx
-+ andl $0x7fffffff, %edx
-+ movl %edx, %cr0
-+ jmp 1f
-+1:
-+
-+ /*
-+ * 4. Adjust stack pointer.
-+ */
-+ subl $__PAGE_OFFSET, %esp
-+
-+ /*
-+ * 5. Call the physical function.
-+ */
-+ jmp *%ecx
-+
-+2:
-+ /*
-+ * 6. After EFI runtime service returns, control will return to
-+ * following instruction. We'd better readjust stack pointer first.
-+ */
-+ addl $__PAGE_OFFSET, %esp
-+
-+ /*
-+ * 7. Restore PG bit
-+ */
-+ movl %cr0, %edx
-+ orl $0x80000000, %edx
-+ movl %edx, %cr0
-+ jmp 1f
-+1:
-+ /*
-+ * 8. Now restore the virtual mode from flat mode by
-+ * adding EIP with PAGE_OFFSET.
-+ */
-+ movl $1f, %edx
-+ jmp *%edx
-+1:
-+
-+ /*
-+ * 9. Balance the stack. And because EAX contain the return value,
-+ * we'd better not clobber it.
-+ */
-+ leal efi_rt_function_ptr, %edx
-+ movl (%edx), %ecx
-+ pushl %ecx
-+
-+ /*
-+ * 10. Push the saved return address onto the stack and return.
-+ */
-+ leal saved_return_addr, %edx
-+ movl (%edx), %ecx
-+ pushl %ecx
-+ ret
-+.previous
-+
-+.data
-+saved_return_addr:
-+ .long 0
-+efi_rt_function_ptr:
-+ .long 0
---- linux-2.6.0/arch/i386/kernel/entry.S 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/i386/kernel/entry.S 2003-12-28 23:26:36.000000000 -0800
-@@ -43,11 +43,25 @@
- #include <linux/config.h>
- #include <linux/linkage.h>
- #include <asm/thread_info.h>
-+#include <asm/asm_offsets.h>
- #include <asm/errno.h>
- #include <asm/segment.h>
-+#include <asm/page.h>
- #include <asm/smp.h>
- #include <asm/page.h>
- #include "irq_vectors.h"
-+ /* We do not recover from a stack overflow, but at least
-+ * we know it happened and should be able to track it down.
-+ */
-+#ifdef CONFIG_STACK_OVERFLOW_TEST
-+#define STACK_OVERFLOW_TEST \
-+ testl $7680,%esp; \
-+ jnz 10f; \
-+ call stack_overflow; \
-+10:
-+#else
-+#define STACK_OVERFLOW_TEST
-+#endif
-
- #define nr_syscalls ((syscall_table_size)/4)
-
-@@ -87,7 +101,102 @@ TSS_ESP0_OFFSET = (4 - 0x200)
- #define resume_kernel restore_all
- #endif
-
--#define SAVE_ALL \
-+#ifdef CONFIG_X86_HIGH_ENTRY
-+
-+#ifdef CONFIG_X86_SWITCH_PAGETABLES
-+
-+#if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP)
-+/*
-+ * If task is preempted in __SWITCH_KERNELSPACE, and moved to another cpu,
-+ * __switch_to repoints %esp to the appropriate virtual stack; but %ebp is
-+ * left stale, so we must check whether to repeat the real stack calculation.
-+ */
-+#define repeat_if_esp_changed \
-+ xorl %esp, %ebp; \
-+ testl $0xffffe000, %ebp; \
-+ jnz 0b
-+#else
-+#define repeat_if_esp_changed
-+#endif
-+
-+/* clobbers ebx, edx and ebp */
-+
-+#define __SWITCH_KERNELSPACE \
-+ cmpl $0xff000000, %esp; \
-+ jb 1f; \
-+ \
-+ /* \
-+ * switch pagetables and load the real stack, \
-+ * keep the stack offset: \
-+ */ \
-+ \
-+ movl $swapper_pg_dir-__PAGE_OFFSET, %edx; \
-+ \
-+ /* GET_THREAD_INFO(%ebp) intermixed */ \
-+0: \
-+ movl %esp, %ebp; \
-+ movl %esp, %ebx; \
-+ andl $0xffffe000, %ebp; \
-+ andl $0x00001fff, %ebx; \
-+ orl TI_real_stack(%ebp), %ebx; \
-+ repeat_if_esp_changed; \
-+ \
-+ movl %edx, %cr3; \
-+ movl %ebx, %esp; \
-+1:
-+
-+#endif
-+
-+
-+#define __SWITCH_USERSPACE \
-+ /* interrupted any of the user return paths? */ \
-+ \
-+ movl EIP(%esp), %eax; \
-+ \
-+ cmpl $int80_ret_start_marker, %eax; \
-+ jb 33f; /* nope - continue with sysexit check */\
-+ cmpl $int80_ret_end_marker, %eax; \
-+ jb 22f; /* yes - switch to virtual stack */ \
-+33: \
-+ cmpl $sysexit_ret_start_marker, %eax; \
-+ jb 44f; /* nope - continue with user check */ \
-+ cmpl $sysexit_ret_end_marker, %eax; \
-+ jb 22f; /* yes - switch to virtual stack */ \
-+ /* return to userspace? */ \
-+44: \
-+ movl EFLAGS(%esp),%ecx; \
-+ movb CS(%esp),%cl; \
-+ testl $(VM_MASK | 3),%ecx; \
-+ jz 2f; \
-+22: \
-+ /* \
-+ * switch to the virtual stack, then switch to \
-+ * the userspace pagetables. \
-+ */ \
-+ \
-+ GET_THREAD_INFO(%ebp); \
-+ movl TI_virtual_stack(%ebp), %edx; \
-+ movl TI_user_pgd(%ebp), %ecx; \
-+ \
-+ movl %esp, %ebx; \
-+ andl $0x1fff, %ebx; \
-+ orl %ebx, %edx; \
-+int80_ret_start_marker: \
-+ movl %edx, %esp; \
-+ movl %ecx, %cr3; \
-+ \
-+ __RESTORE_ALL; \
-+int80_ret_end_marker: \
-+2:
-+
-+#else /* !CONFIG_X86_HIGH_ENTRY */
-+
-+#define __SWITCH_KERNELSPACE
-+#define __SWITCH_USERSPACE
-+
-+#endif
-+
-+#define __SAVE_ALL \
- cld; \
- pushl %es; \
- pushl %ds; \
-@@ -102,7 +211,7 @@ TSS_ESP0_OFFSET = (4 - 0x200)
- movl %edx, %ds; \
- movl %edx, %es;
-
--#define RESTORE_INT_REGS \
-+#define __RESTORE_INT_REGS \
- popl %ebx; \
- popl %ecx; \
- popl %edx; \
-@@ -111,29 +220,28 @@ TSS_ESP0_OFFSET = (4 - 0x200)
- popl %ebp; \
- popl %eax
-
--#define RESTORE_REGS \
-- RESTORE_INT_REGS; \
--1: popl %ds; \
--2: popl %es; \
-+#define __RESTORE_REGS \
-+ __RESTORE_INT_REGS; \
-+111: popl %ds; \
-+222: popl %es; \
- .section .fixup,"ax"; \
--3: movl $0,(%esp); \
-- jmp 1b; \
--4: movl $0,(%esp); \
-- jmp 2b; \
-+444: movl $0,(%esp); \
-+ jmp 111b; \
-+555: movl $0,(%esp); \
-+ jmp 222b; \
- .previous; \
- .section __ex_table,"a";\
- .align 4; \
-- .long 1b,3b; \
-- .long 2b,4b; \
-+ .long 111b,444b;\
-+ .long 222b,555b;\
- .previous
-
--
--#define RESTORE_ALL \
-- RESTORE_REGS \
-+#define __RESTORE_ALL \
-+ __RESTORE_REGS \
- addl $4, %esp; \
--1: iret; \
-+333: iret; \
- .section .fixup,"ax"; \
--2: sti; \
-+666: sti; \
- movl $(__USER_DS), %edx; \
- movl %edx, %ds; \
- movl %edx, %es; \
-@@ -142,10 +250,19 @@ TSS_ESP0_OFFSET = (4 - 0x200)
- .previous; \
- .section __ex_table,"a";\
- .align 4; \
-- .long 1b,2b; \
-+ .long 333b,666b;\
- .previous
-
-+#define SAVE_ALL \
-+ __SAVE_ALL; \
-+ __SWITCH_KERNELSPACE; \
-+ STACK_OVERFLOW_TEST;
-+
-+#define RESTORE_ALL \
-+ __SWITCH_USERSPACE; \
-+ __RESTORE_ALL;
-
-+.section .entry.text,"ax"
-
- ENTRY(lcall7)
- pushfl # We get a different stack layout with call
-@@ -163,7 +280,7 @@ do_lcall:
- movl %edx,EIP(%ebp) # Now we move them to their "normal" places
- movl %ecx,CS(%ebp) #
- andl $-8192, %ebp # GET_THREAD_INFO
-- movl TI_EXEC_DOMAIN(%ebp), %edx # Get the execution domain
-+ movl TI_exec_domain(%ebp), %edx # Get the execution domain
- call *4(%edx) # Call the lcall7 handler for the domain
- addl $4, %esp
- popl %eax
-@@ -208,7 +325,7 @@ ENTRY(resume_userspace)
- cli # make sure we don't miss an interrupt
- # setting need_resched or sigpending
- # between sampling and the iret
-- movl TI_FLAGS(%ebp), %ecx
-+ movl TI_flags(%ebp), %ecx
- andl $_TIF_WORK_MASK, %ecx # is there any work to be done on
- # int/exception return?
- jne work_pending
-@@ -216,18 +333,18 @@ ENTRY(resume_userspace)
-
- #ifdef CONFIG_PREEMPT
- ENTRY(resume_kernel)
-- cmpl $0,TI_PRE_COUNT(%ebp) # non-zero preempt_count ?
-+ cmpl $0,TI_preempt_count(%ebp) # non-zero preempt_count ?
- jnz restore_all
- need_resched:
-- movl TI_FLAGS(%ebp), %ecx # need_resched set ?
-+ movl TI_flags(%ebp), %ecx # need_resched set ?
- testb $_TIF_NEED_RESCHED, %cl
- jz restore_all
- testl $IF_MASK,EFLAGS(%esp) # interrupts off (exception path) ?
- jz restore_all
-- movl $PREEMPT_ACTIVE,TI_PRE_COUNT(%ebp)
-+ movl $PREEMPT_ACTIVE,TI_preempt_count(%ebp)
- sti
- call schedule
-- movl $0,TI_PRE_COUNT(%ebp)
-+ movl $0,TI_preempt_count(%ebp)
- cli
- jmp need_resched
- #endif
-@@ -246,37 +363,50 @@ sysenter_past_esp:
- pushl $(__USER_CS)
- pushl $SYSENTER_RETURN
-
--/*
-- * Load the potential sixth argument from user stack.
-- * Careful about security.
-- */
-- cmpl $__PAGE_OFFSET-3,%ebp
-- jae syscall_fault
--1: movl (%ebp),%ebp
--.section __ex_table,"a"
-- .align 4
-- .long 1b,syscall_fault
--.previous
--
- pushl %eax
- SAVE_ALL
- GET_THREAD_INFO(%ebp)
- cmpl $(nr_syscalls), %eax
- jae syscall_badsys
-
-- testb $_TIF_SYSCALL_TRACE,TI_FLAGS(%ebp)
-+ testb $_TIF_SYSCALL_TRACE,TI_flags(%ebp)
- jnz syscall_trace_entry
- call *sys_call_table(,%eax,4)
- movl %eax,EAX(%esp)
- cli
-- movl TI_FLAGS(%ebp), %ecx
-+ movl TI_flags(%ebp), %ecx
- testw $_TIF_ALLWORK_MASK, %cx
- jne syscall_exit_work
-+
-+#ifdef CONFIG_X86_SWITCH_PAGETABLES
-+
-+ GET_THREAD_INFO(%ebp)
-+ movl TI_virtual_stack(%ebp), %edx
-+ movl TI_user_pgd(%ebp), %ecx
-+ movl %esp, %ebx
-+ andl $0x1fff, %ebx
-+ orl %ebx, %edx
-+sysexit_ret_start_marker:
-+ movl %edx, %esp
-+ movl %ecx, %cr3
-+#endif
-+ /*
-+ * only ebx is not restored by the userspace sysenter vsyscall
-+ * code, it assumes it to be callee-saved.
-+ */
-+ movl EBX(%esp), %ebx
-+
- /* if something modifies registers it must also disable sysexit */
-+
- movl EIP(%esp), %edx
- movl OLDESP(%esp), %ecx
-+
- sti
- sysexit
-+#ifdef CONFIG_X86_SWITCH_PAGETABLES
-+sysexit_ret_end_marker:
-+ nop
-+#endif
-
-
- # system call handler stub
-@@ -287,7 +417,7 @@ ENTRY(system_call)
- cmpl $(nr_syscalls), %eax
- jae syscall_badsys
- # system call tracing in operation
-- testb $_TIF_SYSCALL_TRACE,TI_FLAGS(%ebp)
-+ testb $_TIF_SYSCALL_TRACE,TI_flags(%ebp)
- jnz syscall_trace_entry
- syscall_call:
- call *sys_call_table(,%eax,4)
-@@ -296,10 +426,23 @@ syscall_exit:
- cli # make sure we don't miss an interrupt
- # setting need_resched or sigpending
- # between sampling and the iret
-- movl TI_FLAGS(%ebp), %ecx
-+ movl TI_flags(%ebp), %ecx
- testw $_TIF_ALLWORK_MASK, %cx # current->work
- jne syscall_exit_work
- restore_all:
-+#ifdef CONFIG_TRAP_BAD_SYSCALL_EXITS
-+ movl EFLAGS(%esp), %eax # mix EFLAGS and CS
-+ movb CS(%esp), %al
-+ testl $(VM_MASK | 3), %eax
-+ jz resume_kernelX # returning to kernel or vm86-space
-+
-+ cmpl $0,TI_preempt_count(%ebp) # non-zero preempt_count ?
-+ jz resume_kernelX
-+
-+ int $3
-+
-+resume_kernelX:
-+#endif
- RESTORE_ALL
-
- # perform work that needs to be done immediately before resumption
-@@ -312,7 +455,7 @@ work_resched:
- cli # make sure we don't miss an interrupt
- # setting need_resched or sigpending
- # between sampling and the iret
-- movl TI_FLAGS(%ebp), %ecx
-+ movl TI_flags(%ebp), %ecx
- andl $_TIF_WORK_MASK, %ecx # is there any work to be done other
- # than syscall tracing?
- jz restore_all
-@@ -327,6 +470,22 @@ work_notifysig: # deal with pending s
- # vm86-space
- xorl %edx, %edx
- call do_notify_resume
-+
-+#if CONFIG_X86_HIGH_ENTRY
-+ /*
-+ * Reload db7 if necessary:
-+ */
-+ movl TI_flags(%ebp), %ecx
-+ testb $_TIF_DB7, %cl
-+ jnz work_db7
-+
-+ jmp restore_all
-+
-+work_db7:
-+ movl TI_task(%ebp), %edx;
-+ movl task_thread_db7(%edx), %edx;
-+ movl %edx, %db7;
-+#endif
- jmp restore_all
-
- ALIGN
-@@ -382,7 +541,7 @@ syscall_badsys:
- */
- .data
- ENTRY(interrupt)
--.text
-+.previous
-
- vector=0
- ENTRY(irq_entries_start)
-@@ -392,7 +551,7 @@ ENTRY(irq_entries_start)
- jmp common_interrupt
- .data
- .long 1b
--.text
-+.previous
- vector=vector+1
- .endr
-
-@@ -433,12 +592,17 @@ error_code:
- movl ES(%esp), %edi # get the function address
- movl %eax, ORIG_EAX(%esp)
- movl %ecx, ES(%esp)
-- movl %esp, %edx
- pushl %esi # push the error code
-- pushl %edx # push the pt_regs pointer
- movl $(__USER_DS), %edx
- movl %edx, %ds
- movl %edx, %es
-+
-+/* clobbers edx, ebx and ebp */
-+ __SWITCH_KERNELSPACE
-+
-+ leal 4(%esp), %edx # prepare pt_regs
-+ pushl %edx # push pt_regs
-+
- call *%edi
- addl $8, %esp
- jmp ret_from_exception
-@@ -529,7 +693,7 @@ nmi_stack_correct:
- pushl %edx
- call do_nmi
- addl $8, %esp
-- RESTORE_ALL
-+ jmp restore_all
-
- nmi_stack_fixup:
- FIX_STACK(12,nmi_stack_correct, 1)
-@@ -606,6 +770,8 @@ ENTRY(spurious_interrupt_bug)
- pushl $do_spurious_interrupt_bug
- jmp error_code
-
-+.previous
-+
- .data
- ENTRY(sys_call_table)
- .long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/arch/i386/kernel/entry_trampoline.c 2003-12-28 23:26:36.000000000 -0800
-@@ -0,0 +1,75 @@
-+/*
-+ * linux/arch/i386/kernel/entry_trampoline.c
-+ *
-+ * (C) Copyright 2003 Ingo Molnar
-+ *
-+ * This file contains the needed support code for 4GB userspace
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/smp.h>
-+#include <linux/mm.h>
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/string.h>
-+#include <linux/highmem.h>
-+#include <asm/desc.h>
-+#include <asm/atomic_kmap.h>
-+
-+extern char __entry_tramp_start, __entry_tramp_end, __start___entry_text;
-+
-+void __init init_entry_mappings(void)
-+{
-+#ifdef CONFIG_X86_HIGH_ENTRY
-+ void *tramp;
-+
-+ /*
-+ * We need a high IDT and GDT for the 4G/4G split:
-+ */
-+ trap_init_virtual_IDT();
-+
-+ __set_fixmap(FIX_ENTRY_TRAMPOLINE_0, __pa((unsigned long)&__entry_tramp_start), PAGE_KERNEL);
-+ __set_fixmap(FIX_ENTRY_TRAMPOLINE_1, __pa((unsigned long)&__entry_tramp_start) + PAGE_SIZE, PAGE_KERNEL);
-+ tramp = (void *)fix_to_virt(FIX_ENTRY_TRAMPOLINE_0);
-+
-+ printk("mapped 4G/4G trampoline to %p.\n", tramp);
-+ BUG_ON((void *)&__start___entry_text != tramp);
-+ /*
-+ * Virtual kernel stack:
-+ */
-+ BUG_ON(__kmap_atomic_vaddr(KM_VSTACK0) & 8191);
-+ BUG_ON(sizeof(struct desc_struct)*NR_CPUS*GDT_ENTRIES > 2*PAGE_SIZE);
-+ BUG_ON((unsigned int)&__entry_tramp_end - (unsigned int)&__entry_tramp_start > 2*PAGE_SIZE);
-+
-+ /*
-+ * set up the initial thread's virtual stack related
-+ * fields:
-+ */
-+ current->thread.stack_page0 = virt_to_page((char *)current->thread_info);
-+ current->thread.stack_page1 = virt_to_page((char *)current->thread_info + PAGE_SIZE);
-+ current->thread_info->virtual_stack = (void *)__kmap_atomic_vaddr(KM_VSTACK0);
-+
-+ __kunmap_atomic_type(KM_VSTACK0);
-+ __kunmap_atomic_type(KM_VSTACK1);
-+ __kmap_atomic(current->thread.stack_page0, KM_VSTACK0);
-+ __kmap_atomic(current->thread.stack_page1, KM_VSTACK1);
-+
-+#endif
-+ printk("current: %p\n", current);
-+ printk("current->thread_info: %p\n", current->thread_info);
-+ current->thread_info->real_stack = (void *)current->thread_info;
-+ current->thread_info->user_pgd = NULL;
-+ current->thread.esp0 = (unsigned long)current->thread_info->real_stack + THREAD_SIZE;
-+}
-+
-+
-+
-+void __init entry_trampoline_setup(void)
-+{
-+ /*
-+ * old IRQ entries set up by the boot code will still hang
-+ * around - they are a sign of hw trouble anyway, now they'll
-+ * produce a double fault message.
-+ */
-+ trap_init_virtual_GDT();
-+}
---- linux-2.6.0/arch/i386/kernel/head.S 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/head.S 2003-12-28 23:26:36.000000000 -0800
-@@ -16,6 +16,7 @@
- #include <asm/pgtable.h>
- #include <asm/desc.h>
- #include <asm/cache.h>
-+#include <asm/asm_offsets.h>
-
- #define OLD_CL_MAGIC_ADDR 0x90020
- #define OLD_CL_MAGIC 0xA33F
-@@ -330,7 +331,7 @@ ENTRY(stack_start)
-
- /* This is the default interrupt "handler" :-) */
- int_msg:
-- .asciz "Unknown interrupt\n"
-+ .asciz "Unknown interrupt or fault at EIP %p %p %p\n"
- ALIGN
- ignore_int:
- cld
-@@ -342,9 +343,17 @@ ignore_int:
- movl $(__KERNEL_DS),%eax
- movl %eax,%ds
- movl %eax,%es
-+ pushl 16(%esp)
-+ pushl 24(%esp)
-+ pushl 32(%esp)
-+ pushl 40(%esp)
- pushl $int_msg
- call printk
- popl %eax
-+ popl %eax
-+ popl %eax
-+ popl %eax
-+ popl %eax
- popl %ds
- popl %es
- popl %edx
-@@ -377,23 +386,27 @@ cpu_gdt_descr:
- .fill NR_CPUS-1,8,0 # space for the other GDT descriptors
-
- /*
-- * This is initialized to create an identity-mapping at 0-8M (for bootup
-- * purposes) and another mapping of the 0-8M area at virtual address
-+ * This is initialized to create an identity-mapping at 0-16M (for bootup
-+ * purposes) and another mapping of the 0-16M area at virtual address
- * PAGE_OFFSET.
- */
- .org 0x1000
- ENTRY(swapper_pg_dir)
- .long 0x00102007
- .long 0x00103007
-- .fill BOOT_USER_PGD_PTRS-2,4,0
-- /* default: 766 entries */
-+ .long 0x00104007
-+ .long 0x00105007
-+ .fill BOOT_USER_PGD_PTRS-4,4,0
-+ /* default: 764 entries */
- .long 0x00102007
- .long 0x00103007
-- /* default: 254 entries */
-- .fill BOOT_KERNEL_PGD_PTRS-2,4,0
-+ .long 0x00104007
-+ .long 0x00105007
-+ /* default: 252 entries */
-+ .fill BOOT_KERNEL_PGD_PTRS-4,4,0
-
- /*
-- * The page tables are initialized to only 8MB here - the final page
-+ * The page tables are initialized to only 16MB here - the final page
- * tables are set up later depending on memory size.
- */
- .org 0x2000
-@@ -402,15 +415,21 @@ ENTRY(pg0)
- .org 0x3000
- ENTRY(pg1)
-
-+.org 0x4000
-+ENTRY(pg2)
-+
-+.org 0x5000
-+ENTRY(pg3)
-+
- /*
- * empty_zero_page must immediately follow the page tables ! (The
- * initialization loop counts until empty_zero_page)
- */
-
--.org 0x4000
-+.org 0x6000
- ENTRY(empty_zero_page)
-
--.org 0x5000
-+.org 0x7000
-
- /*
- * Real beginning of normal "text" segment
-@@ -419,12 +438,12 @@ ENTRY(stext)
- ENTRY(_stext)
-
- /*
-- * This starts the data section. Note that the above is all
-- * in the text section because it has alignment requirements
-- * that we cannot fulfill any other way.
-+ * This starts the data section.
- */
- .data
-
-+.align PAGE_SIZE_asm
-+
- /*
- * The Global Descriptor Table contains 28 quadwords, per-CPU.
- */
-@@ -439,7 +458,9 @@ ENTRY(boot_gdt_table)
- .quad 0x00cf9a000000ffff /* kernel 4GB code at 0x00000000 */
- .quad 0x00cf92000000ffff /* kernel 4GB data at 0x00000000 */
- #endif
-- .align L1_CACHE_BYTES
-+
-+.align PAGE_SIZE_asm
-+
- ENTRY(cpu_gdt_table)
- .quad 0x0000000000000000 /* NULL descriptor */
- .quad 0x0000000000000000 /* 0x0b reserved */
---- linux-2.6.0/arch/i386/kernel/i386_ksyms.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/i386_ksyms.c 2003-12-28 23:26:36.000000000 -0800
-@@ -98,7 +98,6 @@ EXPORT_SYMBOL_NOVERS(__down_failed_inter
- EXPORT_SYMBOL_NOVERS(__down_failed_trylock);
- EXPORT_SYMBOL_NOVERS(__up_wakeup);
- /* Networking helper routines. */
--EXPORT_SYMBOL(csum_partial_copy_generic);
- /* Delay loops */
- EXPORT_SYMBOL(__ndelay);
- EXPORT_SYMBOL(__udelay);
-@@ -112,13 +111,17 @@ EXPORT_SYMBOL_NOVERS(__get_user_4);
- EXPORT_SYMBOL(strpbrk);
- EXPORT_SYMBOL(strstr);
-
-+#if !defined(CONFIG_X86_UACCESS_INDIRECT)
- EXPORT_SYMBOL(strncpy_from_user);
--EXPORT_SYMBOL(__strncpy_from_user);
-+EXPORT_SYMBOL(__direct_strncpy_from_user);
- EXPORT_SYMBOL(clear_user);
- EXPORT_SYMBOL(__clear_user);
- EXPORT_SYMBOL(__copy_from_user_ll);
- EXPORT_SYMBOL(__copy_to_user_ll);
- EXPORT_SYMBOL(strnlen_user);
-+#else /* CONFIG_X86_UACCESS_INDIRECT */
-+EXPORT_SYMBOL(direct_csum_partial_copy_generic);
-+#endif
-
- EXPORT_SYMBOL(dma_alloc_coherent);
- EXPORT_SYMBOL(dma_free_coherent);
---- linux-2.6.0/arch/i386/kernel/i387.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/i387.c 2003-12-28 23:26:36.000000000 -0800
-@@ -218,6 +218,7 @@ void set_fpu_mxcsr( struct task_struct *
- static int convert_fxsr_to_user( struct _fpstate __user *buf,
- struct i387_fxsave_struct *fxsave )
- {
-+ struct _fpreg tmp[8]; /* 80 bytes scratch area */
- unsigned long env[7];
- struct _fpreg __user *to;
- struct _fpxreg *from;
-@@ -234,23 +235,25 @@ static int convert_fxsr_to_user( struct
- if ( __copy_to_user( buf, env, 7 * sizeof(unsigned long) ) )
- return 1;
-
-- to = &buf->_st[0];
-+ to = tmp;
- from = (struct _fpxreg *) &fxsave->st_space[0];
- for ( i = 0 ; i < 8 ; i++, to++, from++ ) {
- unsigned long *t = (unsigned long *)to;
- unsigned long *f = (unsigned long *)from;
-
-- if (__put_user(*f, t) ||
-- __put_user(*(f + 1), t + 1) ||
-- __put_user(from->exponent, &to->exponent))
-- return 1;
-+ *t = *f;
-+ *(t + 1) = *(f+1);
-+ to->exponent = from->exponent;
- }
-+ if (copy_to_user(buf->_st, tmp, sizeof(struct _fpreg [8])))
-+ return 1;
- return 0;
- }
-
- static int convert_fxsr_from_user( struct i387_fxsave_struct *fxsave,
- struct _fpstate __user *buf )
- {
-+ struct _fpreg tmp[8]; /* 80 bytes scratch area */
- unsigned long env[7];
- struct _fpxreg *to;
- struct _fpreg __user *from;
-@@ -258,6 +261,8 @@ static int convert_fxsr_from_user( struc
-
- if ( __copy_from_user( env, buf, 7 * sizeof(long) ) )
- return 1;
-+ if (copy_from_user(tmp, buf->_st, sizeof(struct _fpreg [8])))
-+ return 1;
-
- fxsave->cwd = (unsigned short)(env[0] & 0xffff);
- fxsave->swd = (unsigned short)(env[1] & 0xffff);
-@@ -269,15 +274,14 @@ static int convert_fxsr_from_user( struc
- fxsave->fos = env[6];
-
- to = (struct _fpxreg *) &fxsave->st_space[0];
-- from = &buf->_st[0];
-+ from = tmp;
- for ( i = 0 ; i < 8 ; i++, to++, from++ ) {
- unsigned long *t = (unsigned long *)to;
- unsigned long *f = (unsigned long *)from;
-
-- if (__get_user(*t, f) ||
-- __get_user(*(t + 1), f + 1) ||
-- __get_user(to->exponent, &from->exponent))
-- return 1;
-+ *t = *f;
-+ *(t + 1) = *(f + 1);
-+ to->exponent = from->exponent;
- }
- return 0;
- }
---- linux-2.6.0/arch/i386/kernel/i8259.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/i8259.c 2003-12-28 23:21:44.000000000 -0800
-@@ -419,8 +419,10 @@ void __init init_IRQ(void)
- * us. (some of these will be overridden and become
- * 'special' SMP interrupts)
- */
-- for (i = 0; i < NR_IRQS; i++) {
-+ for (i = 0; i < (NR_VECTORS - FIRST_EXTERNAL_VECTOR); i++) {
- int vector = FIRST_EXTERNAL_VECTOR + i;
-+ if (i >= NR_IRQS)
-+ break;
- if (vector != SYSCALL_VECTOR)
- set_intr_gate(vector, interrupt[i]);
- }
---- linux-2.6.0/arch/i386/kernel/init_task.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/init_task.c 2003-12-28 23:26:36.000000000 -0800
-@@ -26,7 +26,7 @@ EXPORT_SYMBOL(init_mm);
- */
- union thread_union init_thread_union
- __attribute__((__section__(".data.init_task"))) =
-- { INIT_THREAD_INFO(init_task) };
-+ { INIT_THREAD_INFO(init_task, init_thread_union) };
-
- /*
- * Initial task structure.
-@@ -44,5 +44,5 @@ EXPORT_SYMBOL(init_task);
- * section. Since TSS's are completely CPU-local, we want them
- * on exact cacheline boundaries, to eliminate cacheline ping-pong.
- */
--struct tss_struct init_tss[NR_CPUS] __cacheline_aligned = { [0 ... NR_CPUS-1] = INIT_TSS };
-+struct tss_struct init_tss[NR_CPUS] __attribute__((__section__(".data.tss"))) = { [0 ... NR_CPUS-1] = INIT_TSS };
-
---- linux-2.6.0/arch/i386/kernel/io_apic.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/io_apic.c 2003-12-28 23:21:44.000000000 -0800
-@@ -76,6 +76,14 @@ static struct irq_pin_list {
- int apic, pin, next;
- } irq_2_pin[PIN_MAP_SIZE];
-
-+#ifdef CONFIG_PCI_USE_VECTOR
-+int vector_irq[NR_IRQS] = { [0 ... NR_IRQS -1] = -1};
-+#define vector_to_irq(vector) \
-+ (platform_legacy_irq(vector) ? vector : vector_irq[vector])
-+#else
-+#define vector_to_irq(vector) (vector)
-+#endif
-+
- /*
- * The common case is 1:1 IRQ<->pin mappings. Sometimes there are
- * shared ISA-space IRQs, so we have to support them. We are super
-@@ -249,7 +257,7 @@ static void clear_IO_APIC (void)
- clear_IO_APIC_pin(apic, pin);
- }
-
--static void set_ioapic_affinity(unsigned int irq, cpumask_t cpumask)
-+static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t cpumask)
- {
- unsigned long flags;
- int pin;
-@@ -288,7 +296,7 @@ static void set_ioapic_affinity(unsigned
-
- extern cpumask_t irq_affinity[NR_IRQS];
-
--static cpumask_t __cacheline_aligned pending_irq_balance_cpumask[NR_IRQS];
-+cpumask_t __cacheline_aligned pending_irq_balance_cpumask[NR_IRQS];
-
- #define IRQBALANCE_CHECK_ARCH -999
- static int irqbalance_disabled = IRQBALANCE_CHECK_ARCH;
-@@ -670,13 +678,11 @@ static int __init irqbalance_disable(cha
-
- __setup("noirqbalance", irqbalance_disable);
-
--static void set_ioapic_affinity(unsigned int irq, cpumask_t mask);
--
- static inline void move_irq(int irq)
- {
- /* note - we hold the desc->lock */
- if (unlikely(!cpus_empty(pending_irq_balance_cpumask[irq]))) {
-- set_ioapic_affinity(irq, pending_irq_balance_cpumask[irq]);
-+ set_ioapic_affinity_irq(irq, pending_irq_balance_cpumask[irq]);
- cpus_clear(pending_irq_balance_cpumask[irq]);
- }
- }
-@@ -853,7 +859,7 @@ void __init setup_ioapic_dest(cpumask_t
- if (irq_entry == -1)
- continue;
- irq = pin_2_irq(irq_entry, ioapic, pin);
-- set_ioapic_affinity(irq, mask);
-+ set_ioapic_affinity_irq(irq, mask);
- }
-
- }
-@@ -1141,7 +1147,8 @@ static inline int IO_APIC_irq_trigger(in
- /* irq_vectors is indexed by the sum of all RTEs in all I/O APICs. */
- u8 irq_vector[NR_IRQ_VECTORS] = { FIRST_DEVICE_VECTOR , 0 };
-
--static int __init assign_irq_vector(int irq)
-+#ifndef CONFIG_PCI_USE_VECTOR
-+int __init assign_irq_vector(int irq)
- {
- static int current_vector = FIRST_DEVICE_VECTOR, offset = 0;
- BUG_ON(irq >= NR_IRQ_VECTORS);
-@@ -1158,11 +1165,36 @@ next:
- }
-
- IO_APIC_VECTOR(irq) = current_vector;
-+
- return current_vector;
- }
-+#endif
-+
-+static struct hw_interrupt_type ioapic_level_type;
-+static struct hw_interrupt_type ioapic_edge_type;
-
--static struct hw_interrupt_type ioapic_level_irq_type;
--static struct hw_interrupt_type ioapic_edge_irq_type;
-+#define IOAPIC_AUTO -1
-+#define IOAPIC_EDGE 0
-+#define IOAPIC_LEVEL 1
-+
-+static inline void ioapic_register_intr(int irq, int vector, unsigned long trigger)
-+{
-+ if (use_pci_vector() && !platform_legacy_irq(irq)) {
-+ if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
-+ trigger == IOAPIC_LEVEL)
-+ irq_desc[vector].handler = &ioapic_level_type;
-+ else
-+ irq_desc[vector].handler = &ioapic_edge_type;
-+ set_intr_gate(vector, interrupt[vector]);
-+ } else {
-+ if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
-+ trigger == IOAPIC_LEVEL)
-+ irq_desc[irq].handler = &ioapic_level_type;
-+ else
-+ irq_desc[irq].handler = &ioapic_edge_type;
-+ set_intr_gate(vector, interrupt[irq]);
-+ }
-+}
-
- void __init setup_IO_APIC_irqs(void)
- {
-@@ -1220,13 +1252,7 @@ void __init setup_IO_APIC_irqs(void)
- if (IO_APIC_IRQ(irq)) {
- vector = assign_irq_vector(irq);
- entry.vector = vector;
--
-- if (IO_APIC_irq_trigger(irq))
-- irq_desc[irq].handler = &ioapic_level_irq_type;
-- else
-- irq_desc[irq].handler = &ioapic_edge_irq_type;
--
-- set_intr_gate(vector, interrupt[irq]);
-+ ioapic_register_intr(irq, vector, IOAPIC_AUTO);
-
- if (!apic && (irq < 16))
- disable_8259A_irq(irq);
-@@ -1273,7 +1299,7 @@ void __init setup_ExtINT_IRQ0_pin(unsign
- * The timer IRQ doesn't have to know that behind the
- * scene we have a 8259A-master in AEOI mode ...
- */
-- irq_desc[0].handler = &ioapic_edge_irq_type;
-+ irq_desc[0].handler = &ioapic_edge_type;
-
- /*
- * Add it to the IO-APIC irq-routing table:
-@@ -1624,10 +1650,6 @@ static void __init setup_ioapic_ids_from
- unsigned char old_id;
- unsigned long flags;
-
-- if (acpi_ioapic)
-- /* This gets done during IOAPIC enumeration for ACPI. */
-- return;
--
- /*
- * This is broken; anything with a real cpu count has to
- * circumvent this idiocy regardless.
-@@ -1763,9 +1785,6 @@ static int __init timer_irq_works(void)
- * that was delayed but this is now handled in the device
- * independent code.
- */
--#define enable_edge_ioapic_irq unmask_IO_APIC_irq
--
--static void disable_edge_ioapic_irq (unsigned int irq) { /* nothing */ }
-
- /*
- * Starting up a edge-triggered IO-APIC interrupt is
-@@ -1776,7 +1795,6 @@ static void disable_edge_ioapic_irq (uns
- * This is not complete - we should be able to fake
- * an edge even if it isn't on the 8259A...
- */
--
- static unsigned int startup_edge_ioapic_irq(unsigned int irq)
- {
- int was_pending = 0;
-@@ -1794,8 +1812,6 @@ static unsigned int startup_edge_ioapic_
- return was_pending;
- }
-
--#define shutdown_edge_ioapic_irq disable_edge_ioapic_irq
--
- /*
- * Once we have recorded IRQ_PENDING already, we can mask the
- * interrupt for real. This prevents IRQ storms from unhandled
-@@ -1810,9 +1826,6 @@ static void ack_edge_ioapic_irq(unsigned
- ack_APIC_irq();
- }
-
--static void end_edge_ioapic_irq (unsigned int i) { /* nothing */ }
--
--
- /*
- * Level triggered interrupts can just be masked,
- * and shutting down and starting up the interrupt
-@@ -1834,10 +1847,6 @@ static unsigned int startup_level_ioapic
- return 0; /* don't check for pending */
- }
-
--#define shutdown_level_ioapic_irq mask_IO_APIC_irq
--#define enable_level_ioapic_irq unmask_IO_APIC_irq
--#define disable_level_ioapic_irq mask_IO_APIC_irq
--
- static void end_level_ioapic_irq (unsigned int irq)
- {
- unsigned long v;
-@@ -1864,6 +1873,7 @@ static void end_level_ioapic_irq (unsign
- * The idea is from Manfred Spraul. --macro
- */
- i = IO_APIC_VECTOR(irq);
-+
- v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
-
- ack_APIC_irq();
-@@ -1898,7 +1908,57 @@ static void end_level_ioapic_irq (unsign
- }
- }
-
--static void mask_and_ack_level_ioapic_irq (unsigned int irq) { /* nothing */ }
-+#ifdef CONFIG_PCI_USE_VECTOR
-+static unsigned int startup_edge_ioapic_vector(unsigned int vector)
-+{
-+ int irq = vector_to_irq(vector);
-+
-+ return startup_edge_ioapic_irq(irq);
-+}
-+
-+static void ack_edge_ioapic_vector(unsigned int vector)
-+{
-+ int irq = vector_to_irq(vector);
-+
-+ ack_edge_ioapic_irq(irq);
-+}
-+
-+static unsigned int startup_level_ioapic_vector (unsigned int vector)
-+{
-+ int irq = vector_to_irq(vector);
-+
-+ return startup_level_ioapic_irq (irq);
-+}
-+
-+static void end_level_ioapic_vector (unsigned int vector)
-+{
-+ int irq = vector_to_irq(vector);
-+
-+ end_level_ioapic_irq(irq);
-+}
-+
-+static void mask_IO_APIC_vector (unsigned int vector)
-+{
-+ int irq = vector_to_irq(vector);
-+
-+ mask_IO_APIC_irq(irq);
-+}
-+
-+static void unmask_IO_APIC_vector (unsigned int vector)
-+{
-+ int irq = vector_to_irq(vector);
-+
-+ unmask_IO_APIC_irq(irq);
-+}
-+
-+static void set_ioapic_affinity_vector (unsigned int vector,
-+ cpumask_t cpu_mask)
-+{
-+ int irq = vector_to_irq(vector);
-+
-+ set_ioapic_affinity_irq(irq, cpu_mask);
-+}
-+#endif
-
- /*
- * Level and edge triggered IO-APIC interrupts need different handling,
-@@ -1908,26 +1968,25 @@ static void mask_and_ack_level_ioapic_ir
- * edge-triggered handler, without risking IRQ storms and other ugly
- * races.
- */
--
--static struct hw_interrupt_type ioapic_edge_irq_type = {
-+static struct hw_interrupt_type ioapic_edge_type = {
- .typename = "IO-APIC-edge",
-- .startup = startup_edge_ioapic_irq,
-- .shutdown = shutdown_edge_ioapic_irq,
-- .enable = enable_edge_ioapic_irq,
-- .disable = disable_edge_ioapic_irq,
-- .ack = ack_edge_ioapic_irq,
-- .end = end_edge_ioapic_irq,
-+ .startup = startup_edge_ioapic,
-+ .shutdown = shutdown_edge_ioapic,
-+ .enable = enable_edge_ioapic,
-+ .disable = disable_edge_ioapic,
-+ .ack = ack_edge_ioapic,
-+ .end = end_edge_ioapic,
- .set_affinity = set_ioapic_affinity,
- };
-
--static struct hw_interrupt_type ioapic_level_irq_type = {
-+static struct hw_interrupt_type ioapic_level_type = {
- .typename = "IO-APIC-level",
-- .startup = startup_level_ioapic_irq,
-- .shutdown = shutdown_level_ioapic_irq,
-- .enable = enable_level_ioapic_irq,
-- .disable = disable_level_ioapic_irq,
-- .ack = mask_and_ack_level_ioapic_irq,
-- .end = end_level_ioapic_irq,
-+ .startup = startup_level_ioapic,
-+ .shutdown = shutdown_level_ioapic,
-+ .enable = enable_level_ioapic,
-+ .disable = disable_level_ioapic,
-+ .ack = mask_and_ack_level_ioapic,
-+ .end = end_level_ioapic,
- .set_affinity = set_ioapic_affinity,
- };
-
-@@ -1947,7 +2006,13 @@ static inline void init_IO_APIC_traps(vo
- * 0x80, because int 0x80 is hm, kind of importantish. ;)
- */
- for (irq = 0; irq < NR_IRQS ; irq++) {
-- if (IO_APIC_IRQ(irq) && !IO_APIC_VECTOR(irq)) {
-+ int tmp = irq;
-+ if (use_pci_vector()) {
-+ if (!platform_legacy_irq(tmp))
-+ if ((tmp = vector_to_irq(tmp)) == -1)
-+ continue;
-+ }
-+ if (IO_APIC_IRQ(tmp) && !IO_APIC_VECTOR(tmp)) {
- /*
- * Hmm.. We don't have an entry for this,
- * so default to an old-fashioned 8259
-@@ -2217,12 +2282,14 @@ void __init setup_IO_APIC(void)
- /*
- * Set up IO-APIC IRQ routing.
- */
-- setup_ioapic_ids_from_mpc();
-+ if (!acpi_ioapic)
-+ setup_ioapic_ids_from_mpc();
- sync_Arb_IDs();
- setup_IO_APIC_irqs();
- init_IO_APIC_traps();
- check_timer();
-- print_IO_APIC();
-+ if (!acpi_ioapic)
-+ print_IO_APIC();
- }
-
- /*
-@@ -2379,10 +2446,12 @@ int io_apic_set_pci_routing (int ioapic,
- "IRQ %d Mode:%i Active:%i)\n", ioapic,
- mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq, edge_level, active_high_low);
-
-+ if (use_pci_vector() && !platform_legacy_irq(irq))
-+ irq = IO_APIC_VECTOR(irq);
- if (edge_level) {
-- irq_desc[irq].handler = &ioapic_level_irq_type;
-+ irq_desc[irq].handler = &ioapic_level_type;
- } else {
-- irq_desc[irq].handler = &ioapic_edge_irq_type;
-+ irq_desc[irq].handler = &ioapic_edge_type;
- }
-
- set_intr_gate(entry.vector, interrupt[irq]);
---- linux-2.6.0/arch/i386/kernel/irq.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/irq.c 2003-12-28 23:22:10.000000000 -0800
-@@ -138,17 +138,19 @@ atomic_t irq_mis_count;
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i, j;
-+ int i = *(loff_t *) v, j;
- struct irqaction * action;
- unsigned long flags;
-
-- seq_printf(p, " ");
-- for (j=0; j<NR_CPUS; j++)
-- if (cpu_online(j))
-- seq_printf(p, "CPU%d ",j);
-- seq_putc(p, '\n');
-+ if (i == 0) {
-+ seq_printf(p, " ");
-+ for (j=0; j<NR_CPUS; j++)
-+ if (cpu_online(j))
-+ seq_printf(p, "CPU%d ",j);
-+ seq_putc(p, '\n');
-+ }
-
-- for (i = 0 ; i < NR_IRQS ; i++) {
-+ if (i < NR_IRQS) {
- spin_lock_irqsave(&irq_desc[i].lock, flags);
- action = irq_desc[i].action;
- if (!action)
-@@ -170,28 +172,32 @@ int show_interrupts(struct seq_file *p,
- seq_putc(p, '\n');
- skip:
- spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-- }
-- seq_printf(p, "NMI: ");
-- for (j = 0; j < NR_CPUS; j++)
-- if (cpu_online(j))
-- seq_printf(p, "%10u ", nmi_count(j));
-- seq_putc(p, '\n');
-+ } else if (i == NR_IRQS) {
-+ seq_printf(p, "NMI: ");
-+ for (j = 0; j < NR_CPUS; j++)
-+ if (cpu_online(j))
-+ seq_printf(p, "%10u ", nmi_count(j));
-+ seq_putc(p, '\n');
- #ifdef CONFIG_X86_LOCAL_APIC
-- seq_printf(p, "LOC: ");
-- for (j = 0; j < NR_CPUS; j++)
-- if (cpu_online(j))
-- seq_printf(p, "%10u ", irq_stat[j].apic_timer_irqs);
-- seq_putc(p, '\n');
-+ seq_printf(p, "LOC: ");
-+ for (j = 0; j < NR_CPUS; j++)
-+ if (cpu_online(j))
-+ seq_printf(p, "%10u ", irq_stat[j].apic_timer_irqs);
-+ seq_putc(p, '\n');
- #endif
-- seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
-+ seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
- #ifdef CONFIG_X86_IO_APIC
- #ifdef APIC_MISMATCH_DEBUG
-- seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
-+ seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
- #endif
- #endif
-+ }
- return 0;
- }
-
-+
-+
-+
- #ifdef CONFIG_SMP
- inline void synchronize_irq(unsigned int irq)
- {
-@@ -502,6 +508,8 @@ out:
-
- irq_exit();
-
-+ kgdb_process_breakpoint();
-+
- return 1;
- }
-
-@@ -898,48 +906,6 @@ int setup_irq(unsigned int irq, struct i
- static struct proc_dir_entry * root_irq_dir;
- static struct proc_dir_entry * irq_dir [NR_IRQS];
-
--#define HEX_DIGITS (2*sizeof(cpumask_t))
--
--static unsigned int parse_hex_value(const char __user *buffer,
-- unsigned long count, cpumask_t *ret)
--{
-- unsigned char hexnum[HEX_DIGITS];
-- cpumask_t value = CPU_MASK_NONE;
-- int i;
--
-- if (!count)
-- return -EINVAL;
-- if (count > HEX_DIGITS)
-- count = HEX_DIGITS;
-- if (copy_from_user(hexnum, buffer, count))
-- return -EFAULT;
--
-- /*
-- * Parse the first HEX_DIGITS characters as a hex string, any non-hex char
-- * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-- */
--
-- for (i = 0; i < count; i++) {
-- unsigned int c = hexnum[i];
-- int k;
--
-- switch (c) {
-- case '0' ... '9': c -= '0'; break;
-- case 'a' ... 'f': c -= 'a'-10; break;
-- case 'A' ... 'F': c -= 'A'-10; break;
-- default:
-- goto out;
-- }
-- cpus_shift_left(value, value, 4);
-- for (k = 0; k < 4; ++k)
-- if (test_bit(k, (unsigned long *)&c))
-- cpu_set(k, value);
-- }
--out:
-- *ret = value;
-- return 0;
--}
--
- #ifdef CONFIG_SMP
-
- static struct proc_dir_entry *smp_affinity_entry[NR_IRQS];
-@@ -949,20 +915,10 @@ cpumask_t irq_affinity[NR_IRQS] = { [0 .
- static int irq_affinity_read_proc(char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
-- int k, len;
-- cpumask_t tmp = irq_affinity[(long)data];
--
-- if (count < HEX_DIGITS+1)
-+ int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
-+ if (count - len < 2)
- return -EINVAL;
--
-- len = 0;
-- for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-- int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-- len += j;
-- page += j;
-- cpus_shift_right(tmp, tmp, 16);
-- }
-- len += sprintf(page, "\n");
-+ len += sprintf(page + len, "\n");
- return len;
- }
-
-@@ -975,7 +931,7 @@ static int irq_affinity_write_proc(struc
- if (!irq_desc[irq].handler->set_affinity)
- return -EIO;
-
-- err = parse_hex_value(buffer, count, &new_value);
-+ err = cpumask_parse(buffer, count, new_value);
- if (err)
- return err;
-
-@@ -1000,10 +956,11 @@ static int irq_affinity_write_proc(struc
- static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
-- unsigned long *mask = (unsigned long *) data;
-- if (count < HEX_DIGITS+1)
-+ int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
-+ if (count - len < 2)
- return -EINVAL;
-- return sprintf (page, "%08lx\n", *mask);
-+ len += sprintf(page + len, "\n");
-+ return len;
- }
-
- static int prof_cpu_mask_write_proc (struct file *file, const char __user *buffer,
-@@ -1013,7 +970,7 @@ static int prof_cpu_mask_write_proc (str
- unsigned long full_count = count, err;
- cpumask_t new_value;
-
-- err = parse_hex_value(buffer, count, &new_value);
-+ err = cpumask_parse(buffer, count, new_value);
- if (err)
- return err;
-
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/arch/i386/kernel/kgdb_stub.c 2003-12-28 23:21:09.000000000 -0800
-@@ -0,0 +1,2457 @@
-+/*
-+ *
-+ * 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 the
-+ * Free Software Foundation; either version 2, or (at your option) any
-+ * later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ */
-+
-+/*
-+ * Copyright (c) 2000 VERITAS Software Corporation.
-+ *
-+ */
-+/****************************************************************************
-+ * Header: remcom.c,v 1.34 91/03/09 12:29:49 glenne Exp $
-+ *
-+ * Module name: remcom.c $
-+ * Revision: 1.34 $
-+ * Date: 91/03/09 12:29:49 $
-+ * Contributor: Lake Stevens Instrument Division$
-+ *
-+ * Description: low level support for gdb debugger. $
-+ *
-+ * Considerations: only works on target hardware $
-+ *
-+ * Written by: Glenn Engel $
-+ * Updated by: David Grothe <dave@gcom.com>
-+ * Updated by: Robert Walsh <rjwalsh@durables.org>
-+ * Updated by: wangdi <wangdi@clusterfs.com>
-+ * ModuleState: Experimental $
-+ *
-+ * NOTES: See Below $
-+ *
-+ * Modified for 386 by Jim Kingdon, Cygnus Support.
-+ * Compatibility with 2.1.xx kernel by David Grothe <dave@gcom.com>
-+ *
-+ * Changes to allow auto initilization. All that is needed is that it
-+ * be linked with the kernel and a break point (int 3) be executed.
-+ * The header file <asm/kgdb.h> defines BREAKPOINT to allow one to do
-+ * this. It should also be possible, once the interrupt system is up, to
-+ * call putDebugChar("+"). Once this is done, the remote debugger should
-+ * get our attention by sending a ^C in a packet. George Anzinger
-+ * <george@mvista.com>
-+ * Integrated into 2.2.5 kernel by Tigran Aivazian <tigran@sco.com>
-+ * Added thread support, support for multiple processors,
-+ * support for ia-32(x86) hardware debugging.
-+ * Amit S. Kale ( akale@veritas.com )
-+ *
-+ * Modified to support debugging over ethernet by Robert Walsh
-+ * <rjwalsh@durables.org> and wangdi <wangdi@clusterfs.com>, based on
-+ * code by San Mehat.
-+ *
-+ *
-+ * To enable debugger support, two things need to happen. One, a
-+ * call to set_debug_traps() is necessary in order to allow any breakpoints
-+ * or error conditions to be properly intercepted and reported to gdb.
-+ * Two, a breakpoint needs to be generated to begin communication. This
-+ * is most easily accomplished by a call to breakpoint(). Breakpoint()
-+ * simulates a breakpoint by executing an int 3.
-+ *
-+ *************
-+ *
-+ * The following gdb commands are supported:
-+ *
-+ * command function Return value
-+ *
-+ * g return the value of the CPU registers hex data or ENN
-+ * G set the value of the CPU registers OK or ENN
-+ *
-+ * mAA..AA,LLLL Read LLLL bytes at address AA..AA hex data or ENN
-+ * MAA..AA,LLLL: Write LLLL bytes at address AA.AA OK or ENN
-+ *
-+ * c Resume at current address SNN ( signal NN)
-+ * cAA..AA Continue at address AA..AA SNN
-+ *
-+ * s Step one instruction SNN
-+ * sAA..AA Step one instruction from AA..AA SNN
-+ *
-+ * k kill
-+ *
-+ * ? What was the last sigval ? SNN (signal NN)
-+ *
-+ * All commands and responses are sent with a packet which includes a
-+ * checksum. A packet consists of
-+ *
-+ * $<packet info>#<checksum>.
-+ *
-+ * where
-+ * <packet info> :: <characters representing the command or response>
-+ * <checksum> :: < two hex digits computed as modulo 256 sum of <packetinfo>>
-+ *
-+ * When a packet is received, it is first acknowledged with either '+' or '-'.
-+ * '+' indicates a successful transfer. '-' indicates a failed transfer.
-+ *
-+ * Example:
-+ *
-+ * Host: Reply:
-+ * $m0,10#2a +$00010203040506070809101112131415#42
-+ *
-+ ****************************************************************************/
-+#define KGDB_VERSION "<20030915.1651.33>"
-+#include <linux/config.h>
-+#include <linux/types.h>
-+#include <asm/string.h> /* for strcpy */
-+#include <linux/kernel.h>
-+#include <linux/sched.h>
-+#include <asm/vm86.h>
-+#include <asm/system.h>
-+#include <asm/ptrace.h> /* for linux pt_regs struct */
-+#include <asm/kgdb_local.h>
-+#include <linux/list.h>
-+#include <asm/atomic.h>
-+#include <asm/processor.h>
-+#include <linux/irq.h>
-+#include <asm/desc.h>
-+#include <linux/inet.h>
-+#include <linux/netpoll.h>
-+
-+/************************************************************************
-+ *
-+ * external low-level support routines
-+ */
-+typedef void (*Function) (void); /* pointer to a function */
-+
-+/* Thread reference */
-+typedef unsigned char threadref[8];
-+
-+extern int tty_putDebugChar(int); /* write a single character */
-+extern int tty_getDebugChar(void); /* read and return a single char */
-+extern void tty_flushDebugChar(void); /* flush pending characters */
-+extern int eth_putDebugChar(int); /* write a single character */
-+extern int eth_getDebugChar(void); /* read and return a single char */
-+extern void eth_flushDebugChar(void); /* flush pending characters */
-+
-+/************************************************************************/
-+/* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/
-+/* at least NUMREGBYTES*2 are needed for register packets */
-+/* Longer buffer is needed to list all threads */
-+#define BUFMAX 400
-+
-+char *kgdb_version = KGDB_VERSION;
-+
-+/* debug > 0 prints ill-formed commands in valid packets & checksum errors */
-+int debug_regs = 0; /* set to non-zero to print registers */
-+
-+/* filled in by an external module */
-+char *gdb_module_offsets;
-+
-+static const char hexchars[] = "0123456789abcdef";
-+
-+/* Number of bytes of registers. */
-+#define NUMREGBYTES 64
-+/*
-+ * Note that this register image is in a different order than
-+ * the register image that Linux produces at interrupt time.
-+ *
-+ * Linux's register image is defined by struct pt_regs in ptrace.h.
-+ * Just why GDB uses a different order is a historical mystery.
-+ */
-+enum regnames { _EAX, /* 0 */
-+ _ECX, /* 1 */
-+ _EDX, /* 2 */
-+ _EBX, /* 3 */
-+ _ESP, /* 4 */
-+ _EBP, /* 5 */
-+ _ESI, /* 6 */
-+ _EDI, /* 7 */
-+ _PC /* 8 also known as eip */ ,
-+ _PS /* 9 also known as eflags */ ,
-+ _CS, /* 10 */
-+ _SS, /* 11 */
-+ _DS, /* 12 */
-+ _ES, /* 13 */
-+ _FS, /* 14 */
-+ _GS /* 15 */
-+};
-+
-+/*************************** ASSEMBLY CODE MACROS *************************/
-+/*
-+ * Put the error code here just in case the user cares.
-+ * Likewise, the vector number here (since GDB only gets the signal
-+ * number through the usual means, and that's not very specific).
-+ * The called_from is the return address so he can tell how we entered kgdb.
-+ * This will allow him to seperate out the various possible entries.
-+ */
-+#define REMOTE_DEBUG 0 /* set != to turn on printing (also available in info) */
-+
-+#define PID_MAX PID_MAX_DEFAULT
-+
-+#ifdef CONFIG_SMP
-+void smp_send_nmi_allbutself(void);
-+#define IF_SMP(x) x
-+#undef MAX_NO_CPUS
-+#ifndef CONFIG_NO_KGDB_CPUS
-+#define CONFIG_NO_KGDB_CPUS 2
-+#endif
-+#if CONFIG_NO_KGDB_CPUS > NR_CPUS
-+#define MAX_NO_CPUS NR_CPUS
-+#else
-+#define MAX_NO_CPUS CONFIG_NO_KGDB_CPUS
-+#endif
-+#define hold_init hold_on_sstep: 1,
-+#define MAX_CPU_MASK (unsigned long)((1LL << MAX_NO_CPUS) - 1LL)
-+#define NUM_CPUS num_online_cpus()
-+#else
-+#define IF_SMP(x)
-+#define hold_init
-+#undef MAX_NO_CPUS
-+#define MAX_NO_CPUS 1
-+#define NUM_CPUS 1
-+#endif
-+#define NOCPU (struct task_struct *)0xbad1fbad
-+/* *INDENT-OFF* */
-+struct kgdb_info {
-+ int used_malloc;
-+ void *called_from;
-+ long long entry_tsc;
-+ int errcode;
-+ int vector;
-+ int print_debug_info;
-+#ifdef CONFIG_SMP
-+ int hold_on_sstep;
-+ struct {
-+ volatile struct task_struct *task;
-+ int pid;
-+ int hold;
-+ struct pt_regs *regs;
-+ } cpus_waiting[MAX_NO_CPUS];
-+#endif
-+} kgdb_info = {hold_init print_debug_info:REMOTE_DEBUG, vector:-1};
-+
-+/* *INDENT-ON* */
-+
-+#define used_m kgdb_info.used_malloc
-+/*
-+ * This is little area we set aside to contain the stack we
-+ * need to build to allow gdb to call functions. We use one
-+ * per cpu to avoid locking issues. We will do all this work
-+ * with interrupts off so that should take care of the protection
-+ * issues.
-+ */
-+#define LOOKASIDE_SIZE 200 /* should be more than enough */
-+#define MALLOC_MAX 200 /* Max malloc size */
-+struct {
-+ unsigned int esp;
-+ int array[LOOKASIDE_SIZE];
-+} fn_call_lookaside[MAX_NO_CPUS];
-+
-+static int trap_cpu;
-+static unsigned int OLD_esp;
-+
-+#define END_OF_LOOKASIDE &fn_call_lookaside[trap_cpu].array[LOOKASIDE_SIZE]
-+#define IF_BIT 0x200
-+#define TF_BIT 0x100
-+
-+#define MALLOC_ROUND 8-1
-+
-+static char malloc_array[MALLOC_MAX];
-+IF_SMP(static void to_gdb(const char *mess));
-+void *
-+malloc(int size)
-+{
-+
-+ if (size <= (MALLOC_MAX - used_m)) {
-+ int old_used = used_m;
-+ used_m += ((size + MALLOC_ROUND) & (~MALLOC_ROUND));
-+ return &malloc_array[old_used];
-+ } else {
-+ return NULL;
-+ }
-+}
-+
-+/*
-+ * I/O dispatch functions...
-+ * Based upon kgdboe, either call the ethernet
-+ * handler or the serial one..
-+ */
-+void
-+putDebugChar(int c)
-+{
-+ if (!kgdboe) {
-+ tty_putDebugChar(c);
-+ } else {
-+ eth_putDebugChar(c);
-+ }
-+}
-+
-+int
-+getDebugChar(void)
-+{
-+ if (!kgdboe) {
-+ return tty_getDebugChar();
-+ } else {
-+ return eth_getDebugChar();
-+ }
-+}
-+
-+void
-+flushDebugChar(void)
-+{
-+ if (!kgdboe) {
-+ tty_flushDebugChar();
-+ } else {
-+ eth_flushDebugChar();
-+ }
-+}
-+
-+/*