ia64/xen-unstable
changeset 3072:13728122c78d
bitkeeper revision 1.1159.170.54 (419e7f06-36S2lyohmyuihtqxCvkfg)
Merge arcadians.cl.cam.ac.uk:/auto/groups/xeno-xenod/BK/xen-2.0-testing.bk
into arcadians.cl.cam.ac.uk:/auto/groups/xeno/users/cl349/BK/xen-2.0-linux.bk
Merge arcadians.cl.cam.ac.uk:/auto/groups/xeno-xenod/BK/xen-2.0-testing.bk
into arcadians.cl.cam.ac.uk:/auto/groups/xeno/users/cl349/BK/xen-2.0-linux.bk
line diff
1.1 --- a/.rootkeys Fri Nov 19 23:16:02 2004 +0000 1.2 +++ b/.rootkeys Fri Nov 19 23:17:26 2004 +0000 1.3 @@ -112,6 +112,7 @@ 3e5a4e68mTr0zcp9SXDbnd-XLrrfxw linux-2.4 1.4 3f1056a9L_kqHcFheV00KbKBzv9j5w linux-2.4.27-xen-sparse/include/asm-xen/vga.h 1.5 40659defgWA92arexpMGn8X3QMDj3w linux-2.4.27-xen-sparse/include/asm-xen/xor.h 1.6 3f056927gMHl7mWB89rb73JahbhQIA linux-2.4.27-xen-sparse/include/linux/blk.h 1.7 +419e0488SBzS3mdUhwgsES5a5e3abA linux-2.4.27-xen-sparse/include/linux/irq.h 1.8 4124f66fPHG6yvB_vXmesjvzrJ3yMg linux-2.4.27-xen-sparse/include/linux/mm.h 1.9 401c0590D_kwJDU59X8NyvqSv_Cl2A linux-2.4.27-xen-sparse/include/linux/sched.h 1.10 40a248afgI0_JKthdYAe8beVfXSTpQ linux-2.4.27-xen-sparse/include/linux/skbuff.h 1.11 @@ -127,131 +128,129 @@ 409ba2e7akOFqQUg6Qyg2s28xcXiMg linux-2.4 1.12 3e5a4e683HKVU-sxtagrDasRB8eBVw linux-2.4.27-xen-sparse/mm/swapfile.c 1.13 41180721bNns9Na7w1nJ0ZVt8bhUNA linux-2.4.27-xen-sparse/mm/vmalloc.c 1.14 41505c57WAd5l1rlfCLNSCpx9J13vA linux-2.4.27-xen-sparse/net/core/skbuff.c 1.15 -40f562372u3A7_kfbYYixPHJJxYUxA linux-2.6.9-xen-sparse/arch/xen/Kconfig 1.16 -40f56237utH41NPukqHksuNf29IC9A linux-2.6.9-xen-sparse/arch/xen/Kconfig.drivers 1.17 -40f56237penAAlWVBVDpeQZNFIg8CA linux-2.6.9-xen-sparse/arch/xen/Makefile 1.18 -40f56237JTc60m1FRlUxkUaGSQKrNw linux-2.6.9-xen-sparse/arch/xen/boot/Makefile 1.19 -40f56237hRxbacU_3PdoAl6DjZ3Jnw linux-2.6.9-xen-sparse/arch/xen/configs/xen0_defconfig 1.20 -40f56237wubfjJKlfIzZlI3ZM2VgGA linux-2.6.9-xen-sparse/arch/xen/configs/xenU_defconfig 1.21 -40f56237Mta0yHNaMS_qtM2rge0qYA linux-2.6.9-xen-sparse/arch/xen/i386/Kconfig 1.22 -40f56238u2CJdXNpjsZgHBxeVyY-2g linux-2.6.9-xen-sparse/arch/xen/i386/Makefile 1.23 -40f56238eczveJ86k_4hNxCLRQIF-g linux-2.6.9-xen-sparse/arch/xen/i386/kernel/Makefile 1.24 -40f56238rXVTJQKbBuXXLH52qEArcg linux-2.6.9-xen-sparse/arch/xen/i386/kernel/cpu/Makefile 1.25 -40f562385s4lr6Zg92gExe7UQ4A76Q linux-2.6.9-xen-sparse/arch/xen/i386/kernel/cpu/common.c 1.26 -40f56238XDtHSijkAFlbv1PT8Bhw_Q linux-2.6.9-xen-sparse/arch/xen/i386/kernel/entry.S 1.27 -40f56238bnvciAuyzAiMkdzGErYt1A linux-2.6.9-xen-sparse/arch/xen/i386/kernel/head.S 1.28 -40f58a0d31M2EkuPbG94ns_nOi0PVA linux-2.6.9-xen-sparse/arch/xen/i386/kernel/i386_ksyms.c 1.29 -40faa751_zbZlAmLyQgCXdYekVFdWA linux-2.6.9-xen-sparse/arch/xen/i386/kernel/ioport.c 1.30 -40f562382aC3_Gt4RG-4ZsfvDRUg3Q linux-2.6.9-xen-sparse/arch/xen/i386/kernel/irq.c 1.31 -40f56238ue3YRsK52HG7iccNzP1AwQ linux-2.6.9-xen-sparse/arch/xen/i386/kernel/ldt.c 1.32 -4107adf1cNtsuOxOB4T6paAoY2R2PA linux-2.6.9-xen-sparse/arch/xen/i386/kernel/pci-dma.c 1.33 -40f56238a8iOVDEoostsbun_sy2i4g linux-2.6.9-xen-sparse/arch/xen/i386/kernel/process.c 1.34 -40f56238YQIJoYG2ehDGEcdTgLmGbg linux-2.6.9-xen-sparse/arch/xen/i386/kernel/setup.c 1.35 -40f56238nWMQg7CKbyTy0KJNvCzbtg linux-2.6.9-xen-sparse/arch/xen/i386/kernel/signal.c 1.36 -40f56238UL9uv78ODDzMwLL9yryeFw linux-2.6.9-xen-sparse/arch/xen/i386/kernel/sysenter.c 1.37 -40f56238qVGkpO_ycnQA8k03kQzAgA linux-2.6.9-xen-sparse/arch/xen/i386/kernel/time.c 1.38 -40f56238NzTgeO63RGoxHrW5NQeO3Q linux-2.6.9-xen-sparse/arch/xen/i386/kernel/timers/Makefile 1.39 -40f56238BMqG5PuSHufpjbvp_helBw linux-2.6.9-xen-sparse/arch/xen/i386/kernel/timers/timer_tsc.c 1.40 -40f562389xNa78YBZciUibQjyRU_Lg linux-2.6.9-xen-sparse/arch/xen/i386/kernel/traps.c 1.41 -40f56238qASEI_IOhCKWNuwFKNZrKQ linux-2.6.9-xen-sparse/arch/xen/i386/kernel/vmlinux.lds.S 1.42 -40f56238JypKAUG01ZojFwH7qnZ5uA linux-2.6.9-xen-sparse/arch/xen/i386/kernel/vsyscall.S 1.43 -40f56238wi6AdNQjm0RT57bSkwb6hg linux-2.6.9-xen-sparse/arch/xen/i386/kernel/vsyscall.lds 1.44 -40f56238a3w6-byOzexIlMgni76Lcg linux-2.6.9-xen-sparse/arch/xen/i386/mm/Makefile 1.45 -40f56238ILx8xlbywNbzTdv5Zr4xXQ linux-2.6.9-xen-sparse/arch/xen/i386/mm/fault.c 1.46 -4118cc35CbY8rfGVspF5O-7EkXBEAA linux-2.6.9-xen-sparse/arch/xen/i386/mm/highmem.c 1.47 -40f562383SKvDStdtrvzr5fyCbW4rw linux-2.6.9-xen-sparse/arch/xen/i386/mm/hypervisor.c 1.48 -40f56239xcNylAxuGsQHwi1AyMLV8w linux-2.6.9-xen-sparse/arch/xen/i386/mm/init.c 1.49 -41062ab7CjxC1UBaFhOMWWdhHkIUyg linux-2.6.9-xen-sparse/arch/xen/i386/mm/ioremap.c 1.50 -413b5ab8LIowAnQrEmaOJSdmqm96jQ linux-2.6.9-xen-sparse/arch/xen/i386/mm/pageattr.c 1.51 -40f5623906UYHv1rsVUeRc0tFT0dWw linux-2.6.9-xen-sparse/arch/xen/i386/mm/pgtable.c 1.52 -4107adf12ndy94MidCaivDibJ3pPAg linux-2.6.9-xen-sparse/arch/xen/i386/pci/Makefile 1.53 -4107adf1WcCgkhsdLTRGX52cOG1vJg linux-2.6.9-xen-sparse/arch/xen/i386/pci/direct.c 1.54 -4107adf1s5u6249DNPUViX1YNagbUQ linux-2.6.9-xen-sparse/arch/xen/i386/pci/irq.c 1.55 -40f56239zOksGg_H4XD4ye6iZNtoZA linux-2.6.9-xen-sparse/arch/xen/kernel/Makefile 1.56 -40f56239bvOjuuuViZ0XMlNiREFC0A linux-2.6.9-xen-sparse/arch/xen/kernel/ctrl_if.c 1.57 -40f56238xFQe9T7M_U_FItM-bZIpLw linux-2.6.9-xen-sparse/arch/xen/kernel/evtchn.c 1.58 -4110f478aeQWllIN7J4kouAHiAqrPw linux-2.6.9-xen-sparse/arch/xen/kernel/fixup.c 1.59 -412dfae9eA3_6e6bCGUtg1mj8b56fQ linux-2.6.9-xen-sparse/arch/xen/kernel/gnttab.c 1.60 -40f562392LBhwmOxVPsYdkYXMxI_ZQ linux-2.6.9-xen-sparse/arch/xen/kernel/reboot.c 1.61 -414c113396tK1HTVeUalm3u-1DF16g linux-2.6.9-xen-sparse/arch/xen/kernel/skbuff.c 1.62 -3f68905c5eiA-lBMQSvXLMWS1ikDEA linux-2.6.9-xen-sparse/arch/xen/kernel/xen_proc.c 1.63 -41261688yS8eAyy-7kzG4KBs0xbYCA linux-2.6.9-xen-sparse/drivers/Makefile 1.64 -4108f5c1WfTIrs0HZFeV39sttekCTw linux-2.6.9-xen-sparse/drivers/char/mem.c 1.65 -4111308bZAIzwf_Kzu6x1TZYZ3E0_Q linux-2.6.9-xen-sparse/drivers/char/tty_io.c 1.66 -40f56239Dp_vMTgz8TEbvo1hjHGc3w linux-2.6.9-xen-sparse/drivers/xen/Makefile 1.67 -41768fbcncpBQf8s2l2-CwoSNIZ9uA linux-2.6.9-xen-sparse/drivers/xen/balloon/Makefile 1.68 -3e6377f8i5e9eGz7Pw6fQuhuTQ7DQg linux-2.6.9-xen-sparse/drivers/xen/balloon/balloon.c 1.69 -410d0893otFGghmv4dUXDUBBdY5aIA linux-2.6.9-xen-sparse/drivers/xen/blkback/Makefile 1.70 -4087cf0d1XgMkooTZAiJS6NrcpLQNQ linux-2.6.9-xen-sparse/drivers/xen/blkback/blkback.c 1.71 -4087cf0dZadZ8r6CEt4fNN350Yle3A linux-2.6.9-xen-sparse/drivers/xen/blkback/common.h 1.72 -4087cf0dxlh29iw0w-9rxOCEGCjPcw linux-2.6.9-xen-sparse/drivers/xen/blkback/control.c 1.73 -4087cf0dbuoH20fMjNZjcgrRK-1msQ linux-2.6.9-xen-sparse/drivers/xen/blkback/interface.c 1.74 -4087cf0dk97tacDzxfByWV7JifUYqA linux-2.6.9-xen-sparse/drivers/xen/blkback/vbd.c 1.75 -40f56239Sfle6wGv5FS0wjS_HI150A linux-2.6.9-xen-sparse/drivers/xen/blkfront/Kconfig 1.76 -40f562395atl9x4suKGhPkjqLOXESg linux-2.6.9-xen-sparse/drivers/xen/blkfront/Makefile 1.77 -40f56239-JNIaTzlviVJohVdoYOUpw linux-2.6.9-xen-sparse/drivers/xen/blkfront/blkfront.c 1.78 -40f56239y9naBTXe40Pi2J_z3p-d1g linux-2.6.9-xen-sparse/drivers/xen/blkfront/block.h 1.79 -40f56239BVfPsXBiWQitXgDRtOsiqg linux-2.6.9-xen-sparse/drivers/xen/blkfront/vbd.c 1.80 -40f56239fsLjvtD8YBRAWphps4FDjg linux-2.6.9-xen-sparse/drivers/xen/console/Makefile 1.81 -3e5a4e651TH-SXHoufurnWjgl5bfOA linux-2.6.9-xen-sparse/drivers/xen/console/console.c 1.82 -40f56239KYxO0YabhPzCTeUuln-lnA linux-2.6.9-xen-sparse/drivers/xen/evtchn/Makefile 1.83 -40f56239DoibTX6R-ZYd3QTXAB8_TA linux-2.6.9-xen-sparse/drivers/xen/evtchn/evtchn.c 1.84 -410a9817HEVJvred5Oy_uKH3HFJC5Q linux-2.6.9-xen-sparse/drivers/xen/netback/Makefile 1.85 -4097ba831lpGeLlPg-bfV8XarVVuoQ linux-2.6.9-xen-sparse/drivers/xen/netback/common.h 1.86 -4097ba83wvv8yi5P5xugCUBAdb6O-A linux-2.6.9-xen-sparse/drivers/xen/netback/control.c 1.87 -4097ba83byY5bTSugJGZ1exTxIcMKw linux-2.6.9-xen-sparse/drivers/xen/netback/interface.c 1.88 -4087cf0dGmSbFhFZyIZBJzvqxY-qBw linux-2.6.9-xen-sparse/drivers/xen/netback/netback.c 1.89 -40f56239lrg_Ob0BJ8WBFS1zeg2CYw linux-2.6.9-xen-sparse/drivers/xen/netfront/Kconfig 1.90 -40f56239Wd4k_ycG_mFsSO1r5xKdtQ linux-2.6.9-xen-sparse/drivers/xen/netfront/Makefile 1.91 -405853f6nbeazrNyEWNHBuoSg2PiPA linux-2.6.9-xen-sparse/drivers/xen/netfront/netfront.c 1.92 -4108f5c1ppFXVpQzCOAZ6xXYubsjKA linux-2.6.9-xen-sparse/drivers/xen/privcmd/Makefile 1.93 -3e5a4e65IUfzzMu2kZFlGEB8-rpTaA linux-2.6.9-xen-sparse/drivers/xen/privcmd/privcmd.c 1.94 -412f47e4RKD-R5IS5gEXvcT8L4v8gA linux-2.6.9-xen-sparse/include/asm-generic/pgtable.h 1.95 -40f56239YAjS52QG2FIAQpHDZAdGHg linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/desc.h 1.96 -4107adf1E5O4ztGHNGMzCCNhcvqNow linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/dma-mapping.h 1.97 -40f5623akIoBsQ3KxSB2kufkbgONXQ linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/fixmap.h 1.98 -41979925z1MsKU1SfuuheM1IFDQ_bA linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/floppy.h 1.99 -4118b6a418gnL6AZsTdglC92YGqYTg linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/highmem.h 1.100 -40f5623aJVXQwpJMOLE99XgvGsfQ8Q linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/io.h 1.101 -40f5623aKXkBBxgpLx2NcvkncQ1Yyw linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/mach-xen/irq_vectors.h 1.102 -40f5623aDMCsWOFO0jktZ4e8sjwvEg linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/mach-xen/setup_arch_post.h 1.103 -40f5623arsFXkGdPvIqvFi3yFXGR0Q linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/mach-xen/setup_arch_pre.h 1.104 -4120f807GCO0uqsLqdZj9csxR1Wthw linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/mmu_context.h 1.105 -40f5623aFTyFTR-vdiA-KaGxk5JOKQ linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/msr.h 1.106 -40f5623adgjZq9nAgCt0IXdWl7udSA linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/page.h 1.107 -40f5623a54NuG-7qHihGYmw4wWQnMA linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/param.h 1.108 -41137cc1kkvg0cg7uxddcEfjL7L67w linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/pci.h 1.109 -40f5623atCokYc2uCysSJ8jFO8TEsw linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/pgalloc.h 1.110 -412e01beTwiaC8sYY4XJP8PxLST5CA linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/pgtable-2level-defs.h 1.111 -40f5623aEToIXouJgO-ao5d5pcEt1w linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/pgtable-2level.h 1.112 -40f5623aCCXRPlGpNthVXstGz9ZV3A linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/pgtable.h 1.113 -40f5623aPCkQQfPtJSooGdhcatrvnQ linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/processor.h 1.114 -412ea0afQL2CAI-f522TbLjLPMibPQ linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/ptrace.h 1.115 -40f5623bzLvxr7WoJIxVf2OH4rCBJg linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/segment.h 1.116 -40f5623bG_LzgG6-qwk292nTc5Wabw linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/setup.h 1.117 -40f5623bgzm_9vwxpzJswlAxg298Gg linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/synch_bitops.h 1.118 -40f5623bVdKP7Dt7qm8twu3NcnGNbA linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/system.h 1.119 -40f5623bc8LKPRO09wY5dGDnY_YCpw linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/tlbflush.h 1.120 -41062ab7uFxnCq-KtPeAm-aV8CicgA linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/vga.h 1.121 -40f5623bxUbeGjkRrjDguCy_Gm8RLw linux-2.6.9-xen-sparse/include/asm-xen/asm-i386/xor.h 1.122 -40f5623bYNP7tHE2zX6YQxp9Zq2utQ linux-2.6.9-xen-sparse/include/asm-xen/ctrl_if.h 1.123 -40f5623b3Eqs8pAc5WpPX8_jTzV2qw linux-2.6.9-xen-sparse/include/asm-xen/evtchn.h 1.124 -419b4e9367PjTEvdjwavWN12BeBBXg linux-2.6.9-xen-sparse/include/asm-xen/foreign_page.h 1.125 -412dfaeazclyNDM0cpnp60Yo4xulpQ linux-2.6.9-xen-sparse/include/asm-xen/gnttab.h 1.126 -40f5623aGPlsm0u1LTO-NVZ6AGzNRQ linux-2.6.9-xen-sparse/include/asm-xen/hypervisor.h 1.127 -3f108af1ylCIm82H052FVTfXACBHrw linux-2.6.9-xen-sparse/include/asm-xen/linux-public/privcmd.h 1.128 -3fa8e3f0kBLeE4To2vpdi3cpJbIkbQ linux-2.6.9-xen-sparse/include/asm-xen/linux-public/suspend.h 1.129 -40f5623cndVUFlkxpf7Lfx7xu8madQ linux-2.6.9-xen-sparse/include/asm-xen/multicall.h 1.130 -4122466356eIBnC9ot44WSVVIFyhQA linux-2.6.9-xen-sparse/include/asm-xen/queues.h 1.131 -3f689063BoW-HWV3auUJ-OqXfcGArw linux-2.6.9-xen-sparse/include/asm-xen/xen_proc.h 1.132 -4124d8c4aocX7A-jIbuGraWN84pxGQ linux-2.6.9-xen-sparse/include/linux/bio.h 1.133 -419b4e93z2S0gR17XTy8wg09JEwAhg linux-2.6.9-xen-sparse/include/linux/gfp.h 1.134 -4124f66f4NaKNa0xPiGGykn9QaZk3w linux-2.6.9-xen-sparse/include/linux/skbuff.h 1.135 -40f56a0ddHCSs3501MY4hRf22tctOw linux-2.6.9-xen-sparse/mkbuildtree 1.136 -412f46c0LJuKAgSPGoC0Z1DEkLfuLA linux-2.6.9-xen-sparse/mm/memory.c 1.137 -410a94a4KT6I6X0LVc7djB39tRDp4g linux-2.6.9-xen-sparse/mm/page_alloc.c 1.138 -41505c572m-s9ATiO1LiD1GPznTTIg linux-2.6.9-xen-sparse/net/core/skbuff.c 1.139 -4149ec79wMpIHdvbntxqVGLRZZjPxw linux-2.6.9-xen-sparse/net/ipv4/raw.c 1.140 +40f562372u3A7_kfbYYixPHJJxYUxA linux-2.6.10-rc2-xen-sparse/arch/xen/Kconfig 1.141 +40f56237utH41NPukqHksuNf29IC9A linux-2.6.10-rc2-xen-sparse/arch/xen/Kconfig.drivers 1.142 +40f56237penAAlWVBVDpeQZNFIg8CA linux-2.6.10-rc2-xen-sparse/arch/xen/Makefile 1.143 +40f56237JTc60m1FRlUxkUaGSQKrNw linux-2.6.10-rc2-xen-sparse/arch/xen/boot/Makefile 1.144 +40f56237hRxbacU_3PdoAl6DjZ3Jnw linux-2.6.10-rc2-xen-sparse/arch/xen/configs/xen0_defconfig 1.145 +40f56237wubfjJKlfIzZlI3ZM2VgGA linux-2.6.10-rc2-xen-sparse/arch/xen/configs/xenU_defconfig 1.146 +40f56237Mta0yHNaMS_qtM2rge0qYA linux-2.6.10-rc2-xen-sparse/arch/xen/i386/Kconfig 1.147 +40f56238u2CJdXNpjsZgHBxeVyY-2g linux-2.6.10-rc2-xen-sparse/arch/xen/i386/Makefile 1.148 +40f56238eczveJ86k_4hNxCLRQIF-g linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/Makefile 1.149 +40f56238rXVTJQKbBuXXLH52qEArcg linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/cpu/Makefile 1.150 +40f562385s4lr6Zg92gExe7UQ4A76Q linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/cpu/common.c 1.151 +40f56238XDtHSijkAFlbv1PT8Bhw_Q linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/entry.S 1.152 +40f56238bnvciAuyzAiMkdzGErYt1A linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/head.S 1.153 +40f58a0d31M2EkuPbG94ns_nOi0PVA linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/i386_ksyms.c 1.154 +40faa751_zbZlAmLyQgCXdYekVFdWA linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/ioport.c 1.155 +40f56238ue3YRsK52HG7iccNzP1AwQ linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/ldt.c 1.156 +4107adf1cNtsuOxOB4T6paAoY2R2PA linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/pci-dma.c 1.157 +40f56238a8iOVDEoostsbun_sy2i4g linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/process.c 1.158 +40f56238YQIJoYG2ehDGEcdTgLmGbg linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/setup.c 1.159 +40f56238nWMQg7CKbyTy0KJNvCzbtg linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/signal.c 1.160 +40f56238qVGkpO_ycnQA8k03kQzAgA linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/time.c 1.161 +40f56238NzTgeO63RGoxHrW5NQeO3Q linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/timers/Makefile 1.162 +40f56238BMqG5PuSHufpjbvp_helBw linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/timers/timer_tsc.c 1.163 +40f562389xNa78YBZciUibQjyRU_Lg linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/traps.c 1.164 +40f56238JypKAUG01ZojFwH7qnZ5uA linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/vsyscall.S 1.165 +40f56238wi6AdNQjm0RT57bSkwb6hg linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/vsyscall.lds 1.166 +40f56238a3w6-byOzexIlMgni76Lcg linux-2.6.10-rc2-xen-sparse/arch/xen/i386/mm/Makefile 1.167 +40f56238ILx8xlbywNbzTdv5Zr4xXQ linux-2.6.10-rc2-xen-sparse/arch/xen/i386/mm/fault.c 1.168 +4118cc35CbY8rfGVspF5O-7EkXBEAA linux-2.6.10-rc2-xen-sparse/arch/xen/i386/mm/highmem.c 1.169 +40f562383SKvDStdtrvzr5fyCbW4rw linux-2.6.10-rc2-xen-sparse/arch/xen/i386/mm/hypervisor.c 1.170 +40f56239xcNylAxuGsQHwi1AyMLV8w linux-2.6.10-rc2-xen-sparse/arch/xen/i386/mm/init.c 1.171 +41062ab7CjxC1UBaFhOMWWdhHkIUyg linux-2.6.10-rc2-xen-sparse/arch/xen/i386/mm/ioremap.c 1.172 +413b5ab8LIowAnQrEmaOJSdmqm96jQ linux-2.6.10-rc2-xen-sparse/arch/xen/i386/mm/pageattr.c 1.173 +40f5623906UYHv1rsVUeRc0tFT0dWw linux-2.6.10-rc2-xen-sparse/arch/xen/i386/mm/pgtable.c 1.174 +4107adf12ndy94MidCaivDibJ3pPAg linux-2.6.10-rc2-xen-sparse/arch/xen/i386/pci/Makefile 1.175 +4107adf1WcCgkhsdLTRGX52cOG1vJg linux-2.6.10-rc2-xen-sparse/arch/xen/i386/pci/direct.c 1.176 +4107adf1s5u6249DNPUViX1YNagbUQ linux-2.6.10-rc2-xen-sparse/arch/xen/i386/pci/irq.c 1.177 +40f56239zOksGg_H4XD4ye6iZNtoZA linux-2.6.10-rc2-xen-sparse/arch/xen/kernel/Makefile 1.178 +40f56239bvOjuuuViZ0XMlNiREFC0A linux-2.6.10-rc2-xen-sparse/arch/xen/kernel/ctrl_if.c 1.179 +40f56238xFQe9T7M_U_FItM-bZIpLw linux-2.6.10-rc2-xen-sparse/arch/xen/kernel/evtchn.c 1.180 +4110f478aeQWllIN7J4kouAHiAqrPw linux-2.6.10-rc2-xen-sparse/arch/xen/kernel/fixup.c 1.181 +412dfae9eA3_6e6bCGUtg1mj8b56fQ linux-2.6.10-rc2-xen-sparse/arch/xen/kernel/gnttab.c 1.182 +40f562392LBhwmOxVPsYdkYXMxI_ZQ linux-2.6.10-rc2-xen-sparse/arch/xen/kernel/reboot.c 1.183 +414c113396tK1HTVeUalm3u-1DF16g linux-2.6.10-rc2-xen-sparse/arch/xen/kernel/skbuff.c 1.184 +3f68905c5eiA-lBMQSvXLMWS1ikDEA linux-2.6.10-rc2-xen-sparse/arch/xen/kernel/xen_proc.c 1.185 +41261688yS8eAyy-7kzG4KBs0xbYCA linux-2.6.10-rc2-xen-sparse/drivers/Makefile 1.186 +4108f5c1WfTIrs0HZFeV39sttekCTw linux-2.6.10-rc2-xen-sparse/drivers/char/mem.c 1.187 +4111308bZAIzwf_Kzu6x1TZYZ3E0_Q linux-2.6.10-rc2-xen-sparse/drivers/char/tty_io.c 1.188 +40f56239Dp_vMTgz8TEbvo1hjHGc3w linux-2.6.10-rc2-xen-sparse/drivers/xen/Makefile 1.189 +41768fbcncpBQf8s2l2-CwoSNIZ9uA linux-2.6.10-rc2-xen-sparse/drivers/xen/balloon/Makefile 1.190 +3e6377f8i5e9eGz7Pw6fQuhuTQ7DQg linux-2.6.10-rc2-xen-sparse/drivers/xen/balloon/balloon.c 1.191 +410d0893otFGghmv4dUXDUBBdY5aIA linux-2.6.10-rc2-xen-sparse/drivers/xen/blkback/Makefile 1.192 +4087cf0d1XgMkooTZAiJS6NrcpLQNQ linux-2.6.10-rc2-xen-sparse/drivers/xen/blkback/blkback.c 1.193 +4087cf0dZadZ8r6CEt4fNN350Yle3A linux-2.6.10-rc2-xen-sparse/drivers/xen/blkback/common.h 1.194 +4087cf0dxlh29iw0w-9rxOCEGCjPcw linux-2.6.10-rc2-xen-sparse/drivers/xen/blkback/control.c 1.195 +4087cf0dbuoH20fMjNZjcgrRK-1msQ linux-2.6.10-rc2-xen-sparse/drivers/xen/blkback/interface.c 1.196 +4087cf0dk97tacDzxfByWV7JifUYqA linux-2.6.10-rc2-xen-sparse/drivers/xen/blkback/vbd.c 1.197 +40f56239Sfle6wGv5FS0wjS_HI150A linux-2.6.10-rc2-xen-sparse/drivers/xen/blkfront/Kconfig 1.198 +40f562395atl9x4suKGhPkjqLOXESg linux-2.6.10-rc2-xen-sparse/drivers/xen/blkfront/Makefile 1.199 +40f56239-JNIaTzlviVJohVdoYOUpw linux-2.6.10-rc2-xen-sparse/drivers/xen/blkfront/blkfront.c 1.200 +40f56239y9naBTXe40Pi2J_z3p-d1g linux-2.6.10-rc2-xen-sparse/drivers/xen/blkfront/block.h 1.201 +40f56239BVfPsXBiWQitXgDRtOsiqg linux-2.6.10-rc2-xen-sparse/drivers/xen/blkfront/vbd.c 1.202 +40f56239fsLjvtD8YBRAWphps4FDjg linux-2.6.10-rc2-xen-sparse/drivers/xen/console/Makefile 1.203 +3e5a4e651TH-SXHoufurnWjgl5bfOA linux-2.6.10-rc2-xen-sparse/drivers/xen/console/console.c 1.204 +40f56239KYxO0YabhPzCTeUuln-lnA linux-2.6.10-rc2-xen-sparse/drivers/xen/evtchn/Makefile 1.205 +40f56239DoibTX6R-ZYd3QTXAB8_TA linux-2.6.10-rc2-xen-sparse/drivers/xen/evtchn/evtchn.c 1.206 +410a9817HEVJvred5Oy_uKH3HFJC5Q linux-2.6.10-rc2-xen-sparse/drivers/xen/netback/Makefile 1.207 +4097ba831lpGeLlPg-bfV8XarVVuoQ linux-2.6.10-rc2-xen-sparse/drivers/xen/netback/common.h 1.208 +4097ba83wvv8yi5P5xugCUBAdb6O-A linux-2.6.10-rc2-xen-sparse/drivers/xen/netback/control.c 1.209 +4097ba83byY5bTSugJGZ1exTxIcMKw linux-2.6.10-rc2-xen-sparse/drivers/xen/netback/interface.c 1.210 +4087cf0dGmSbFhFZyIZBJzvqxY-qBw linux-2.6.10-rc2-xen-sparse/drivers/xen/netback/netback.c 1.211 +40f56239lrg_Ob0BJ8WBFS1zeg2CYw linux-2.6.10-rc2-xen-sparse/drivers/xen/netfront/Kconfig 1.212 +40f56239Wd4k_ycG_mFsSO1r5xKdtQ linux-2.6.10-rc2-xen-sparse/drivers/xen/netfront/Makefile 1.213 +405853f6nbeazrNyEWNHBuoSg2PiPA linux-2.6.10-rc2-xen-sparse/drivers/xen/netfront/netfront.c 1.214 +4108f5c1ppFXVpQzCOAZ6xXYubsjKA linux-2.6.10-rc2-xen-sparse/drivers/xen/privcmd/Makefile 1.215 +3e5a4e65IUfzzMu2kZFlGEB8-rpTaA linux-2.6.10-rc2-xen-sparse/drivers/xen/privcmd/privcmd.c 1.216 +412f47e4RKD-R5IS5gEXvcT8L4v8gA linux-2.6.10-rc2-xen-sparse/include/asm-generic/pgtable.h 1.217 +40f56239YAjS52QG2FIAQpHDZAdGHg linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/desc.h 1.218 +4107adf1E5O4ztGHNGMzCCNhcvqNow linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/dma-mapping.h 1.219 +40f5623akIoBsQ3KxSB2kufkbgONXQ linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/fixmap.h 1.220 +41979925z1MsKU1SfuuheM1IFDQ_bA linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/floppy.h 1.221 +4118b6a418gnL6AZsTdglC92YGqYTg linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/highmem.h 1.222 +40f5623aJVXQwpJMOLE99XgvGsfQ8Q linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/io.h 1.223 +40f5623aKXkBBxgpLx2NcvkncQ1Yyw linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/mach-xen/irq_vectors.h 1.224 +40f5623aDMCsWOFO0jktZ4e8sjwvEg linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/mach-xen/setup_arch_post.h 1.225 +40f5623arsFXkGdPvIqvFi3yFXGR0Q linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/mach-xen/setup_arch_pre.h 1.226 +4120f807GCO0uqsLqdZj9csxR1Wthw linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/mmu_context.h 1.227 +40f5623aFTyFTR-vdiA-KaGxk5JOKQ linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/msr.h 1.228 +40f5623adgjZq9nAgCt0IXdWl7udSA linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/page.h 1.229 +40f5623a54NuG-7qHihGYmw4wWQnMA linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/param.h 1.230 +41137cc1kkvg0cg7uxddcEfjL7L67w linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/pci.h 1.231 +40f5623atCokYc2uCysSJ8jFO8TEsw linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/pgalloc.h 1.232 +412e01beTwiaC8sYY4XJP8PxLST5CA linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/pgtable-2level-defs.h 1.233 +40f5623aEToIXouJgO-ao5d5pcEt1w linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/pgtable-2level.h 1.234 +40f5623aCCXRPlGpNthVXstGz9ZV3A linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/pgtable.h 1.235 +40f5623aPCkQQfPtJSooGdhcatrvnQ linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/processor.h 1.236 +412ea0afQL2CAI-f522TbLjLPMibPQ linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/ptrace.h 1.237 +40f5623bzLvxr7WoJIxVf2OH4rCBJg linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/segment.h 1.238 +40f5623bG_LzgG6-qwk292nTc5Wabw linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/setup.h 1.239 +40f5623bgzm_9vwxpzJswlAxg298Gg linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/synch_bitops.h 1.240 +40f5623bVdKP7Dt7qm8twu3NcnGNbA linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/system.h 1.241 +40f5623bc8LKPRO09wY5dGDnY_YCpw linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/tlbflush.h 1.242 +41062ab7uFxnCq-KtPeAm-aV8CicgA linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/vga.h 1.243 +40f5623bxUbeGjkRrjDguCy_Gm8RLw linux-2.6.10-rc2-xen-sparse/include/asm-xen/asm-i386/xor.h 1.244 +40f5623bYNP7tHE2zX6YQxp9Zq2utQ linux-2.6.10-rc2-xen-sparse/include/asm-xen/ctrl_if.h 1.245 +40f5623b3Eqs8pAc5WpPX8_jTzV2qw linux-2.6.10-rc2-xen-sparse/include/asm-xen/evtchn.h 1.246 +419b4e9367PjTEvdjwavWN12BeBBXg linux-2.6.10-rc2-xen-sparse/include/asm-xen/foreign_page.h 1.247 +412dfaeazclyNDM0cpnp60Yo4xulpQ linux-2.6.10-rc2-xen-sparse/include/asm-xen/gnttab.h 1.248 +40f5623aGPlsm0u1LTO-NVZ6AGzNRQ linux-2.6.10-rc2-xen-sparse/include/asm-xen/hypervisor.h 1.249 +3f108af1ylCIm82H052FVTfXACBHrw linux-2.6.10-rc2-xen-sparse/include/asm-xen/linux-public/privcmd.h 1.250 +3fa8e3f0kBLeE4To2vpdi3cpJbIkbQ linux-2.6.10-rc2-xen-sparse/include/asm-xen/linux-public/suspend.h 1.251 +40f5623cndVUFlkxpf7Lfx7xu8madQ linux-2.6.10-rc2-xen-sparse/include/asm-xen/multicall.h 1.252 +4122466356eIBnC9ot44WSVVIFyhQA linux-2.6.10-rc2-xen-sparse/include/asm-xen/queues.h 1.253 +3f689063BoW-HWV3auUJ-OqXfcGArw linux-2.6.10-rc2-xen-sparse/include/asm-xen/xen_proc.h 1.254 +419b4e93z2S0gR17XTy8wg09JEwAhg linux-2.6.10-rc2-xen-sparse/include/linux/gfp.h 1.255 +419dfc609zbti8rqL60tL2dHXQ_rvQ linux-2.6.10-rc2-xen-sparse/include/linux/irq.h 1.256 +4124f66f4NaKNa0xPiGGykn9QaZk3w linux-2.6.10-rc2-xen-sparse/include/linux/skbuff.h 1.257 +419dfc6awx7w88wk6cG9P3mPidX6LQ linux-2.6.10-rc2-xen-sparse/kernel/irq/manage.c 1.258 +40f56a0ddHCSs3501MY4hRf22tctOw linux-2.6.10-rc2-xen-sparse/mkbuildtree 1.259 +412f46c0LJuKAgSPGoC0Z1DEkLfuLA linux-2.6.10-rc2-xen-sparse/mm/memory.c 1.260 +410a94a4KT6I6X0LVc7djB39tRDp4g linux-2.6.10-rc2-xen-sparse/mm/page_alloc.c 1.261 +41505c572m-s9ATiO1LiD1GPznTTIg linux-2.6.10-rc2-xen-sparse/net/core/skbuff.c 1.262 +4149ec79wMpIHdvbntxqVGLRZZjPxw linux-2.6.10-rc2-xen-sparse/net/ipv4/raw.c 1.263 413cb1e4zst25MDYjg63Y-NGC5_pLg netbsd-2.0-xen-sparse/Makefile 1.264 413cb1e5c_Mkxf_X0zimEhTKI_l4DA netbsd-2.0-xen-sparse/mkbuildtree 1.265 413cb1e5kY_Zil7-b0kI6hvCIxBEYg netbsd-2.0-xen-sparse/nbconfig-xen
2.1 --- a/linux-2.4.27-xen-sparse/arch/xen/kernel/irq.c Fri Nov 19 23:16:02 2004 +0000 2.2 +++ b/linux-2.4.27-xen-sparse/arch/xen/kernel/irq.c Fri Nov 19 23:17:26 2004 +0000 2.3 @@ -559,7 +559,7 @@ void enable_irq(unsigned int irq) 2.4 * SMP cross-CPU interrupts have their own specific 2.5 * handlers). 2.6 */ 2.7 -asmlinkage unsigned int do_IRQ(int irq, struct pt_regs *regs) 2.8 +asmlinkage unsigned int do_IRQ(struct pt_regs *regs) 2.9 { 2.10 /* 2.11 * We ack quickly, we don't want the irq controller 2.12 @@ -571,6 +571,7 @@ asmlinkage unsigned int do_IRQ(int irq, 2.13 * 0 return value means that this irq is already being 2.14 * handled by some other CPU. (or is disabled) 2.15 */ 2.16 + int irq = regs->orig_eax & 0xff; /* high bits used in ret_from_ code */ 2.17 int cpu = smp_processor_id(); 2.18 irq_desc_t *desc = irq_desc + irq; 2.19 struct irqaction * action; 2.20 @@ -731,6 +732,53 @@ int request_irq(unsigned int irq, 2.21 return retval; 2.22 } 2.23 2.24 +/* 2.25 + * Internal function to unregister an irqaction - typically used to 2.26 + * deallocate special interrupts that are part of the architecture. 2.27 + */ 2.28 +int teardown_irq(unsigned int irq, struct irqaction * old) 2.29 +{ 2.30 + irq_desc_t *desc; 2.31 + struct irqaction **p; 2.32 + unsigned long flags; 2.33 + 2.34 + if (irq >= NR_IRQS) 2.35 + return -ENOENT; 2.36 + 2.37 + desc = irq_desc + irq; 2.38 + spin_lock_irqsave(&desc->lock,flags); 2.39 + p = &desc->action; 2.40 + for (;;) { 2.41 + struct irqaction * action = *p; 2.42 + if (action) { 2.43 + struct irqaction **pp = p; 2.44 + p = &action->next; 2.45 + if (action != old) 2.46 + continue; 2.47 + 2.48 + /* Found it - now remove it from the list of entries */ 2.49 + *pp = action->next; 2.50 + if (!desc->action) { 2.51 + desc->status |= IRQ_DISABLED; 2.52 + desc->handler->shutdown(irq); 2.53 + } 2.54 + spin_unlock_irqrestore(&desc->lock,flags); 2.55 + 2.56 +#ifdef CONFIG_SMP 2.57 + /* Wait to make sure it's not being used on another CPU */ 2.58 + while (desc->status & IRQ_INPROGRESS) { 2.59 + barrier(); 2.60 + cpu_relax(); 2.61 + } 2.62 +#endif 2.63 + return 0; 2.64 + } 2.65 + printk("Trying to free free IRQ%d\n",irq); 2.66 + spin_unlock_irqrestore(&desc->lock,flags); 2.67 + return -ENOENT; 2.68 + } 2.69 +} 2.70 + 2.71 /** 2.72 * free_irq - free an interrupt 2.73 * @irq: Interrupt line to free 2.74 @@ -752,7 +800,7 @@ int request_irq(unsigned int irq, 2.75 void free_irq(unsigned int irq, void *dev_id) 2.76 { 2.77 irq_desc_t *desc; 2.78 - struct irqaction **p; 2.79 + struct irqaction *action; 2.80 unsigned long flags; 2.81 2.82 if (irq >= NR_IRQS) 2.83 @@ -760,39 +808,19 @@ void free_irq(unsigned int irq, void *de 2.84 2.85 desc = irq_desc + irq; 2.86 spin_lock_irqsave(&desc->lock,flags); 2.87 - p = &desc->action; 2.88 - for (;;) { 2.89 - struct irqaction * action = *p; 2.90 - if (action) { 2.91 - struct irqaction **pp = p; 2.92 - p = &action->next; 2.93 - if (action->dev_id != dev_id) 2.94 - continue; 2.95 + for (action = desc->action; action != NULL; action = action->next) { 2.96 + if (action->dev_id != dev_id) 2.97 + continue; 2.98 2.99 - /* Found it - now remove it from the list of entries */ 2.100 - *pp = action->next; 2.101 - if (!desc->action) { 2.102 - desc->status |= IRQ_DISABLED; 2.103 - desc->handler->shutdown(irq); 2.104 - } 2.105 - spin_unlock_irqrestore(&desc->lock,flags); 2.106 + spin_unlock_irqrestore(&desc->lock,flags); 2.107 2.108 -#ifdef CONFIG_SMP 2.109 - /* Wait to make sure it's not being used on another CPU */ 2.110 - while (desc->status & IRQ_INPROGRESS) { 2.111 - barrier(); 2.112 - cpu_relax(); 2.113 - } 2.114 -#endif 2.115 -#define SA_STATIC_ACTION 0x01000000 /* Is it our duty to free the action? */ 2.116 - if (!(action->flags & SA_STATIC_ACTION)) 2.117 - kfree(action); 2.118 - return; 2.119 - } 2.120 - printk("Trying to free free IRQ%d\n",irq); 2.121 - spin_unlock_irqrestore(&desc->lock,flags); 2.122 + if (teardown_irq(irq, action) == 0) 2.123 + kfree(action); 2.124 return; 2.125 } 2.126 + printk("Trying to free free IRQ%d\n",irq); 2.127 + spin_unlock_irqrestore(&desc->lock,flags); 2.128 + return; 2.129 } 2.130 2.131 /*
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/linux-2.4.27-xen-sparse/include/linux/irq.h Fri Nov 19 23:17:26 2004 +0000 3.3 @@ -0,0 +1,80 @@ 3.4 +#ifndef __irq_h 3.5 +#define __irq_h 3.6 + 3.7 +/* 3.8 + * Please do not include this file in generic code. There is currently 3.9 + * no requirement for any architecture to implement anything held 3.10 + * within this file. 3.11 + * 3.12 + * Thanks. --rmk 3.13 + */ 3.14 + 3.15 +#include <linux/config.h> 3.16 + 3.17 +#if !defined(CONFIG_ARCH_S390) 3.18 + 3.19 +#include <linux/cache.h> 3.20 +#include <linux/spinlock.h> 3.21 + 3.22 +#include <asm/irq.h> 3.23 +#include <asm/ptrace.h> 3.24 + 3.25 +/* 3.26 + * IRQ line status. 3.27 + */ 3.28 +#define IRQ_INPROGRESS 1 /* IRQ handler active - do not enter! */ 3.29 +#define IRQ_DISABLED 2 /* IRQ disabled - do not enter! */ 3.30 +#define IRQ_PENDING 4 /* IRQ pending - replay on enable */ 3.31 +#define IRQ_REPLAY 8 /* IRQ has been replayed but not acked yet */ 3.32 +#define IRQ_AUTODETECT 16 /* IRQ is being autodetected */ 3.33 +#define IRQ_WAITING 32 /* IRQ not yet seen - for autodetection */ 3.34 +#define IRQ_LEVEL 64 /* IRQ level triggered */ 3.35 +#define IRQ_MASKED 128 /* IRQ masked - shouldn't be seen again */ 3.36 +#define IRQ_PER_CPU 256 /* IRQ is per CPU */ 3.37 + 3.38 +/* 3.39 + * Interrupt controller descriptor. This is all we need 3.40 + * to describe about the low-level hardware. 3.41 + */ 3.42 +struct hw_interrupt_type { 3.43 + const char * typename; 3.44 + unsigned int (*startup)(unsigned int irq); 3.45 + void (*shutdown)(unsigned int irq); 3.46 + void (*enable)(unsigned int irq); 3.47 + void (*disable)(unsigned int irq); 3.48 + void (*ack)(unsigned int irq); 3.49 + void (*end)(unsigned int irq); 3.50 + void (*set_affinity)(unsigned int irq, unsigned long mask); 3.51 +}; 3.52 + 3.53 +typedef struct hw_interrupt_type hw_irq_controller; 3.54 + 3.55 +/* 3.56 + * This is the "IRQ descriptor", which contains various information 3.57 + * about the irq, including what kind of hardware handling it has, 3.58 + * whether it is disabled etc etc. 3.59 + * 3.60 + * Pad this out to 32 bytes for cache and indexing reasons. 3.61 + */ 3.62 +typedef struct { 3.63 + unsigned int status; /* IRQ status */ 3.64 + hw_irq_controller *handler; 3.65 + struct irqaction *action; /* IRQ action list */ 3.66 + unsigned int depth; /* nested irq disables */ 3.67 + spinlock_t lock; 3.68 +} ____cacheline_aligned irq_desc_t; 3.69 + 3.70 +extern irq_desc_t irq_desc [NR_IRQS]; 3.71 + 3.72 +#include <asm/hw_irq.h> /* the arch dependent stuff */ 3.73 + 3.74 +extern int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *); 3.75 +extern int setup_irq(unsigned int , struct irqaction * ); 3.76 +extern int teardown_irq(unsigned int , struct irqaction * ); 3.77 + 3.78 +extern hw_irq_controller no_irq_type; /* needed in every arch ? */ 3.79 +extern void no_action(int cpl, void *dev_id, struct pt_regs *regs); 3.80 + 3.81 +#endif 3.82 + 3.83 +#endif /* __irq_h */
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 4.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/Kconfig Fri Nov 19 23:17:26 2004 +0000 4.3 @@ -0,0 +1,166 @@ 4.4 +# 4.5 +# For a description of the syntax of this configuration file, 4.6 +# see Documentation/kbuild/kconfig-language.txt. 4.7 +# 4.8 + 4.9 +mainmenu "Linux Kernel Configuration" 4.10 + 4.11 +config XEN 4.12 + bool 4.13 + default y 4.14 + help 4.15 + This is the Linux Xen port. 4.16 + 4.17 +config ARCH_XEN 4.18 + bool 4.19 + default y 4.20 + 4.21 + 4.22 +config NO_IDLE_HZ 4.23 + bool 4.24 + default y 4.25 + 4.26 + 4.27 +menu "XEN" 4.28 + 4.29 +config XEN_PRIVILEGED_GUEST 4.30 + bool "Privileged Guest (domain 0)" 4.31 + default n 4.32 + select XEN_PHYSDEV_ACCESS 4.33 + help 4.34 + Support for privileged operation (domain 0) 4.35 + 4.36 +config XEN_PHYSDEV_ACCESS 4.37 + bool "Physical device access" 4.38 + default y if XEN_PRIVILEGED_GUEST 4.39 + default n if !XEN_PRIVILEGED_GUEST 4.40 + help 4.41 + Assume access is available to physical hardware devices 4.42 + (e.g., hard drives, network cards). This allows you to configure 4.43 + such devices and also includes some low-level support that is 4.44 + otherwise not compiled into the kernel. 4.45 + 4.46 +config XEN_BLKDEV_BACKEND 4.47 + bool "Block-device backend driver" 4.48 + default y if XEN_PHYSDEV_ACCESS 4.49 + default n if !XEN_PHYSDEV_ACCESS 4.50 + help 4.51 + The block-device backend driver allows the kernel to export its 4.52 + block devices to other guests via a high-performance shared-memory 4.53 + interface. 4.54 + 4.55 +config XEN_NETDEV_BACKEND 4.56 + bool "Network-device backend driver" 4.57 + default y if XEN_PHYSDEV_ACCESS 4.58 + default n if !XEN_PHYSDEV_ACCESS 4.59 + help 4.60 + The network-device backend driver allows the kernel to export its 4.61 + network devices to other guests via a high-performance shared-memory 4.62 + interface. 4.63 + 4.64 +config XEN_BLKDEV_FRONTEND 4.65 + bool "Block-device frontend driver" 4.66 + default y 4.67 + help 4.68 + The block-device frontend driver allows the kernel to access block 4.69 + devices mounted within another guest OS. Unless you are building a 4.70 + dedicated device-driver domain, or your master control domain 4.71 + (domain 0), then you almost certainly want to say Y here. 4.72 + 4.73 +config XEN_NETDEV_FRONTEND 4.74 + bool "Network-device frontend driver" 4.75 + default y 4.76 + help 4.77 + The network-device frontend driver allows the kernel to access 4.78 + network interfaces within another guest OS. Unless you are building a 4.79 + dedicated device-driver domain, or your master control domain 4.80 + (domain 0), then you almost certainly want to say Y here. 4.81 + 4.82 +if XEN_NETDEV_FRONTEND 4.83 +config XEN_NETDEV_FRONTEND_PIPELINED_TRANSMITTER 4.84 + bool "Pipelined transmitter (DANGEROUS)" 4.85 + default n 4.86 + help 4.87 + The driver will assume that the backend is pipelining packets for 4.88 + transmission: whenever packets are pending in the remote backend, 4.89 + the driver will not send asynchronous notifications when it queues 4.90 + additional packets for transmission. 4.91 + If the backend is a dumb domain, such as a transparent Ethernet 4.92 + bridge with no local IP interface, it is safe to say Y here to get 4.93 + slightly lower network overhead. 4.94 + If the backend has a local IP interface; or may be doing smart things 4.95 + like reassembling packets to perform firewall filtering; or if you 4.96 + are unsure; or if you experience network hangs when this option is 4.97 + enabled; then you must say N here. 4.98 +endif 4.99 + 4.100 +config XEN_WRITABLE_PAGETABLES 4.101 + bool 4.102 + default y 4.103 + 4.104 +config XEN_SCRUB_PAGES 4.105 + bool "Scrub memory before freeing it to Xen" 4.106 + default y 4.107 + help 4.108 + Erase memory contents before freeing it back to Xen's global 4.109 + pool. This ensures that any secrets contained within that 4.110 + memory (e.g., private keys) cannot be found by other guests that 4.111 + may be running on the machine. Most people will want to say Y here. 4.112 + If security is not a concern then you may increase performance by 4.113 + saying N. 4.114 + 4.115 +endmenu 4.116 + 4.117 +config HAVE_ARCH_DEV_ALLOC_SKB 4.118 + bool 4.119 + default y 4.120 + 4.121 +#config VT 4.122 +# bool 4.123 +# default y 4.124 + 4.125 +#config VT_CONSOLE 4.126 +# bool 4.127 +# default y 4.128 + 4.129 +#config HW_CONSOLE 4.130 +# bool 4.131 +# default y 4.132 + 4.133 +choice 4.134 + prompt "Processor Type" 4.135 + default X86 4.136 + 4.137 +config X86 4.138 + bool "X86" 4.139 + help 4.140 + Choose this option if your computer is a X86 architecture. 4.141 + 4.142 +config X86_64 4.143 + bool "X86_64" 4.144 + help 4.145 + Choose this option if your computer is a X86 architecture. 4.146 + 4.147 +endchoice 4.148 + 4.149 +source "init/Kconfig" 4.150 + 4.151 +if X86 4.152 +source "arch/xen/i386/Kconfig" 4.153 +endif 4.154 + 4.155 +menu "Executable file formats" 4.156 + 4.157 +source "fs/Kconfig.binfmt" 4.158 + 4.159 +endmenu 4.160 + 4.161 +source "arch/xen/Kconfig.drivers" 4.162 + 4.163 +source "fs/Kconfig" 4.164 + 4.165 +source "security/Kconfig" 4.166 + 4.167 +source "crypto/Kconfig" 4.168 + 4.169 +source "lib/Kconfig"
5.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 5.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/Kconfig.drivers Fri Nov 19 23:17:26 2004 +0000 5.3 @@ -0,0 +1,55 @@ 5.4 +# arch/xen/Kconfig.drivers 5.5 + 5.6 +menu "Device Drivers" 5.7 + 5.8 +source "drivers/base/Kconfig" 5.9 + 5.10 +if XEN_PHYSDEV_ACCESS 5.11 +source "drivers/mtd/Kconfig" 5.12 +source "drivers/parport/Kconfig" 5.13 +source "drivers/pnp/Kconfig" 5.14 +endif 5.15 + 5.16 +source "drivers/block/Kconfig" 5.17 + 5.18 +if XEN_PHYSDEV_ACCESS 5.19 +source "drivers/ide/Kconfig" 5.20 +endif 5.21 + 5.22 +source "drivers/scsi/Kconfig" 5.23 + 5.24 +if XEN_PHYSDEV_ACCESS 5.25 +source "drivers/cdrom/Kconfig" 5.26 +endif 5.27 + 5.28 +source "drivers/md/Kconfig" 5.29 + 5.30 +if XEN_PHYSDEV_ACCESS 5.31 +source "drivers/message/fusion/Kconfig" 5.32 +source "drivers/ieee1394/Kconfig" 5.33 +source "drivers/message/i2o/Kconfig" 5.34 +endif 5.35 + 5.36 +source "net/Kconfig" 5.37 + 5.38 +if XEN_PHYSDEV_ACCESS 5.39 +source "drivers/isdn/Kconfig" 5.40 +source "drivers/telephony/Kconfig" 5.41 +source "drivers/input/Kconfig" 5.42 +source "drivers/char/Kconfig" 5.43 +source "drivers/i2c/Kconfig" 5.44 +source "drivers/w1/Kconfig" 5.45 +source "drivers/misc/Kconfig" 5.46 +source "drivers/media/Kconfig" 5.47 +source "drivers/video/Kconfig" 5.48 +source "sound/Kconfig" 5.49 +source "drivers/usb/Kconfig" 5.50 +endif 5.51 + 5.52 +if !XEN_PHYSDEV_ACCESS 5.53 +config UNIX98_PTYS 5.54 + bool 5.55 + default y 5.56 +endif 5.57 + 5.58 +endmenu
6.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 6.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/Makefile Fri Nov 19 23:17:26 2004 +0000 6.3 @@ -0,0 +1,72 @@ 6.4 +# 6.5 +# xen/Makefile 6.6 +# 6.7 +# This file is included by the global makefile so that you can add your own 6.8 +# architecture-specific flags and dependencies. Remember to do have actions 6.9 +# for "archclean" cleaning up for this architecture. 6.10 +# 6.11 +# This file is subject to the terms and conditions of the GNU General Public 6.12 +# License. See the file "COPYING" in the main directory of this archive 6.13 +# for more details. 6.14 +# 6.15 +# Copyright (C) 2004 by Christian Limpach 6.16 +# 6.17 + 6.18 +XENARCH := $(subst ",,$(CONFIG_XENARCH)) 6.19 + 6.20 +# pick up headers from include/asm-xen/asm in preference over include/asm 6.21 +NOSTDINC_FLAGS = -nostdinc -iwithprefix include/asm-xen -Iinclude/asm-xen -iwithprefix include 6.22 + 6.23 +# make uname return the processor arch 6.24 +UTS_MACHINE := $(XENARCH) 6.25 + 6.26 +core-y += arch/xen/kernel/ 6.27 + 6.28 +include/.asm-ignore: include/asm 6.29 + @rm -f include/.asm-ignore 6.30 + @mv include/asm include/.asm-ignore 6.31 + @echo ' SYMLINK include/asm -> include/asm-$(XENARCH)' 6.32 + $(Q)if [ ! -d include ]; then mkdir -p include; fi; 6.33 + @ln -fsn asm-$(XENARCH) include/asm 6.34 + 6.35 +include/asm-xen/asm: 6.36 + @echo ' SYMLINK $@ -> include/asm-xen/asm-$(XENARCH)' 6.37 + @ln -fsn asm-$(XENARCH) $@ 6.38 + 6.39 +arch/xen/arch: 6.40 + @rm -f $@ 6.41 + @ln -fsn $(XENARCH) $@ 6.42 + 6.43 +prepare: include/.asm-ignore include/asm-xen/asm \ 6.44 + arch/xen/arch ; 6.45 + 6.46 +all: vmlinuz 6.47 + 6.48 +vmlinuz: vmlinux 6.49 + $(Q)$(MAKE) $(build)=arch/xen/boot vmlinuz 6.50 + 6.51 +XINSTALL_NAME ?= $(KERNELRELEASE) 6.52 +install: vmlinuz 6.53 + mkdir -p $(INSTALL_PATH)/boot 6.54 + install -m0644 vmlinuz $(INSTALL_PATH)/boot/vmlinuz-$(XINSTALL_NAME)$(INSTALL_SUFFIX) 6.55 + install -m0644 vmlinux $(INSTALL_PATH)/boot/vmlinux-syms-$(XINSTALL_NAME)$(INSTALL_SUFFIX) 6.56 + install -m0664 .config $(INSTALL_PATH)/boot/config-$(XINSTALL_NAME)$(INSTALL_SUFFIX) 6.57 + install -m0664 System.map $(INSTALL_PATH)/boot/System.map-$(XINSTALL_NAME)$(INSTALL_SUFFIX) 6.58 + mkdir -p $(INSTALL_PATH)/usr/include/xen/linux 6.59 + install -m0644 include/asm-xen/linux-public/*.h $(INSTALL_PATH)/usr/include/xen/linux 6.60 +dist: 6.61 + $(MAKE) INSTALL_PATH=../dist/install install 6.62 + 6.63 +archclean: 6.64 + @if [ -e arch/xen/arch ]; then $(MAKE) $(clean)=arch/xen/arch; fi; 6.65 + @rm -f arch/xen/arch include/.asm-ignore include/asm-xen/asm 6.66 + @rm -f vmlinux-stripped vmlinuz 6.67 + 6.68 +define archhelp 6.69 + echo '* vmlinuz - Compressed kernel image' 6.70 + echo ' install - Install kernel image and config file' 6.71 +endef 6.72 + 6.73 +ifneq ($(XENARCH),) 6.74 +include $(srctree)/arch/xen/$(XENARCH)/Makefile 6.75 +endif
7.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 7.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/boot/Makefile Fri Nov 19 23:17:26 2004 +0000 7.3 @@ -0,0 +1,8 @@ 7.4 + 7.5 +OBJCOPYFLAGS := -g --strip-unneeded 7.6 + 7.7 +vmlinuz: vmlinux-stripped FORCE 7.8 + $(call if_changed,gzip) 7.9 + 7.10 +vmlinux-stripped: vmlinux FORCE 7.11 + $(call if_changed,objcopy)
8.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 8.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/configs/xen0_defconfig Fri Nov 19 23:17:26 2004 +0000 8.3 @@ -0,0 +1,1041 @@ 8.4 +# 8.5 +# Automatically generated make config: don't edit 8.6 +# Linux kernel version: 2.6.10-rc2-xen0 8.7 +# Fri Nov 19 20:16:38 2004 8.8 +# 8.9 +CONFIG_XEN=y 8.10 +CONFIG_ARCH_XEN=y 8.11 +CONFIG_NO_IDLE_HZ=y 8.12 + 8.13 +# 8.14 +# XEN 8.15 +# 8.16 +CONFIG_XEN_PRIVILEGED_GUEST=y 8.17 +CONFIG_XEN_PHYSDEV_ACCESS=y 8.18 +CONFIG_XEN_BLKDEV_BACKEND=y 8.19 +CONFIG_XEN_NETDEV_BACKEND=y 8.20 +CONFIG_XEN_BLKDEV_FRONTEND=y 8.21 +CONFIG_XEN_NETDEV_FRONTEND=y 8.22 +# CONFIG_XEN_NETDEV_FRONTEND_PIPELINED_TRANSMITTER is not set 8.23 +CONFIG_XEN_WRITABLE_PAGETABLES=y 8.24 +CONFIG_XEN_SCRUB_PAGES=y 8.25 +CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y 8.26 +CONFIG_X86=y 8.27 +# CONFIG_X86_64 is not set 8.28 + 8.29 +# 8.30 +# Code maturity level options 8.31 +# 8.32 +CONFIG_EXPERIMENTAL=y 8.33 +# CONFIG_CLEAN_COMPILE is not set 8.34 +CONFIG_BROKEN=y 8.35 +CONFIG_BROKEN_ON_SMP=y 8.36 +CONFIG_LOCK_KERNEL=y 8.37 + 8.38 +# 8.39 +# General setup 8.40 +# 8.41 +CONFIG_LOCALVERSION="" 8.42 +CONFIG_SWAP=y 8.43 +CONFIG_SYSVIPC=y 8.44 +# CONFIG_POSIX_MQUEUE is not set 8.45 +# CONFIG_BSD_PROCESS_ACCT is not set 8.46 +CONFIG_SYSCTL=y 8.47 +# CONFIG_AUDIT is not set 8.48 +CONFIG_LOG_BUF_SHIFT=14 8.49 +CONFIG_HOTPLUG=y 8.50 +CONFIG_KOBJECT_UEVENT=y 8.51 +# CONFIG_IKCONFIG is not set 8.52 +# CONFIG_EMBEDDED is not set 8.53 +CONFIG_KALLSYMS=y 8.54 +# CONFIG_KALLSYMS_ALL is not set 8.55 +# CONFIG_KALLSYMS_EXTRA_PASS is not set 8.56 +CONFIG_FUTEX=y 8.57 +CONFIG_EPOLL=y 8.58 +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set 8.59 +CONFIG_SHMEM=y 8.60 +CONFIG_CC_ALIGN_FUNCTIONS=0 8.61 +CONFIG_CC_ALIGN_LABELS=0 8.62 +CONFIG_CC_ALIGN_LOOPS=0 8.63 +CONFIG_CC_ALIGN_JUMPS=0 8.64 +# CONFIG_TINY_SHMEM is not set 8.65 + 8.66 +# 8.67 +# Loadable module support 8.68 +# 8.69 +CONFIG_MODULES=y 8.70 +CONFIG_MODULE_UNLOAD=y 8.71 +# CONFIG_MODULE_FORCE_UNLOAD is not set 8.72 +CONFIG_OBSOLETE_MODPARM=y 8.73 +# CONFIG_MODVERSIONS is not set 8.74 +# CONFIG_MODULE_SRCVERSION_ALL is not set 8.75 +CONFIG_KMOD=y 8.76 + 8.77 +# 8.78 +# X86 Processor Configuration 8.79 +# 8.80 +CONFIG_XENARCH="i386" 8.81 +CONFIG_MMU=y 8.82 +CONFIG_UID16=y 8.83 +CONFIG_GENERIC_ISA_DMA=y 8.84 +CONFIG_GENERIC_IOMAP=y 8.85 +# CONFIG_M686 is not set 8.86 +# CONFIG_MPENTIUMII is not set 8.87 +# CONFIG_MPENTIUMIII is not set 8.88 +# CONFIG_MPENTIUMM is not set 8.89 +CONFIG_MPENTIUM4=y 8.90 +# CONFIG_MK6 is not set 8.91 +# CONFIG_MK7 is not set 8.92 +# CONFIG_MK8 is not set 8.93 +# CONFIG_MCRUSOE is not set 8.94 +# CONFIG_MCYRIXIII is not set 8.95 +# CONFIG_MVIAC3_2 is not set 8.96 +# CONFIG_X86_GENERIC is not set 8.97 +CONFIG_X86_CMPXCHG=y 8.98 +CONFIG_X86_XADD=y 8.99 +CONFIG_X86_L1_CACHE_SHIFT=7 8.100 +CONFIG_RWSEM_XCHGADD_ALGORITHM=y 8.101 +CONFIG_X86_WP_WORKS_OK=y 8.102 +CONFIG_X86_INVLPG=y 8.103 +CONFIG_X86_BSWAP=y 8.104 +CONFIG_X86_POPAD_OK=y 8.105 +CONFIG_X86_GOOD_APIC=y 8.106 +CONFIG_X86_INTEL_USERCOPY=y 8.107 +CONFIG_X86_USE_PPRO_CHECKSUM=y 8.108 +# CONFIG_HPET_TIMER is not set 8.109 +# CONFIG_HPET_EMULATE_RTC is not set 8.110 +# CONFIG_SMP is not set 8.111 +CONFIG_PREEMPT=y 8.112 +CONFIG_X86_CPUID=y 8.113 + 8.114 +# 8.115 +# Firmware Drivers 8.116 +# 8.117 +# CONFIG_EDD is not set 8.118 +CONFIG_NOHIGHMEM=y 8.119 +# CONFIG_HIGHMEM4G is not set 8.120 +CONFIG_HAVE_DEC_LOCK=y 8.121 +# CONFIG_REGPARM is not set 8.122 + 8.123 +# 8.124 +# Bus options (PCI, PCMCIA, EISA, MCA, ISA) 8.125 +# 8.126 +CONFIG_PCI=y 8.127 +CONFIG_PCI_DIRECT=y 8.128 +CONFIG_PCI_LEGACY_PROC=y 8.129 +# CONFIG_PCI_NAMES is not set 8.130 +CONFIG_ISA=y 8.131 +# CONFIG_EISA is not set 8.132 +# CONFIG_MCA is not set 8.133 +# CONFIG_SCx200 is not set 8.134 + 8.135 +# 8.136 +# PCCARD (PCMCIA/CardBus) support 8.137 +# 8.138 +# CONFIG_PCCARD is not set 8.139 + 8.140 +# 8.141 +# PC-card bridges 8.142 +# 8.143 +CONFIG_PCMCIA_PROBE=y 8.144 + 8.145 +# 8.146 +# PCI Hotplug Support 8.147 +# 8.148 +# CONFIG_HOTPLUG_PCI is not set 8.149 + 8.150 +# 8.151 +# Kernel hacking 8.152 +# 8.153 +CONFIG_DEBUG_KERNEL=y 8.154 +CONFIG_EARLY_PRINTK=y 8.155 +# CONFIG_DEBUG_STACKOVERFLOW is not set 8.156 +# CONFIG_DEBUG_STACK_USAGE is not set 8.157 +# CONFIG_DEBUG_SLAB is not set 8.158 +CONFIG_MAGIC_SYSRQ=y 8.159 +# CONFIG_DEBUG_SPINLOCK is not set 8.160 +# CONFIG_DEBUG_PAGEALLOC is not set 8.161 +# CONFIG_DEBUG_INFO is not set 8.162 +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set 8.163 +# CONFIG_FRAME_POINTER is not set 8.164 +# CONFIG_4KSTACKS is not set 8.165 +CONFIG_GENERIC_HARDIRQS=y 8.166 +CONFIG_GENERIC_IRQ_PROBE=y 8.167 +CONFIG_X86_BIOS_REBOOT=y 8.168 +CONFIG_PC=y 8.169 + 8.170 +# 8.171 +# Executable file formats 8.172 +# 8.173 +CONFIG_BINFMT_ELF=y 8.174 +# CONFIG_BINFMT_AOUT is not set 8.175 +# CONFIG_BINFMT_MISC is not set 8.176 + 8.177 +# 8.178 +# Device Drivers 8.179 +# 8.180 + 8.181 +# 8.182 +# Generic Driver Options 8.183 +# 8.184 +# CONFIG_STANDALONE is not set 8.185 +CONFIG_PREVENT_FIRMWARE_BUILD=y 8.186 +# CONFIG_FW_LOADER is not set 8.187 +# CONFIG_DEBUG_DRIVER is not set 8.188 + 8.189 +# 8.190 +# Memory Technology Devices (MTD) 8.191 +# 8.192 +# CONFIG_MTD is not set 8.193 + 8.194 +# 8.195 +# Parallel port support 8.196 +# 8.197 +# CONFIG_PARPORT is not set 8.198 + 8.199 +# 8.200 +# Plug and Play support 8.201 +# 8.202 +# CONFIG_PNP is not set 8.203 + 8.204 +# 8.205 +# Block devices 8.206 +# 8.207 +CONFIG_BLK_DEV_FD=y 8.208 +# CONFIG_BLK_DEV_XD is not set 8.209 +# CONFIG_BLK_CPQ_DA is not set 8.210 +CONFIG_BLK_CPQ_CISS_DA=y 8.211 +# CONFIG_CISS_SCSI_TAPE is not set 8.212 +# CONFIG_BLK_DEV_DAC960 is not set 8.213 +# CONFIG_BLK_DEV_UMEM is not set 8.214 +CONFIG_BLK_DEV_LOOP=y 8.215 +# CONFIG_BLK_DEV_CRYPTOLOOP is not set 8.216 +# CONFIG_BLK_DEV_NBD is not set 8.217 +# CONFIG_BLK_DEV_SX8 is not set 8.218 +CONFIG_BLK_DEV_RAM=y 8.219 +CONFIG_BLK_DEV_RAM_SIZE=4096 8.220 +CONFIG_BLK_DEV_INITRD=y 8.221 +CONFIG_INITRAMFS_SOURCE="" 8.222 +# CONFIG_LBD is not set 8.223 +# CONFIG_CDROM_PKTCDVD is not set 8.224 + 8.225 +# 8.226 +# IO Schedulers 8.227 +# 8.228 +CONFIG_IOSCHED_NOOP=y 8.229 +CONFIG_IOSCHED_AS=y 8.230 +CONFIG_IOSCHED_DEADLINE=y 8.231 +CONFIG_IOSCHED_CFQ=y 8.232 + 8.233 +# 8.234 +# ATA/ATAPI/MFM/RLL support 8.235 +# 8.236 +CONFIG_IDE=y 8.237 +CONFIG_BLK_DEV_IDE=y 8.238 + 8.239 +# 8.240 +# Please see Documentation/ide.txt for help/info on IDE drives 8.241 +# 8.242 +# CONFIG_BLK_DEV_IDE_SATA is not set 8.243 +# CONFIG_BLK_DEV_HD_IDE is not set 8.244 +CONFIG_BLK_DEV_IDEDISK=y 8.245 +# CONFIG_IDEDISK_MULTI_MODE is not set 8.246 +CONFIG_BLK_DEV_IDECD=y 8.247 +# CONFIG_BLK_DEV_IDETAPE is not set 8.248 +# CONFIG_BLK_DEV_IDEFLOPPY is not set 8.249 +# CONFIG_BLK_DEV_IDESCSI is not set 8.250 +# CONFIG_IDE_TASK_IOCTL is not set 8.251 + 8.252 +# 8.253 +# IDE chipset support/bugfixes 8.254 +# 8.255 +CONFIG_IDE_GENERIC=y 8.256 +# CONFIG_BLK_DEV_CMD640 is not set 8.257 +CONFIG_BLK_DEV_IDEPCI=y 8.258 +# CONFIG_IDEPCI_SHARE_IRQ is not set 8.259 +# CONFIG_BLK_DEV_OFFBOARD is not set 8.260 +CONFIG_BLK_DEV_GENERIC=y 8.261 +# CONFIG_BLK_DEV_OPTI621 is not set 8.262 +# CONFIG_BLK_DEV_RZ1000 is not set 8.263 +CONFIG_BLK_DEV_IDEDMA_PCI=y 8.264 +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set 8.265 +CONFIG_IDEDMA_PCI_AUTO=y 8.266 +# CONFIG_IDEDMA_ONLYDISK is not set 8.267 +# CONFIG_BLK_DEV_AEC62XX is not set 8.268 +# CONFIG_BLK_DEV_ALI15X3 is not set 8.269 +# CONFIG_BLK_DEV_AMD74XX is not set 8.270 +# CONFIG_BLK_DEV_ATIIXP is not set 8.271 +# CONFIG_BLK_DEV_CMD64X is not set 8.272 +# CONFIG_BLK_DEV_TRIFLEX is not set 8.273 +# CONFIG_BLK_DEV_CY82C693 is not set 8.274 +# CONFIG_BLK_DEV_CS5520 is not set 8.275 +# CONFIG_BLK_DEV_CS5530 is not set 8.276 +# CONFIG_BLK_DEV_HPT34X is not set 8.277 +# CONFIG_BLK_DEV_HPT366 is not set 8.278 +# CONFIG_BLK_DEV_SC1200 is not set 8.279 +CONFIG_BLK_DEV_PIIX=y 8.280 +# CONFIG_BLK_DEV_NS87415 is not set 8.281 +# CONFIG_BLK_DEV_PDC202XX_OLD is not set 8.282 +# CONFIG_BLK_DEV_PDC202XX_NEW is not set 8.283 +CONFIG_BLK_DEV_SVWKS=y 8.284 +# CONFIG_BLK_DEV_SIIMAGE is not set 8.285 +# CONFIG_BLK_DEV_SIS5513 is not set 8.286 +# CONFIG_BLK_DEV_SLC90E66 is not set 8.287 +# CONFIG_BLK_DEV_TRM290 is not set 8.288 +# CONFIG_BLK_DEV_VIA82CXXX is not set 8.289 +# CONFIG_IDE_ARM is not set 8.290 +# CONFIG_IDE_CHIPSETS is not set 8.291 +CONFIG_BLK_DEV_IDEDMA=y 8.292 +# CONFIG_IDEDMA_IVB is not set 8.293 +CONFIG_IDEDMA_AUTO=y 8.294 +# CONFIG_BLK_DEV_HD is not set 8.295 + 8.296 +# 8.297 +# SCSI device support 8.298 +# 8.299 +CONFIG_SCSI=y 8.300 +CONFIG_SCSI_PROC_FS=y 8.301 + 8.302 +# 8.303 +# SCSI support type (disk, tape, CD-ROM) 8.304 +# 8.305 +CONFIG_BLK_DEV_SD=y 8.306 +# CONFIG_CHR_DEV_ST is not set 8.307 +# CONFIG_CHR_DEV_OSST is not set 8.308 +# CONFIG_BLK_DEV_SR is not set 8.309 +# CONFIG_CHR_DEV_SG is not set 8.310 + 8.311 +# 8.312 +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs 8.313 +# 8.314 +# CONFIG_SCSI_MULTI_LUN is not set 8.315 +# CONFIG_SCSI_CONSTANTS is not set 8.316 +# CONFIG_SCSI_LOGGING is not set 8.317 + 8.318 +# 8.319 +# SCSI Transport Attributes 8.320 +# 8.321 +# CONFIG_SCSI_SPI_ATTRS is not set 8.322 +# CONFIG_SCSI_FC_ATTRS is not set 8.323 + 8.324 +# 8.325 +# SCSI low-level drivers 8.326 +# 8.327 +CONFIG_BLK_DEV_3W_XXXX_RAID=y 8.328 +# CONFIG_SCSI_3W_9XXX is not set 8.329 +# CONFIG_SCSI_7000FASST is not set 8.330 +# CONFIG_SCSI_ACARD is not set 8.331 +# CONFIG_SCSI_AHA152X is not set 8.332 +# CONFIG_SCSI_AHA1542 is not set 8.333 +CONFIG_SCSI_AACRAID=y 8.334 +CONFIG_SCSI_AIC7XXX=y 8.335 +CONFIG_AIC7XXX_CMDS_PER_DEVICE=32 8.336 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 8.337 +CONFIG_AIC7XXX_DEBUG_ENABLE=y 8.338 +CONFIG_AIC7XXX_DEBUG_MASK=0 8.339 +CONFIG_AIC7XXX_REG_PRETTY_PRINT=y 8.340 +# CONFIG_SCSI_AIC7XXX_OLD is not set 8.341 +CONFIG_SCSI_AIC79XX=y 8.342 +CONFIG_AIC79XX_CMDS_PER_DEVICE=32 8.343 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 8.344 +# CONFIG_AIC79XX_ENABLE_RD_STRM is not set 8.345 +CONFIG_AIC79XX_DEBUG_ENABLE=y 8.346 +CONFIG_AIC79XX_DEBUG_MASK=0 8.347 +CONFIG_AIC79XX_REG_PRETTY_PRINT=y 8.348 +# CONFIG_SCSI_DPT_I2O is not set 8.349 +# CONFIG_SCSI_ADVANSYS is not set 8.350 +# CONFIG_SCSI_IN2000 is not set 8.351 +# CONFIG_MEGARAID_NEWGEN is not set 8.352 +# CONFIG_MEGARAID_LEGACY is not set 8.353 +CONFIG_SCSI_SATA=y 8.354 +# CONFIG_SCSI_SATA_AHCI is not set 8.355 +# CONFIG_SCSI_SATA_SVW is not set 8.356 +CONFIG_SCSI_ATA_PIIX=y 8.357 +# CONFIG_SCSI_SATA_NV is not set 8.358 +CONFIG_SCSI_SATA_PROMISE=y 8.359 +CONFIG_SCSI_SATA_SX4=y 8.360 +CONFIG_SCSI_SATA_SIL=y 8.361 +# CONFIG_SCSI_SATA_SIS is not set 8.362 +# CONFIG_SCSI_SATA_ULI is not set 8.363 +# CONFIG_SCSI_SATA_VIA is not set 8.364 +# CONFIG_SCSI_SATA_VITESSE is not set 8.365 +CONFIG_SCSI_BUSLOGIC=y 8.366 +# CONFIG_SCSI_OMIT_FLASHPOINT is not set 8.367 +# CONFIG_SCSI_CPQFCTS is not set 8.368 +# CONFIG_SCSI_DMX3191D is not set 8.369 +# CONFIG_SCSI_DTC3280 is not set 8.370 +# CONFIG_SCSI_EATA is not set 8.371 +# CONFIG_SCSI_EATA_PIO is not set 8.372 +# CONFIG_SCSI_FUTURE_DOMAIN is not set 8.373 +# CONFIG_SCSI_GDTH is not set 8.374 +# CONFIG_SCSI_GENERIC_NCR5380 is not set 8.375 +# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set 8.376 +# CONFIG_SCSI_IPS is not set 8.377 +# CONFIG_SCSI_INITIO is not set 8.378 +# CONFIG_SCSI_INIA100 is not set 8.379 +# CONFIG_SCSI_NCR53C406A is not set 8.380 +# CONFIG_SCSI_SYM53C8XX_2 is not set 8.381 +# CONFIG_SCSI_IPR is not set 8.382 +# CONFIG_SCSI_PAS16 is not set 8.383 +# CONFIG_SCSI_PCI2000 is not set 8.384 +# CONFIG_SCSI_PCI2220I is not set 8.385 +# CONFIG_SCSI_PSI240I is not set 8.386 +# CONFIG_SCSI_QLOGIC_FAS is not set 8.387 +# CONFIG_SCSI_QLOGIC_ISP is not set 8.388 +# CONFIG_SCSI_QLOGIC_FC is not set 8.389 +# CONFIG_SCSI_QLOGIC_1280 is not set 8.390 +# CONFIG_SCSI_QLOGIC_1280_1040 is not set 8.391 +CONFIG_SCSI_QLA2XXX=y 8.392 +# CONFIG_SCSI_QLA21XX is not set 8.393 +# CONFIG_SCSI_QLA22XX is not set 8.394 +# CONFIG_SCSI_QLA2300 is not set 8.395 +# CONFIG_SCSI_QLA2322 is not set 8.396 +# CONFIG_SCSI_QLA6312 is not set 8.397 +# CONFIG_SCSI_QLA6322 is not set 8.398 +# CONFIG_SCSI_SEAGATE is not set 8.399 +# CONFIG_SCSI_SYM53C416 is not set 8.400 +# CONFIG_SCSI_DC395x is not set 8.401 +# CONFIG_SCSI_DC390T is not set 8.402 +# CONFIG_SCSI_T128 is not set 8.403 +# CONFIG_SCSI_U14_34F is not set 8.404 +# CONFIG_SCSI_ULTRASTOR is not set 8.405 +# CONFIG_SCSI_NSP32 is not set 8.406 +# CONFIG_SCSI_DEBUG is not set 8.407 + 8.408 +# 8.409 +# Old CD-ROM drivers (not SCSI, not IDE) 8.410 +# 8.411 +# CONFIG_CD_NO_IDESCSI is not set 8.412 + 8.413 +# 8.414 +# Multi-device support (RAID and LVM) 8.415 +# 8.416 +CONFIG_MD=y 8.417 +CONFIG_BLK_DEV_MD=y 8.418 +# CONFIG_MD_LINEAR is not set 8.419 +CONFIG_MD_RAID0=y 8.420 +CONFIG_MD_RAID1=y 8.421 +# CONFIG_MD_RAID10 is not set 8.422 +CONFIG_MD_RAID5=y 8.423 +# CONFIG_MD_RAID6 is not set 8.424 +# CONFIG_MD_MULTIPATH is not set 8.425 +# CONFIG_MD_FAULTY is not set 8.426 +CONFIG_BLK_DEV_DM=y 8.427 +# CONFIG_DM_CRYPT is not set 8.428 +CONFIG_DM_SNAPSHOT=y 8.429 +CONFIG_DM_MIRROR=y 8.430 +# CONFIG_DM_ZERO is not set 8.431 + 8.432 +# 8.433 +# Fusion MPT device support 8.434 +# 8.435 +# CONFIG_FUSION is not set 8.436 + 8.437 +# 8.438 +# IEEE 1394 (FireWire) support 8.439 +# 8.440 +# CONFIG_IEEE1394 is not set 8.441 + 8.442 +# 8.443 +# I2O device support 8.444 +# 8.445 +# CONFIG_I2O is not set 8.446 + 8.447 +# 8.448 +# Networking support 8.449 +# 8.450 +CONFIG_NET=y 8.451 + 8.452 +# 8.453 +# Networking options 8.454 +# 8.455 +CONFIG_PACKET=y 8.456 +# CONFIG_PACKET_MMAP is not set 8.457 +# CONFIG_NETLINK_DEV is not set 8.458 +CONFIG_UNIX=y 8.459 +# CONFIG_NET_KEY is not set 8.460 +CONFIG_INET=y 8.461 +# CONFIG_IP_MULTICAST is not set 8.462 +# CONFIG_IP_ADVANCED_ROUTER is not set 8.463 +CONFIG_IP_PNP=y 8.464 +CONFIG_IP_PNP_DHCP=y 8.465 +# CONFIG_IP_PNP_BOOTP is not set 8.466 +# CONFIG_IP_PNP_RARP is not set 8.467 +# CONFIG_NET_IPIP is not set 8.468 +# CONFIG_NET_IPGRE is not set 8.469 +# CONFIG_ARPD is not set 8.470 +# CONFIG_SYN_COOKIES is not set 8.471 +# CONFIG_INET_AH is not set 8.472 +# CONFIG_INET_ESP is not set 8.473 +# CONFIG_INET_IPCOMP is not set 8.474 +# CONFIG_INET_TUNNEL is not set 8.475 +CONFIG_IP_TCPDIAG=y 8.476 +# CONFIG_IP_TCPDIAG_IPV6 is not set 8.477 + 8.478 +# 8.479 +# IP: Virtual Server Configuration 8.480 +# 8.481 +# CONFIG_IP_VS is not set 8.482 +# CONFIG_IPV6 is not set 8.483 +CONFIG_NETFILTER=y 8.484 +# CONFIG_NETFILTER_DEBUG is not set 8.485 +CONFIG_BRIDGE_NETFILTER=y 8.486 + 8.487 +# 8.488 +# IP: Netfilter Configuration 8.489 +# 8.490 +CONFIG_IP_NF_CONNTRACK=m 8.491 +CONFIG_IP_NF_CT_ACCT=y 8.492 +# CONFIG_IP_NF_CONNTRACK_MARK is not set 8.493 +# CONFIG_IP_NF_CT_PROTO_SCTP is not set 8.494 +CONFIG_IP_NF_FTP=m 8.495 +# CONFIG_IP_NF_IRC is not set 8.496 +# CONFIG_IP_NF_TFTP is not set 8.497 +# CONFIG_IP_NF_AMANDA is not set 8.498 +# CONFIG_IP_NF_QUEUE is not set 8.499 +CONFIG_IP_NF_IPTABLES=m 8.500 +# CONFIG_IP_NF_MATCH_LIMIT is not set 8.501 +# CONFIG_IP_NF_MATCH_IPRANGE is not set 8.502 +# CONFIG_IP_NF_MATCH_MAC is not set 8.503 +# CONFIG_IP_NF_MATCH_PKTTYPE is not set 8.504 +# CONFIG_IP_NF_MATCH_MARK is not set 8.505 +# CONFIG_IP_NF_MATCH_MULTIPORT is not set 8.506 +# CONFIG_IP_NF_MATCH_TOS is not set 8.507 +# CONFIG_IP_NF_MATCH_RECENT is not set 8.508 +# CONFIG_IP_NF_MATCH_ECN is not set 8.509 +# CONFIG_IP_NF_MATCH_DSCP is not set 8.510 +# CONFIG_IP_NF_MATCH_AH_ESP is not set 8.511 +# CONFIG_IP_NF_MATCH_LENGTH is not set 8.512 +# CONFIG_IP_NF_MATCH_TTL is not set 8.513 +# CONFIG_IP_NF_MATCH_TCPMSS is not set 8.514 +# CONFIG_IP_NF_MATCH_HELPER is not set 8.515 +# CONFIG_IP_NF_MATCH_STATE is not set 8.516 +# CONFIG_IP_NF_MATCH_CONNTRACK is not set 8.517 +# CONFIG_IP_NF_MATCH_OWNER is not set 8.518 +# CONFIG_IP_NF_MATCH_PHYSDEV is not set 8.519 +# CONFIG_IP_NF_MATCH_ADDRTYPE is not set 8.520 +# CONFIG_IP_NF_MATCH_REALM is not set 8.521 +# CONFIG_IP_NF_MATCH_SCTP is not set 8.522 +# CONFIG_IP_NF_MATCH_COMMENT is not set 8.523 +# CONFIG_IP_NF_MATCH_HASHLIMIT is not set 8.524 +# CONFIG_IP_NF_FILTER is not set 8.525 +# CONFIG_IP_NF_TARGET_LOG is not set 8.526 +# CONFIG_IP_NF_TARGET_ULOG is not set 8.527 +# CONFIG_IP_NF_TARGET_TCPMSS is not set 8.528 +# CONFIG_IP_NF_NAT is not set 8.529 +# CONFIG_IP_NF_MANGLE is not set 8.530 +# CONFIG_IP_NF_RAW is not set 8.531 +# CONFIG_IP_NF_ARPTABLES is not set 8.532 +# CONFIG_IP_NF_COMPAT_IPCHAINS is not set 8.533 +# CONFIG_IP_NF_COMPAT_IPFWADM is not set 8.534 + 8.535 +# 8.536 +# Bridge: Netfilter Configuration 8.537 +# 8.538 +# CONFIG_BRIDGE_NF_EBTABLES is not set 8.539 + 8.540 +# 8.541 +# SCTP Configuration (EXPERIMENTAL) 8.542 +# 8.543 +# CONFIG_IP_SCTP is not set 8.544 +# CONFIG_ATM is not set 8.545 +CONFIG_BRIDGE=y 8.546 +# CONFIG_VLAN_8021Q is not set 8.547 +# CONFIG_DECNET is not set 8.548 +# CONFIG_LLC2 is not set 8.549 +# CONFIG_IPX is not set 8.550 +# CONFIG_ATALK is not set 8.551 +# CONFIG_X25 is not set 8.552 +# CONFIG_LAPB is not set 8.553 +# CONFIG_NET_DIVERT is not set 8.554 +# CONFIG_ECONET is not set 8.555 +# CONFIG_WAN_ROUTER is not set 8.556 + 8.557 +# 8.558 +# QoS and/or fair queueing 8.559 +# 8.560 +# CONFIG_NET_SCHED is not set 8.561 +# CONFIG_NET_CLS_ROUTE is not set 8.562 + 8.563 +# 8.564 +# Network testing 8.565 +# 8.566 +# CONFIG_NET_PKTGEN is not set 8.567 +# CONFIG_NETPOLL is not set 8.568 +# CONFIG_NET_POLL_CONTROLLER is not set 8.569 +# CONFIG_HAMRADIO is not set 8.570 +# CONFIG_IRDA is not set 8.571 +# CONFIG_BT is not set 8.572 +CONFIG_NETDEVICES=y 8.573 +# CONFIG_DUMMY is not set 8.574 +# CONFIG_BONDING is not set 8.575 +# CONFIG_EQUALIZER is not set 8.576 +# CONFIG_TUN is not set 8.577 + 8.578 +# 8.579 +# ARCnet devices 8.580 +# 8.581 +# CONFIG_ARCNET is not set 8.582 + 8.583 +# 8.584 +# Ethernet (10 or 100Mbit) 8.585 +# 8.586 +CONFIG_NET_ETHERNET=y 8.587 +CONFIG_MII=y 8.588 +# CONFIG_HAPPYMEAL is not set 8.589 +# CONFIG_SUNGEM is not set 8.590 +CONFIG_NET_VENDOR_3COM=y 8.591 +# CONFIG_EL1 is not set 8.592 +# CONFIG_EL2 is not set 8.593 +# CONFIG_ELPLUS is not set 8.594 +# CONFIG_EL16 is not set 8.595 +# CONFIG_EL3 is not set 8.596 +# CONFIG_3C515 is not set 8.597 +CONFIG_VORTEX=y 8.598 +# CONFIG_TYPHOON is not set 8.599 +# CONFIG_LANCE is not set 8.600 +# CONFIG_NET_VENDOR_SMC is not set 8.601 +# CONFIG_NET_VENDOR_RACAL is not set 8.602 + 8.603 +# 8.604 +# Tulip family network device support 8.605 +# 8.606 +CONFIG_NET_TULIP=y 8.607 +# CONFIG_DE2104X is not set 8.608 +CONFIG_TULIP=y 8.609 +# CONFIG_TULIP_MWI is not set 8.610 +# CONFIG_TULIP_MMIO is not set 8.611 +# CONFIG_TULIP_NAPI is not set 8.612 +# CONFIG_DE4X5 is not set 8.613 +# CONFIG_WINBOND_840 is not set 8.614 +# CONFIG_DM9102 is not set 8.615 +# CONFIG_AT1700 is not set 8.616 +# CONFIG_DEPCA is not set 8.617 +# CONFIG_HP100 is not set 8.618 +# CONFIG_NET_ISA is not set 8.619 +CONFIG_NET_PCI=y 8.620 +CONFIG_PCNET32=y 8.621 +# CONFIG_AMD8111_ETH is not set 8.622 +# CONFIG_ADAPTEC_STARFIRE is not set 8.623 +# CONFIG_AC3200 is not set 8.624 +# CONFIG_APRICOT is not set 8.625 +# CONFIG_B44 is not set 8.626 +# CONFIG_FORCEDETH is not set 8.627 +# CONFIG_CS89x0 is not set 8.628 +# CONFIG_DGRS is not set 8.629 +# CONFIG_EEPRO100 is not set 8.630 +CONFIG_E100=y 8.631 +# CONFIG_E100_NAPI is not set 8.632 +# CONFIG_FEALNX is not set 8.633 +# CONFIG_NATSEMI is not set 8.634 +# CONFIG_NE2K_PCI is not set 8.635 +# CONFIG_8139CP is not set 8.636 +CONFIG_8139TOO=y 8.637 +CONFIG_8139TOO_PIO=y 8.638 +# CONFIG_8139TOO_TUNE_TWISTER is not set 8.639 +# CONFIG_8139TOO_8129 is not set 8.640 +# CONFIG_8139_OLD_RX_RESET is not set 8.641 +# CONFIG_SIS900 is not set 8.642 +# CONFIG_EPIC100 is not set 8.643 +# CONFIG_SUNDANCE is not set 8.644 +# CONFIG_TLAN is not set 8.645 +CONFIG_VIA_RHINE=y 8.646 +# CONFIG_VIA_RHINE_MMIO is not set 8.647 +# CONFIG_NET_POCKET is not set 8.648 + 8.649 +# 8.650 +# Ethernet (1000 Mbit) 8.651 +# 8.652 +CONFIG_ACENIC=y 8.653 +# CONFIG_ACENIC_OMIT_TIGON_I is not set 8.654 +# CONFIG_DL2K is not set 8.655 +CONFIG_E1000=y 8.656 +# CONFIG_E1000_NAPI is not set 8.657 +# CONFIG_NS83820 is not set 8.658 +# CONFIG_HAMACHI is not set 8.659 +# CONFIG_YELLOWFIN is not set 8.660 +# CONFIG_R8169 is not set 8.661 +# CONFIG_SK98LIN is not set 8.662 +# CONFIG_VIA_VELOCITY is not set 8.663 +CONFIG_TIGON3=y 8.664 + 8.665 +# 8.666 +# Ethernet (10000 Mbit) 8.667 +# 8.668 +# CONFIG_IXGB is not set 8.669 +# CONFIG_S2IO is not set 8.670 + 8.671 +# 8.672 +# Token Ring devices 8.673 +# 8.674 +# CONFIG_TR is not set 8.675 + 8.676 +# 8.677 +# Wireless LAN (non-hamradio) 8.678 +# 8.679 +# CONFIG_NET_RADIO is not set 8.680 + 8.681 +# 8.682 +# Wan interfaces 8.683 +# 8.684 +# CONFIG_WAN is not set 8.685 +# CONFIG_FDDI is not set 8.686 +# CONFIG_HIPPI is not set 8.687 +# CONFIG_PPP is not set 8.688 +# CONFIG_SLIP is not set 8.689 +# CONFIG_NET_FC is not set 8.690 +# CONFIG_SHAPER is not set 8.691 +# CONFIG_NETCONSOLE is not set 8.692 + 8.693 +# 8.694 +# ISDN subsystem 8.695 +# 8.696 +# CONFIG_ISDN is not set 8.697 + 8.698 +# 8.699 +# Telephony Support 8.700 +# 8.701 +# CONFIG_PHONE is not set 8.702 + 8.703 +# 8.704 +# Input device support 8.705 +# 8.706 +CONFIG_INPUT=y 8.707 + 8.708 +# 8.709 +# Userland interfaces 8.710 +# 8.711 +CONFIG_INPUT_MOUSEDEV=y 8.712 +CONFIG_INPUT_MOUSEDEV_PSAUX=y 8.713 +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 8.714 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 8.715 +# CONFIG_INPUT_JOYDEV is not set 8.716 +# CONFIG_INPUT_TSDEV is not set 8.717 +# CONFIG_INPUT_EVDEV is not set 8.718 +# CONFIG_INPUT_EVBUG is not set 8.719 + 8.720 +# 8.721 +# Input I/O drivers 8.722 +# 8.723 +# CONFIG_GAMEPORT is not set 8.724 +CONFIG_SOUND_GAMEPORT=y 8.725 +CONFIG_SERIO=y 8.726 +CONFIG_SERIO_I8042=y 8.727 +CONFIG_SERIO_SERPORT=y 8.728 +# CONFIG_SERIO_CT82C710 is not set 8.729 +# CONFIG_SERIO_PCIPS2 is not set 8.730 +# CONFIG_SERIO_RAW is not set 8.731 + 8.732 +# 8.733 +# Input Device Drivers 8.734 +# 8.735 +CONFIG_INPUT_KEYBOARD=y 8.736 +CONFIG_KEYBOARD_ATKBD=y 8.737 +# CONFIG_KEYBOARD_SUNKBD is not set 8.738 +# CONFIG_KEYBOARD_LKKBD is not set 8.739 +# CONFIG_KEYBOARD_XTKBD is not set 8.740 +# CONFIG_KEYBOARD_NEWTON is not set 8.741 +CONFIG_INPUT_MOUSE=y 8.742 +CONFIG_MOUSE_PS2=y 8.743 +# CONFIG_MOUSE_SERIAL is not set 8.744 +# CONFIG_MOUSE_INPORT is not set 8.745 +# CONFIG_MOUSE_LOGIBM is not set 8.746 +# CONFIG_MOUSE_PC110PAD is not set 8.747 +# CONFIG_MOUSE_VSXXXAA is not set 8.748 +# CONFIG_INPUT_JOYSTICK is not set 8.749 +# CONFIG_INPUT_TOUCHSCREEN is not set 8.750 +# CONFIG_INPUT_MISC is not set 8.751 + 8.752 +# 8.753 +# Character devices 8.754 +# 8.755 +CONFIG_VT=y 8.756 +CONFIG_VT_CONSOLE=y 8.757 +CONFIG_HW_CONSOLE=y 8.758 +# CONFIG_SERIAL_NONSTANDARD is not set 8.759 + 8.760 +# 8.761 +# Serial drivers 8.762 +# 8.763 +# CONFIG_SERIAL_8250 is not set 8.764 + 8.765 +# 8.766 +# Non-8250 serial port support 8.767 +# 8.768 +CONFIG_UNIX98_PTYS=y 8.769 +CONFIG_LEGACY_PTYS=y 8.770 +CONFIG_LEGACY_PTY_COUNT=256 8.771 + 8.772 +# 8.773 +# IPMI 8.774 +# 8.775 +# CONFIG_IPMI_HANDLER is not set 8.776 + 8.777 +# 8.778 +# Watchdog Cards 8.779 +# 8.780 +# CONFIG_WATCHDOG is not set 8.781 +# CONFIG_HW_RANDOM is not set 8.782 +# CONFIG_NVRAM is not set 8.783 +# CONFIG_RTC is not set 8.784 +# CONFIG_GEN_RTC is not set 8.785 +# CONFIG_DTLK is not set 8.786 +# CONFIG_R3964 is not set 8.787 +# CONFIG_APPLICOM is not set 8.788 +# CONFIG_SONYPI is not set 8.789 + 8.790 +# 8.791 +# Ftape, the floppy tape device driver 8.792 +# 8.793 +# CONFIG_FTAPE is not set 8.794 +# CONFIG_AGP is not set 8.795 +# CONFIG_DRM is not set 8.796 +# CONFIG_MWAVE is not set 8.797 +# CONFIG_RAW_DRIVER is not set 8.798 +# CONFIG_HANGCHECK_TIMER is not set 8.799 + 8.800 +# 8.801 +# I2C support 8.802 +# 8.803 +# CONFIG_I2C is not set 8.804 + 8.805 +# 8.806 +# Dallas's 1-wire bus 8.807 +# 8.808 +# CONFIG_W1 is not set 8.809 + 8.810 +# 8.811 +# Misc devices 8.812 +# 8.813 +# CONFIG_IBM_ASM is not set 8.814 + 8.815 +# 8.816 +# Multimedia devices 8.817 +# 8.818 +# CONFIG_VIDEO_DEV is not set 8.819 + 8.820 +# 8.821 +# Digital Video Broadcasting Devices 8.822 +# 8.823 +# CONFIG_DVB is not set 8.824 + 8.825 +# 8.826 +# Graphics support 8.827 +# 8.828 +# CONFIG_FB is not set 8.829 +# CONFIG_VIDEO_SELECT is not set 8.830 + 8.831 +# 8.832 +# Console display driver support 8.833 +# 8.834 +CONFIG_VGA_CONSOLE=y 8.835 +# CONFIG_MDA_CONSOLE is not set 8.836 +CONFIG_DUMMY_CONSOLE=y 8.837 + 8.838 +# 8.839 +# Sound 8.840 +# 8.841 +# CONFIG_SOUND is not set 8.842 + 8.843 +# 8.844 +# USB support 8.845 +# 8.846 +# CONFIG_USB is not set 8.847 +CONFIG_USB_ARCH_HAS_HCD=y 8.848 +CONFIG_USB_ARCH_HAS_OHCI=y 8.849 + 8.850 +# 8.851 +# USB Gadget Support 8.852 +# 8.853 +# CONFIG_USB_GADGET is not set 8.854 + 8.855 +# 8.856 +# File systems 8.857 +# 8.858 +CONFIG_EXT2_FS=y 8.859 +# CONFIG_EXT2_FS_XATTR is not set 8.860 +CONFIG_EXT3_FS=y 8.861 +CONFIG_EXT3_FS_XATTR=y 8.862 +# CONFIG_EXT3_FS_POSIX_ACL is not set 8.863 +# CONFIG_EXT3_FS_SECURITY is not set 8.864 +CONFIG_JBD=y 8.865 +# CONFIG_JBD_DEBUG is not set 8.866 +CONFIG_FS_MBCACHE=y 8.867 +CONFIG_REISERFS_FS=y 8.868 +# CONFIG_REISERFS_CHECK is not set 8.869 +# CONFIG_REISERFS_PROC_INFO is not set 8.870 +# CONFIG_REISERFS_FS_XATTR is not set 8.871 +# CONFIG_JFS_FS is not set 8.872 +# CONFIG_XFS_FS is not set 8.873 +# CONFIG_MINIX_FS is not set 8.874 +# CONFIG_ROMFS_FS is not set 8.875 +# CONFIG_QUOTA is not set 8.876 +CONFIG_DNOTIFY=y 8.877 +# CONFIG_AUTOFS_FS is not set 8.878 +# CONFIG_AUTOFS4_FS is not set 8.879 + 8.880 +# 8.881 +# CD-ROM/DVD Filesystems 8.882 +# 8.883 +CONFIG_ISO9660_FS=y 8.884 +CONFIG_JOLIET=y 8.885 +CONFIG_ZISOFS=y 8.886 +CONFIG_ZISOFS_FS=y 8.887 +# CONFIG_UDF_FS is not set 8.888 + 8.889 +# 8.890 +# DOS/FAT/NT Filesystems 8.891 +# 8.892 +CONFIG_FAT_FS=m 8.893 +CONFIG_MSDOS_FS=m 8.894 +CONFIG_VFAT_FS=m 8.895 +CONFIG_FAT_DEFAULT_CODEPAGE=437 8.896 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" 8.897 +# CONFIG_NTFS_FS is not set 8.898 + 8.899 +# 8.900 +# Pseudo filesystems 8.901 +# 8.902 +CONFIG_PROC_FS=y 8.903 +CONFIG_PROC_KCORE=y 8.904 +CONFIG_SYSFS=y 8.905 +# CONFIG_DEVFS_FS is not set 8.906 +# CONFIG_DEVPTS_FS_XATTR is not set 8.907 +CONFIG_TMPFS=y 8.908 +# CONFIG_TMPFS_XATTR is not set 8.909 +# CONFIG_HUGETLBFS is not set 8.910 +# CONFIG_HUGETLB_PAGE is not set 8.911 +CONFIG_RAMFS=y 8.912 + 8.913 +# 8.914 +# Miscellaneous filesystems 8.915 +# 8.916 +# CONFIG_ADFS_FS is not set 8.917 +# CONFIG_AFFS_FS is not set 8.918 +# CONFIG_HFS_FS is not set 8.919 +# CONFIG_HFSPLUS_FS is not set 8.920 +# CONFIG_BEFS_FS is not set 8.921 +# CONFIG_BFS_FS is not set 8.922 +# CONFIG_EFS_FS is not set 8.923 +# CONFIG_CRAMFS is not set 8.924 +# CONFIG_VXFS_FS is not set 8.925 +# CONFIG_HPFS_FS is not set 8.926 +# CONFIG_QNX4FS_FS is not set 8.927 +# CONFIG_SYSV_FS is not set 8.928 +# CONFIG_UFS_FS is not set 8.929 + 8.930 +# 8.931 +# Network File Systems 8.932 +# 8.933 +CONFIG_NFS_FS=y 8.934 +CONFIG_NFS_V3=y 8.935 +# CONFIG_NFS_V4 is not set 8.936 +# CONFIG_NFS_DIRECTIO is not set 8.937 +CONFIG_NFSD=m 8.938 +CONFIG_NFSD_V3=y 8.939 +# CONFIG_NFSD_V4 is not set 8.940 +CONFIG_NFSD_TCP=y 8.941 +CONFIG_ROOT_NFS=y 8.942 +CONFIG_LOCKD=y 8.943 +CONFIG_LOCKD_V4=y 8.944 +CONFIG_EXPORTFS=m 8.945 +CONFIG_SUNRPC=y 8.946 +# CONFIG_RPCSEC_GSS_KRB5 is not set 8.947 +# CONFIG_RPCSEC_GSS_SPKM3 is not set 8.948 +# CONFIG_SMB_FS is not set 8.949 +# CONFIG_CIFS is not set 8.950 +# CONFIG_NCP_FS is not set 8.951 +# CONFIG_CODA_FS is not set 8.952 +# CONFIG_AFS_FS is not set 8.953 + 8.954 +# 8.955 +# Partition Types 8.956 +# 8.957 +# CONFIG_PARTITION_ADVANCED is not set 8.958 +CONFIG_MSDOS_PARTITION=y 8.959 + 8.960 +# 8.961 +# Native Language Support 8.962 +# 8.963 +CONFIG_NLS=y 8.964 +CONFIG_NLS_DEFAULT="iso8859-1" 8.965 +CONFIG_NLS_CODEPAGE_437=y 8.966 +# CONFIG_NLS_CODEPAGE_737 is not set 8.967 +# CONFIG_NLS_CODEPAGE_775 is not set 8.968 +# CONFIG_NLS_CODEPAGE_850 is not set 8.969 +# CONFIG_NLS_CODEPAGE_852 is not set 8.970 +# CONFIG_NLS_CODEPAGE_855 is not set 8.971 +# CONFIG_NLS_CODEPAGE_857 is not set 8.972 +# CONFIG_NLS_CODEPAGE_860 is not set 8.973 +# CONFIG_NLS_CODEPAGE_861 is not set 8.974 +# CONFIG_NLS_CODEPAGE_862 is not set 8.975 +# CONFIG_NLS_CODEPAGE_863 is not set 8.976 +# CONFIG_NLS_CODEPAGE_864 is not set 8.977 +# CONFIG_NLS_CODEPAGE_865 is not set 8.978 +# CONFIG_NLS_CODEPAGE_866 is not set 8.979 +# CONFIG_NLS_CODEPAGE_869 is not set 8.980 +# CONFIG_NLS_CODEPAGE_936 is not set 8.981 +# CONFIG_NLS_CODEPAGE_950 is not set 8.982 +# CONFIG_NLS_CODEPAGE_932 is not set 8.983 +# CONFIG_NLS_CODEPAGE_949 is not set 8.984 +# CONFIG_NLS_CODEPAGE_874 is not set 8.985 +# CONFIG_NLS_ISO8859_8 is not set 8.986 +# CONFIG_NLS_CODEPAGE_1250 is not set 8.987 +# CONFIG_NLS_CODEPAGE_1251 is not set 8.988 +# CONFIG_NLS_ASCII is not set 8.989 +CONFIG_NLS_ISO8859_1=y 8.990 +# CONFIG_NLS_ISO8859_2 is not set 8.991 +# CONFIG_NLS_ISO8859_3 is not set 8.992 +# CONFIG_NLS_ISO8859_4 is not set 8.993 +# CONFIG_NLS_ISO8859_5 is not set 8.994 +# CONFIG_NLS_ISO8859_6 is not set 8.995 +# CONFIG_NLS_ISO8859_7 is not set 8.996 +# CONFIG_NLS_ISO8859_9 is not set 8.997 +# CONFIG_NLS_ISO8859_13 is not set 8.998 +# CONFIG_NLS_ISO8859_14 is not set 8.999 +# CONFIG_NLS_ISO8859_15 is not set 8.1000 +# CONFIG_NLS_KOI8_R is not set 8.1001 +# CONFIG_NLS_KOI8_U is not set 8.1002 +# CONFIG_NLS_UTF8 is not set 8.1003 + 8.1004 +# 8.1005 +# Security options 8.1006 +# 8.1007 +# CONFIG_KEYS is not set 8.1008 +# CONFIG_SECURITY is not set 8.1009 + 8.1010 +# 8.1011 +# Cryptographic options 8.1012 +# 8.1013 +CONFIG_CRYPTO=y 8.1014 +CONFIG_CRYPTO_HMAC=y 8.1015 +# CONFIG_CRYPTO_NULL is not set 8.1016 +# CONFIG_CRYPTO_MD4 is not set 8.1017 +CONFIG_CRYPTO_MD5=m 8.1018 +CONFIG_CRYPTO_SHA1=m 8.1019 +# CONFIG_CRYPTO_SHA256 is not set 8.1020 +# CONFIG_CRYPTO_SHA512 is not set 8.1021 +# CONFIG_CRYPTO_WP512 is not set 8.1022 +CONFIG_CRYPTO_DES=m 8.1023 +# CONFIG_CRYPTO_BLOWFISH is not set 8.1024 +# CONFIG_CRYPTO_TWOFISH is not set 8.1025 +# CONFIG_CRYPTO_SERPENT is not set 8.1026 +# CONFIG_CRYPTO_AES_586 is not set 8.1027 +# CONFIG_CRYPTO_CAST5 is not set 8.1028 +# CONFIG_CRYPTO_CAST6 is not set 8.1029 +# CONFIG_CRYPTO_TEA is not set 8.1030 +# CONFIG_CRYPTO_ARC4 is not set 8.1031 +# CONFIG_CRYPTO_KHAZAD is not set 8.1032 +# CONFIG_CRYPTO_ANUBIS is not set 8.1033 +# CONFIG_CRYPTO_DEFLATE is not set 8.1034 +# CONFIG_CRYPTO_MICHAEL_MIC is not set 8.1035 +CONFIG_CRYPTO_CRC32C=m 8.1036 +# CONFIG_CRYPTO_TEST is not set 8.1037 + 8.1038 +# 8.1039 +# Library routines 8.1040 +# 8.1041 +# CONFIG_CRC_CCITT is not set 8.1042 +CONFIG_CRC32=y 8.1043 +CONFIG_LIBCRC32C=y 8.1044 +CONFIG_ZLIB_INFLATE=y
9.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 9.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/configs/xenU_defconfig Fri Nov 19 23:17:26 2004 +0000 9.3 @@ -0,0 +1,501 @@ 9.4 +# 9.5 +# Automatically generated make config: don't edit 9.6 +# Linux kernel version: 2.6.10-rc2-xenU 9.7 +# Fri Nov 19 20:16:52 2004 9.8 +# 9.9 +CONFIG_XEN=y 9.10 +CONFIG_ARCH_XEN=y 9.11 +CONFIG_NO_IDLE_HZ=y 9.12 + 9.13 +# 9.14 +# XEN 9.15 +# 9.16 +# CONFIG_XEN_PRIVILEGED_GUEST is not set 9.17 +# CONFIG_XEN_PHYSDEV_ACCESS is not set 9.18 +# CONFIG_XEN_BLKDEV_BACKEND is not set 9.19 +# CONFIG_XEN_NETDEV_BACKEND is not set 9.20 +CONFIG_XEN_BLKDEV_FRONTEND=y 9.21 +CONFIG_XEN_NETDEV_FRONTEND=y 9.22 +# CONFIG_XEN_NETDEV_FRONTEND_PIPELINED_TRANSMITTER is not set 9.23 +CONFIG_XEN_WRITABLE_PAGETABLES=y 9.24 +CONFIG_XEN_SCRUB_PAGES=y 9.25 +CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y 9.26 +CONFIG_X86=y 9.27 +# CONFIG_X86_64 is not set 9.28 + 9.29 +# 9.30 +# Code maturity level options 9.31 +# 9.32 +CONFIG_EXPERIMENTAL=y 9.33 +CONFIG_CLEAN_COMPILE=y 9.34 +CONFIG_BROKEN_ON_SMP=y 9.35 +CONFIG_LOCK_KERNEL=y 9.36 + 9.37 +# 9.38 +# General setup 9.39 +# 9.40 +CONFIG_LOCALVERSION="" 9.41 +CONFIG_SWAP=y 9.42 +CONFIG_SYSVIPC=y 9.43 +# CONFIG_POSIX_MQUEUE is not set 9.44 +# CONFIG_BSD_PROCESS_ACCT is not set 9.45 +CONFIG_SYSCTL=y 9.46 +# CONFIG_AUDIT is not set 9.47 +CONFIG_LOG_BUF_SHIFT=14 9.48 +CONFIG_HOTPLUG=y 9.49 +CONFIG_KOBJECT_UEVENT=y 9.50 +# CONFIG_IKCONFIG is not set 9.51 +# CONFIG_EMBEDDED is not set 9.52 +CONFIG_KALLSYMS=y 9.53 +# CONFIG_KALLSYMS_EXTRA_PASS is not set 9.54 +CONFIG_FUTEX=y 9.55 +CONFIG_EPOLL=y 9.56 +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set 9.57 +CONFIG_SHMEM=y 9.58 +CONFIG_CC_ALIGN_FUNCTIONS=0 9.59 +CONFIG_CC_ALIGN_LABELS=0 9.60 +CONFIG_CC_ALIGN_LOOPS=0 9.61 +CONFIG_CC_ALIGN_JUMPS=0 9.62 +# CONFIG_TINY_SHMEM is not set 9.63 + 9.64 +# 9.65 +# Loadable module support 9.66 +# 9.67 +CONFIG_MODULES=y 9.68 +CONFIG_MODULE_UNLOAD=y 9.69 +# CONFIG_MODULE_FORCE_UNLOAD is not set 9.70 +CONFIG_OBSOLETE_MODPARM=y 9.71 +# CONFIG_MODVERSIONS is not set 9.72 +# CONFIG_MODULE_SRCVERSION_ALL is not set 9.73 +CONFIG_KMOD=y 9.74 + 9.75 +# 9.76 +# X86 Processor Configuration 9.77 +# 9.78 +CONFIG_XENARCH="i386" 9.79 +CONFIG_MMU=y 9.80 +CONFIG_UID16=y 9.81 +CONFIG_GENERIC_ISA_DMA=y 9.82 +CONFIG_GENERIC_IOMAP=y 9.83 +# CONFIG_M686 is not set 9.84 +# CONFIG_MPENTIUMII is not set 9.85 +# CONFIG_MPENTIUMIII is not set 9.86 +# CONFIG_MPENTIUMM is not set 9.87 +CONFIG_MPENTIUM4=y 9.88 +# CONFIG_MK6 is not set 9.89 +# CONFIG_MK7 is not set 9.90 +# CONFIG_MK8 is not set 9.91 +# CONFIG_MCRUSOE is not set 9.92 +# CONFIG_MCYRIXIII is not set 9.93 +# CONFIG_MVIAC3_2 is not set 9.94 +# CONFIG_X86_GENERIC is not set 9.95 +CONFIG_X86_CMPXCHG=y 9.96 +CONFIG_X86_XADD=y 9.97 +CONFIG_X86_L1_CACHE_SHIFT=7 9.98 +CONFIG_RWSEM_XCHGADD_ALGORITHM=y 9.99 +CONFIG_X86_WP_WORKS_OK=y 9.100 +CONFIG_X86_INVLPG=y 9.101 +CONFIG_X86_BSWAP=y 9.102 +CONFIG_X86_POPAD_OK=y 9.103 +CONFIG_X86_GOOD_APIC=y 9.104 +CONFIG_X86_INTEL_USERCOPY=y 9.105 +CONFIG_X86_USE_PPRO_CHECKSUM=y 9.106 +# CONFIG_HPET_TIMER is not set 9.107 +# CONFIG_HPET_EMULATE_RTC is not set 9.108 +# CONFIG_SMP is not set 9.109 +CONFIG_PREEMPT=y 9.110 +CONFIG_X86_CPUID=y 9.111 + 9.112 +# 9.113 +# Firmware Drivers 9.114 +# 9.115 +# CONFIG_EDD is not set 9.116 +CONFIG_NOHIGHMEM=y 9.117 +# CONFIG_HIGHMEM4G is not set 9.118 +CONFIG_HAVE_DEC_LOCK=y 9.119 +# CONFIG_REGPARM is not set 9.120 + 9.121 +# 9.122 +# Kernel hacking 9.123 +# 9.124 +# CONFIG_DEBUG_KERNEL is not set 9.125 +CONFIG_EARLY_PRINTK=y 9.126 +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set 9.127 +# CONFIG_FRAME_POINTER is not set 9.128 +# CONFIG_4KSTACKS is not set 9.129 +CONFIG_GENERIC_HARDIRQS=y 9.130 +CONFIG_GENERIC_IRQ_PROBE=y 9.131 +CONFIG_X86_BIOS_REBOOT=y 9.132 +CONFIG_PC=y 9.133 + 9.134 +# 9.135 +# Executable file formats 9.136 +# 9.137 +CONFIG_BINFMT_ELF=y 9.138 +# CONFIG_BINFMT_AOUT is not set 9.139 +# CONFIG_BINFMT_MISC is not set 9.140 + 9.141 +# 9.142 +# Device Drivers 9.143 +# 9.144 + 9.145 +# 9.146 +# Generic Driver Options 9.147 +# 9.148 +CONFIG_STANDALONE=y 9.149 +CONFIG_PREVENT_FIRMWARE_BUILD=y 9.150 +# CONFIG_FW_LOADER is not set 9.151 + 9.152 +# 9.153 +# Block devices 9.154 +# 9.155 +# CONFIG_BLK_DEV_FD is not set 9.156 +CONFIG_BLK_DEV_LOOP=m 9.157 +# CONFIG_BLK_DEV_CRYPTOLOOP is not set 9.158 +CONFIG_BLK_DEV_NBD=m 9.159 +CONFIG_BLK_DEV_RAM=y 9.160 +CONFIG_BLK_DEV_RAM_SIZE=4096 9.161 +CONFIG_BLK_DEV_INITRD=y 9.162 +CONFIG_INITRAMFS_SOURCE="" 9.163 +# CONFIG_LBD is not set 9.164 +# CONFIG_CDROM_PKTCDVD is not set 9.165 + 9.166 +# 9.167 +# IO Schedulers 9.168 +# 9.169 +CONFIG_IOSCHED_NOOP=y 9.170 +CONFIG_IOSCHED_AS=y 9.171 +CONFIG_IOSCHED_DEADLINE=y 9.172 +CONFIG_IOSCHED_CFQ=y 9.173 + 9.174 +# 9.175 +# SCSI device support 9.176 +# 9.177 +CONFIG_SCSI=m 9.178 +CONFIG_SCSI_PROC_FS=y 9.179 + 9.180 +# 9.181 +# SCSI support type (disk, tape, CD-ROM) 9.182 +# 9.183 +CONFIG_BLK_DEV_SD=m 9.184 +# CONFIG_CHR_DEV_ST is not set 9.185 +# CONFIG_CHR_DEV_OSST is not set 9.186 +# CONFIG_BLK_DEV_SR is not set 9.187 +# CONFIG_CHR_DEV_SG is not set 9.188 + 9.189 +# 9.190 +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs 9.191 +# 9.192 +# CONFIG_SCSI_MULTI_LUN is not set 9.193 +# CONFIG_SCSI_CONSTANTS is not set 9.194 +# CONFIG_SCSI_LOGGING is not set 9.195 + 9.196 +# 9.197 +# SCSI Transport Attributes 9.198 +# 9.199 +# CONFIG_SCSI_SPI_ATTRS is not set 9.200 +# CONFIG_SCSI_FC_ATTRS is not set 9.201 + 9.202 +# 9.203 +# SCSI low-level drivers 9.204 +# 9.205 +# CONFIG_SCSI_SATA is not set 9.206 +# CONFIG_SCSI_QLOGIC_1280_1040 is not set 9.207 +# CONFIG_SCSI_DEBUG is not set 9.208 + 9.209 +# 9.210 +# Multi-device support (RAID and LVM) 9.211 +# 9.212 +# CONFIG_MD is not set 9.213 + 9.214 +# 9.215 +# Networking support 9.216 +# 9.217 +CONFIG_NET=y 9.218 + 9.219 +# 9.220 +# Networking options 9.221 +# 9.222 +CONFIG_PACKET=y 9.223 +# CONFIG_PACKET_MMAP is not set 9.224 +# CONFIG_NETLINK_DEV is not set 9.225 +CONFIG_UNIX=y 9.226 +# CONFIG_NET_KEY is not set 9.227 +CONFIG_INET=y 9.228 +# CONFIG_IP_MULTICAST is not set 9.229 +# CONFIG_IP_ADVANCED_ROUTER is not set 9.230 +CONFIG_IP_PNP=y 9.231 +# CONFIG_IP_PNP_DHCP is not set 9.232 +# CONFIG_IP_PNP_BOOTP is not set 9.233 +# CONFIG_IP_PNP_RARP is not set 9.234 +# CONFIG_NET_IPIP is not set 9.235 +# CONFIG_NET_IPGRE is not set 9.236 +# CONFIG_ARPD is not set 9.237 +# CONFIG_SYN_COOKIES is not set 9.238 +# CONFIG_INET_AH is not set 9.239 +# CONFIG_INET_ESP is not set 9.240 +# CONFIG_INET_IPCOMP is not set 9.241 +# CONFIG_INET_TUNNEL is not set 9.242 +CONFIG_IP_TCPDIAG=y 9.243 +# CONFIG_IP_TCPDIAG_IPV6 is not set 9.244 +# CONFIG_IPV6 is not set 9.245 +# CONFIG_NETFILTER is not set 9.246 + 9.247 +# 9.248 +# SCTP Configuration (EXPERIMENTAL) 9.249 +# 9.250 +# CONFIG_IP_SCTP is not set 9.251 +# CONFIG_ATM is not set 9.252 +# CONFIG_BRIDGE is not set 9.253 +# CONFIG_VLAN_8021Q is not set 9.254 +# CONFIG_DECNET is not set 9.255 +# CONFIG_LLC2 is not set 9.256 +# CONFIG_IPX is not set 9.257 +# CONFIG_ATALK is not set 9.258 +# CONFIG_X25 is not set 9.259 +# CONFIG_LAPB is not set 9.260 +# CONFIG_NET_DIVERT is not set 9.261 +# CONFIG_ECONET is not set 9.262 +# CONFIG_WAN_ROUTER is not set 9.263 + 9.264 +# 9.265 +# QoS and/or fair queueing 9.266 +# 9.267 +# CONFIG_NET_SCHED is not set 9.268 +# CONFIG_NET_CLS_ROUTE is not set 9.269 + 9.270 +# 9.271 +# Network testing 9.272 +# 9.273 +# CONFIG_NET_PKTGEN is not set 9.274 +# CONFIG_NETPOLL is not set 9.275 +# CONFIG_NET_POLL_CONTROLLER is not set 9.276 +# CONFIG_HAMRADIO is not set 9.277 +# CONFIG_IRDA is not set 9.278 +# CONFIG_BT is not set 9.279 +CONFIG_NETDEVICES=y 9.280 +# CONFIG_DUMMY is not set 9.281 +# CONFIG_BONDING is not set 9.282 +# CONFIG_EQUALIZER is not set 9.283 +# CONFIG_TUN is not set 9.284 + 9.285 +# 9.286 +# Ethernet (10 or 100Mbit) 9.287 +# 9.288 +# CONFIG_NET_ETHERNET is not set 9.289 + 9.290 +# 9.291 +# Ethernet (1000 Mbit) 9.292 +# 9.293 + 9.294 +# 9.295 +# Ethernet (10000 Mbit) 9.296 +# 9.297 + 9.298 +# 9.299 +# Token Ring devices 9.300 +# 9.301 + 9.302 +# 9.303 +# Wireless LAN (non-hamradio) 9.304 +# 9.305 +# CONFIG_NET_RADIO is not set 9.306 + 9.307 +# 9.308 +# Wan interfaces 9.309 +# 9.310 +# CONFIG_WAN is not set 9.311 +# CONFIG_PPP is not set 9.312 +# CONFIG_SLIP is not set 9.313 +# CONFIG_SHAPER is not set 9.314 +# CONFIG_NETCONSOLE is not set 9.315 +CONFIG_UNIX98_PTYS=y 9.316 + 9.317 +# 9.318 +# File systems 9.319 +# 9.320 +CONFIG_EXT2_FS=y 9.321 +# CONFIG_EXT2_FS_XATTR is not set 9.322 +CONFIG_EXT3_FS=y 9.323 +CONFIG_EXT3_FS_XATTR=y 9.324 +# CONFIG_EXT3_FS_POSIX_ACL is not set 9.325 +# CONFIG_EXT3_FS_SECURITY is not set 9.326 +CONFIG_JBD=y 9.327 +# CONFIG_JBD_DEBUG is not set 9.328 +CONFIG_FS_MBCACHE=y 9.329 +CONFIG_REISERFS_FS=y 9.330 +# CONFIG_REISERFS_CHECK is not set 9.331 +# CONFIG_REISERFS_PROC_INFO is not set 9.332 +# CONFIG_REISERFS_FS_XATTR is not set 9.333 +# CONFIG_JFS_FS is not set 9.334 +# CONFIG_XFS_FS is not set 9.335 +# CONFIG_MINIX_FS is not set 9.336 +# CONFIG_ROMFS_FS is not set 9.337 +# CONFIG_QUOTA is not set 9.338 +CONFIG_DNOTIFY=y 9.339 +CONFIG_AUTOFS_FS=y 9.340 +CONFIG_AUTOFS4_FS=y 9.341 + 9.342 +# 9.343 +# CD-ROM/DVD Filesystems 9.344 +# 9.345 +CONFIG_ISO9660_FS=y 9.346 +CONFIG_JOLIET=y 9.347 +CONFIG_ZISOFS=y 9.348 +CONFIG_ZISOFS_FS=y 9.349 +# CONFIG_UDF_FS is not set 9.350 + 9.351 +# 9.352 +# DOS/FAT/NT Filesystems 9.353 +# 9.354 +CONFIG_FAT_FS=m 9.355 +CONFIG_MSDOS_FS=m 9.356 +CONFIG_VFAT_FS=m 9.357 +CONFIG_FAT_DEFAULT_CODEPAGE=437 9.358 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" 9.359 +# CONFIG_NTFS_FS is not set 9.360 + 9.361 +# 9.362 +# Pseudo filesystems 9.363 +# 9.364 +CONFIG_PROC_FS=y 9.365 +CONFIG_PROC_KCORE=y 9.366 +CONFIG_SYSFS=y 9.367 +# CONFIG_DEVFS_FS is not set 9.368 +CONFIG_DEVPTS_FS_XATTR=y 9.369 +# CONFIG_DEVPTS_FS_SECURITY is not set 9.370 +CONFIG_TMPFS=y 9.371 +# CONFIG_TMPFS_XATTR is not set 9.372 +# CONFIG_HUGETLBFS is not set 9.373 +# CONFIG_HUGETLB_PAGE is not set 9.374 +CONFIG_RAMFS=y 9.375 + 9.376 +# 9.377 +# Miscellaneous filesystems 9.378 +# 9.379 +# CONFIG_ADFS_FS is not set 9.380 +# CONFIG_AFFS_FS is not set 9.381 +# CONFIG_HFS_FS is not set 9.382 +# CONFIG_HFSPLUS_FS is not set 9.383 +# CONFIG_BEFS_FS is not set 9.384 +# CONFIG_BFS_FS is not set 9.385 +# CONFIG_EFS_FS is not set 9.386 +# CONFIG_CRAMFS is not set 9.387 +# CONFIG_VXFS_FS is not set 9.388 +# CONFIG_HPFS_FS is not set 9.389 +# CONFIG_QNX4FS_FS is not set 9.390 +# CONFIG_SYSV_FS is not set 9.391 +# CONFIG_UFS_FS is not set 9.392 + 9.393 +# 9.394 +# Network File Systems 9.395 +# 9.396 +CONFIG_NFS_FS=y 9.397 +CONFIG_NFS_V3=y 9.398 +# CONFIG_NFS_V4 is not set 9.399 +# CONFIG_NFS_DIRECTIO is not set 9.400 +# CONFIG_NFSD is not set 9.401 +CONFIG_ROOT_NFS=y 9.402 +CONFIG_LOCKD=y 9.403 +CONFIG_LOCKD_V4=y 9.404 +# CONFIG_EXPORTFS is not set 9.405 +CONFIG_SUNRPC=y 9.406 +# CONFIG_RPCSEC_GSS_KRB5 is not set 9.407 +# CONFIG_RPCSEC_GSS_SPKM3 is not set 9.408 +# CONFIG_SMB_FS is not set 9.409 +# CONFIG_CIFS is not set 9.410 +# CONFIG_NCP_FS is not set 9.411 +# CONFIG_CODA_FS is not set 9.412 +# CONFIG_AFS_FS is not set 9.413 + 9.414 +# 9.415 +# Partition Types 9.416 +# 9.417 +# CONFIG_PARTITION_ADVANCED is not set 9.418 +CONFIG_MSDOS_PARTITION=y 9.419 + 9.420 +# 9.421 +# Native Language Support 9.422 +# 9.423 +CONFIG_NLS=y 9.424 +CONFIG_NLS_DEFAULT="iso8859-1" 9.425 +CONFIG_NLS_CODEPAGE_437=y 9.426 +# CONFIG_NLS_CODEPAGE_737 is not set 9.427 +# CONFIG_NLS_CODEPAGE_775 is not set 9.428 +# CONFIG_NLS_CODEPAGE_850 is not set 9.429 +# CONFIG_NLS_CODEPAGE_852 is not set 9.430 +# CONFIG_NLS_CODEPAGE_855 is not set 9.431 +# CONFIG_NLS_CODEPAGE_857 is not set 9.432 +# CONFIG_NLS_CODEPAGE_860 is not set 9.433 +# CONFIG_NLS_CODEPAGE_861 is not set 9.434 +# CONFIG_NLS_CODEPAGE_862 is not set 9.435 +# CONFIG_NLS_CODEPAGE_863 is not set 9.436 +# CONFIG_NLS_CODEPAGE_864 is not set 9.437 +# CONFIG_NLS_CODEPAGE_865 is not set 9.438 +# CONFIG_NLS_CODEPAGE_866 is not set 9.439 +# CONFIG_NLS_CODEPAGE_869 is not set 9.440 +# CONFIG_NLS_CODEPAGE_936 is not set 9.441 +# CONFIG_NLS_CODEPAGE_950 is not set 9.442 +# CONFIG_NLS_CODEPAGE_932 is not set 9.443 +# CONFIG_NLS_CODEPAGE_949 is not set 9.444 +# CONFIG_NLS_CODEPAGE_874 is not set 9.445 +# CONFIG_NLS_ISO8859_8 is not set 9.446 +# CONFIG_NLS_CODEPAGE_1250 is not set 9.447 +# CONFIG_NLS_CODEPAGE_1251 is not set 9.448 +# CONFIG_NLS_ASCII is not set 9.449 +CONFIG_NLS_ISO8859_1=y 9.450 +# CONFIG_NLS_ISO8859_2 is not set 9.451 +# CONFIG_NLS_ISO8859_3 is not set 9.452 +# CONFIG_NLS_ISO8859_4 is not set 9.453 +# CONFIG_NLS_ISO8859_5 is not set 9.454 +# CONFIG_NLS_ISO8859_6 is not set 9.455 +# CONFIG_NLS_ISO8859_7 is not set 9.456 +# CONFIG_NLS_ISO8859_9 is not set 9.457 +# CONFIG_NLS_ISO8859_13 is not set 9.458 +# CONFIG_NLS_ISO8859_14 is not set 9.459 +# CONFIG_NLS_ISO8859_15 is not set 9.460 +# CONFIG_NLS_KOI8_R is not set 9.461 +# CONFIG_NLS_KOI8_U is not set 9.462 +# CONFIG_NLS_UTF8 is not set 9.463 + 9.464 +# 9.465 +# Security options 9.466 +# 9.467 +# CONFIG_KEYS is not set 9.468 +# CONFIG_SECURITY is not set 9.469 + 9.470 +# 9.471 +# Cryptographic options 9.472 +# 9.473 +CONFIG_CRYPTO=y 9.474 +# CONFIG_CRYPTO_HMAC is not set 9.475 +# CONFIG_CRYPTO_NULL is not set 9.476 +# CONFIG_CRYPTO_MD4 is not set 9.477 +CONFIG_CRYPTO_MD5=m 9.478 +# CONFIG_CRYPTO_SHA1 is not set 9.479 +# CONFIG_CRYPTO_SHA256 is not set 9.480 +# CONFIG_CRYPTO_SHA512 is not set 9.481 +# CONFIG_CRYPTO_WP512 is not set 9.482 +# CONFIG_CRYPTO_DES is not set 9.483 +# CONFIG_CRYPTO_BLOWFISH is not set 9.484 +# CONFIG_CRYPTO_TWOFISH is not set 9.485 +# CONFIG_CRYPTO_SERPENT is not set 9.486 +# CONFIG_CRYPTO_AES_586 is not set 9.487 +# CONFIG_CRYPTO_CAST5 is not set 9.488 +# CONFIG_CRYPTO_CAST6 is not set 9.489 +# CONFIG_CRYPTO_TEA is not set 9.490 +# CONFIG_CRYPTO_ARC4 is not set 9.491 +# CONFIG_CRYPTO_KHAZAD is not set 9.492 +# CONFIG_CRYPTO_ANUBIS is not set 9.493 +# CONFIG_CRYPTO_DEFLATE is not set 9.494 +# CONFIG_CRYPTO_MICHAEL_MIC is not set 9.495 +CONFIG_CRYPTO_CRC32C=m 9.496 +# CONFIG_CRYPTO_TEST is not set 9.497 + 9.498 +# 9.499 +# Library routines 9.500 +# 9.501 +# CONFIG_CRC_CCITT is not set 9.502 +# CONFIG_CRC32 is not set 9.503 +CONFIG_LIBCRC32C=m 9.504 +CONFIG_ZLIB_INFLATE=y
10.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 10.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/i386/Kconfig Fri Nov 19 23:17:26 2004 +0000 10.3 @@ -0,0 +1,951 @@ 10.4 +# 10.5 +# For a description of the syntax of this configuration file, 10.6 +# see Documentation/kbuild/kconfig-language.txt. 10.7 +# 10.8 + 10.9 +menu "X86 Processor Configuration" 10.10 + 10.11 +config XENARCH 10.12 + string 10.13 + default i386 10.14 + 10.15 +config MMU 10.16 + bool 10.17 + default y 10.18 + 10.19 +config SBUS 10.20 + bool 10.21 + 10.22 +config UID16 10.23 + bool 10.24 + default y 10.25 + 10.26 +config GENERIC_ISA_DMA 10.27 + bool 10.28 + default y 10.29 + 10.30 +config GENERIC_IOMAP 10.31 + bool 10.32 + default y 10.33 + 10.34 +choice 10.35 + prompt "Processor family" 10.36 + default M686 10.37 + 10.38 +#config M386 10.39 +# bool "386" 10.40 +# ---help--- 10.41 +# This is the processor type of your CPU. This information is used for 10.42 +# optimizing purposes. In order to compile a kernel that can run on 10.43 +# all x86 CPU types (albeit not optimally fast), you can specify 10.44 +# "386" here. 10.45 +# 10.46 +# The kernel will not necessarily run on earlier architectures than 10.47 +# the one you have chosen, e.g. a Pentium optimized kernel will run on 10.48 +# a PPro, but not necessarily on a i486. 10.49 +# 10.50 +# Here are the settings recommended for greatest speed: 10.51 +# - "386" for the AMD/Cyrix/Intel 386DX/DXL/SL/SLC/SX, Cyrix/TI 10.52 +# 486DLC/DLC2, UMC 486SX-S and NexGen Nx586. Only "386" kernels 10.53 +# will run on a 386 class machine. 10.54 +# - "486" for the AMD/Cyrix/IBM/Intel 486DX/DX2/DX4 or 10.55 +# SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5D or U5S. 10.56 +# - "586" for generic Pentium CPUs lacking the TSC 10.57 +# (time stamp counter) register. 10.58 +# - "Pentium-Classic" for the Intel Pentium. 10.59 +# - "Pentium-MMX" for the Intel Pentium MMX. 10.60 +# - "Pentium-Pro" for the Intel Pentium Pro. 10.61 +# - "Pentium-II" for the Intel Pentium II or pre-Coppermine Celeron. 10.62 +# - "Pentium-III" for the Intel Pentium III or Coppermine Celeron. 10.63 +# - "Pentium-4" for the Intel Pentium 4 or P4-based Celeron. 10.64 +# - "K6" for the AMD K6, K6-II and K6-III (aka K6-3D). 10.65 +# - "Athlon" for the AMD K7 family (Athlon/Duron/Thunderbird). 10.66 +# - "Crusoe" for the Transmeta Crusoe series. 10.67 +# - "Efficeon" for the Transmeta Efficeon series. 10.68 +# - "Winchip-C6" for original IDT Winchip. 10.69 +# - "Winchip-2" for IDT Winchip 2. 10.70 +# - "Winchip-2A" for IDT Winchips with 3dNow! capabilities. 10.71 +# - "CyrixIII/VIA C3" for VIA Cyrix III or VIA C3. 10.72 +# - "VIA C3-2 for VIA C3-2 "Nehemiah" (model 9 and above). 10.73 +# 10.74 +# If you don't know what to do, choose "386". 10.75 + 10.76 +#config M486 10.77 +# bool "486" 10.78 +# help 10.79 +# Select this for a 486 series processor, either Intel or one of the 10.80 +# compatible processors from AMD, Cyrix, IBM, or Intel. Includes DX, 10.81 +# DX2, and DX4 variants; also SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5D or 10.82 +# U5S. 10.83 + 10.84 +#config M586 10.85 +# bool "586/K5/5x86/6x86/6x86MX" 10.86 +# help 10.87 +# Select this for an 586 or 686 series processor such as the AMD K5, 10.88 +# the Intel 5x86 or 6x86, or the Intel 6x86MX. This choice does not 10.89 +# assume the RDTSC (Read Time Stamp Counter) instruction. 10.90 + 10.91 +#config M586TSC 10.92 +# bool "Pentium-Classic" 10.93 +# help 10.94 +# Select this for a Pentium Classic processor with the RDTSC (Read 10.95 +# Time Stamp Counter) instruction for benchmarking. 10.96 + 10.97 +#config M586MMX 10.98 +# bool "Pentium-MMX" 10.99 +# help 10.100 +# Select this for a Pentium with the MMX graphics/multimedia 10.101 +# extended instructions. 10.102 + 10.103 +config M686 10.104 + bool "Pentium-Pro" 10.105 + help 10.106 + Select this for Intel Pentium Pro chips. This enables the use of 10.107 + Pentium Pro extended instructions, and disables the init-time guard 10.108 + against the f00f bug found in earlier Pentiums. 10.109 + 10.110 +config MPENTIUMII 10.111 + bool "Pentium-II/Celeron(pre-Coppermine)" 10.112 + help 10.113 + Select this for Intel chips based on the Pentium-II and 10.114 + pre-Coppermine Celeron core. This option enables an unaligned 10.115 + copy optimization, compiles the kernel with optimization flags 10.116 + tailored for the chip, and applies any applicable Pentium Pro 10.117 + optimizations. 10.118 + 10.119 +config MPENTIUMIII 10.120 + bool "Pentium-III/Celeron(Coppermine)/Pentium-III Xeon" 10.121 + help 10.122 + Select this for Intel chips based on the Pentium-III and 10.123 + Celeron-Coppermine core. This option enables use of some 10.124 + extended prefetch instructions in addition to the Pentium II 10.125 + extensions. 10.126 + 10.127 +config MPENTIUMM 10.128 + bool "Pentium M" 10.129 + help 10.130 + Select this for Intel Pentium M (not Pentium-4 M) 10.131 + notebook chips. 10.132 + 10.133 +config MPENTIUM4 10.134 + bool "Pentium-4/Celeron(P4-based)/Pentium-4 M/Xeon" 10.135 + help 10.136 + Select this for Intel Pentium 4 chips. This includes the 10.137 + Pentium 4, P4-based Celeron and Xeon, and Pentium-4 M 10.138 + (not Pentium M) chips. This option enables compile flags 10.139 + optimized for the chip, uses the correct cache shift, and 10.140 + applies any applicable Pentium III optimizations. 10.141 + 10.142 +config MK6 10.143 + bool "K6/K6-II/K6-III" 10.144 + help 10.145 + Select this for an AMD K6-family processor. Enables use of 10.146 + some extended instructions, and passes appropriate optimization 10.147 + flags to GCC. 10.148 + 10.149 +config MK7 10.150 + bool "Athlon/Duron/K7" 10.151 + help 10.152 + Select this for an AMD Athlon K7-family processor. Enables use of 10.153 + some extended instructions, and passes appropriate optimization 10.154 + flags to GCC. 10.155 + 10.156 +config MK8 10.157 + bool "Opteron/Athlon64/Hammer/K8" 10.158 + help 10.159 + Select this for an AMD Opteron or Athlon64 Hammer-family processor. Enables 10.160 + use of some extended instructions, and passes appropriate optimization 10.161 + flags to GCC. 10.162 + 10.163 +config MCRUSOE 10.164 + bool "Crusoe" 10.165 + help 10.166 + Select this for a Transmeta Crusoe processor. Treats the processor 10.167 + like a 586 with TSC, and sets some GCC optimization flags (like a 10.168 + Pentium Pro with no alignment requirements). 10.169 + 10.170 +#config MEFFICEON 10.171 +# bool "Efficeon" 10.172 +# help 10.173 +# Select this for a Transmeta Efficeon processor. 10.174 + 10.175 +#config MWINCHIPC6 10.176 +# bool "Winchip-C6" 10.177 +# help 10.178 +# Select this for an IDT Winchip C6 chip. Linux and GCC 10.179 +# treat this chip as a 586TSC with some extended instructions 10.180 +# and alignment requirements. 10.181 + 10.182 +#config MWINCHIP2 10.183 +# bool "Winchip-2" 10.184 +# help 10.185 +# Select this for an IDT Winchip-2. Linux and GCC 10.186 +# treat this chip as a 586TSC with some extended instructions 10.187 +# and alignment requirements. 10.188 + 10.189 +#config MWINCHIP3D 10.190 +# bool "Winchip-2A/Winchip-3" 10.191 +# help 10.192 +# Select this for an IDT Winchip-2A or 3. Linux and GCC 10.193 +# treat this chip as a 586TSC with some extended instructions 10.194 +# and alignment reqirements. Also enable out of order memory 10.195 +# stores for this CPU, which can increase performance of some 10.196 +# operations. 10.197 + 10.198 +config MCYRIXIII 10.199 + bool "CyrixIII/VIA-C3" 10.200 + help 10.201 + Select this for a Cyrix III or C3 chip. Presently Linux and GCC 10.202 + treat this chip as a generic 586. Whilst the CPU is 686 class, 10.203 + it lacks the cmov extension which gcc assumes is present when 10.204 + generating 686 code. 10.205 + Note that Nehemiah (Model 9) and above will not boot with this 10.206 + kernel due to them lacking the 3DNow! instructions used in earlier 10.207 + incarnations of the CPU. 10.208 + 10.209 +config MVIAC3_2 10.210 + bool "VIA C3-2 (Nehemiah)" 10.211 + help 10.212 + Select this for a VIA C3 "Nehemiah". Selecting this enables usage 10.213 + of SSE and tells gcc to treat the CPU as a 686. 10.214 + Note, this kernel will not boot on older (pre model 9) C3s. 10.215 + 10.216 +endchoice 10.217 + 10.218 +config X86_GENERIC 10.219 + bool "Generic x86 support" 10.220 + help 10.221 + Instead of just including optimizations for the selected 10.222 + x86 variant (e.g. PII, Crusoe or Athlon), include some more 10.223 + generic optimizations as well. This will make the kernel 10.224 + perform better on x86 CPUs other than that selected. 10.225 + 10.226 + This is really intended for distributors who need more 10.227 + generic optimizations. 10.228 + 10.229 +# 10.230 +# Define implied options from the CPU selection here 10.231 +# 10.232 +config X86_CMPXCHG 10.233 + bool 10.234 + depends on !M386 10.235 + default y 10.236 + 10.237 +config X86_XADD 10.238 + bool 10.239 + depends on !M386 10.240 + default y 10.241 + 10.242 +config X86_L1_CACHE_SHIFT 10.243 + int 10.244 + default "7" if MPENTIUM4 || X86_GENERIC 10.245 + default "4" if X86_ELAN || M486 || M386 10.246 + default "5" if MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCRUSOE || MEFFICEON || MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || MVIAC3_2 10.247 + default "6" if MK7 || MK8 || MPENTIUMM 10.248 + 10.249 +config RWSEM_GENERIC_SPINLOCK 10.250 + bool 10.251 + depends on M386 10.252 + default y 10.253 + 10.254 +config RWSEM_XCHGADD_ALGORITHM 10.255 + bool 10.256 + depends on !M386 10.257 + default y 10.258 + 10.259 +config X86_PPRO_FENCE 10.260 + bool 10.261 + depends on M686 || M586MMX || M586TSC || M586 || M486 || M386 10.262 + default y 10.263 + 10.264 +config X86_F00F_BUG 10.265 + bool 10.266 + depends on M586MMX || M586TSC || M586 || M486 || M386 10.267 + default y 10.268 + 10.269 +config X86_WP_WORKS_OK 10.270 + bool 10.271 + depends on !M386 10.272 + default y 10.273 + 10.274 +config X86_INVLPG 10.275 + bool 10.276 + depends on !M386 10.277 + default y 10.278 + 10.279 +config X86_BSWAP 10.280 + bool 10.281 + depends on !M386 10.282 + default y 10.283 + 10.284 +config X86_POPAD_OK 10.285 + bool 10.286 + depends on !M386 10.287 + default y 10.288 + 10.289 +config X86_ALIGNMENT_16 10.290 + bool 10.291 + depends on MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCYRIXIII || X86_ELAN || MK6 || M586MMX || M586TSC || M586 || M486 || MVIAC3_2 10.292 + default y 10.293 + 10.294 +config X86_GOOD_APIC 10.295 + bool 10.296 + depends on MK7 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || MK8 || MEFFICEON 10.297 + default y 10.298 + 10.299 +config X86_INTEL_USERCOPY 10.300 + bool 10.301 + depends on MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M586MMX || X86_GENERIC || MK8 || MK7 || MEFFICEON 10.302 + default y 10.303 + 10.304 +config X86_USE_PPRO_CHECKSUM 10.305 + bool 10.306 + depends on MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MK8 || MVIAC3_2 || MEFFICEON 10.307 + default y 10.308 + 10.309 +config X86_USE_3DNOW 10.310 + bool 10.311 + depends on MCYRIXIII || MK7 10.312 + default y 10.313 + 10.314 +config X86_OOSTORE 10.315 + bool 10.316 + depends on (MWINCHIP3D || MWINCHIP2 || MWINCHIPC6) && MTRR 10.317 + default y 10.318 + 10.319 +config HPET_TIMER 10.320 + bool 10.321 + default n 10.322 +#config HPET_TIMER 10.323 +# bool "HPET Timer Support" 10.324 +# help 10.325 +# This enables the use of the HPET for the kernel's internal timer. 10.326 +# HPET is the next generation timer replacing legacy 8254s. 10.327 +# You can safely choose Y here. However, HPET will only be 10.328 +# activated if the platform and the BIOS support this feature. 10.329 +# Otherwise the 8254 will be used for timing services. 10.330 +# 10.331 +# Choose N to continue using the legacy 8254 timer. 10.332 + 10.333 +config HPET_EMULATE_RTC 10.334 + def_bool HPET_TIMER && RTC=y 10.335 + 10.336 +config SMP 10.337 + bool 10.338 + default n 10.339 +#config SMP 10.340 +# bool "Symmetric multi-processing support" 10.341 +# ---help--- 10.342 +# This enables support for systems with more than one CPU. If you have 10.343 +# a system with only one CPU, like most personal computers, say N. If 10.344 +# you have a system with more than one CPU, say Y. 10.345 +# 10.346 +# If you say N here, the kernel will run on single and multiprocessor 10.347 +# machines, but will use only one CPU of a multiprocessor machine. If 10.348 +# you say Y here, the kernel will run on many, but not all, 10.349 +# singleprocessor machines. On a singleprocessor machine, the kernel 10.350 +# will run faster if you say N here. 10.351 +# 10.352 +# Note that if you say Y here and choose architecture "586" or 10.353 +# "Pentium" under "Processor family", the kernel will not work on 486 10.354 +# architectures. Similarly, multiprocessor kernels for the "PPro" 10.355 +# architecture may not work on all Pentium based boards. 10.356 +# 10.357 +# People using multiprocessor machines who say Y here should also say 10.358 +# Y to "Enhanced Real Time Clock Support", below. The "Advanced Power 10.359 +# Management" code will be disabled if you say Y here. 10.360 +# 10.361 +# See also the <file:Documentation/smp.txt>, 10.362 +# <file:Documentation/i386/IO-APIC.txt>, 10.363 +# <file:Documentation/nmi_watchdog.txt> and the SMP-HOWTO available at 10.364 +# <http://www.tldp.org/docs.html#howto>. 10.365 +# 10.366 +# If you don't know what to do here, say N. 10.367 + 10.368 +config NR_CPUS 10.369 + int "Maximum number of CPUs (2-255)" 10.370 + range 2 255 10.371 + depends on SMP 10.372 + default "32" if X86_NUMAQ || X86_SUMMIT || X86_BIGSMP || X86_ES7000 10.373 + default "8" 10.374 + help 10.375 + This allows you to specify the maximum number of CPUs which this 10.376 + kernel will support. The maximum supported value is 255 and the 10.377 + minimum value which makes sense is 2. 10.378 + 10.379 + This is purely to save memory - each supported CPU adds 10.380 + approximately eight kilobytes to the kernel image. 10.381 + 10.382 +config SCHED_SMT 10.383 + bool "SMT (Hyperthreading) scheduler support" 10.384 + depends on SMP 10.385 + default off 10.386 + help 10.387 + SMT scheduler support improves the CPU scheduler's decision making 10.388 + when dealing with Intel Pentium 4 chips with HyperThreading at a 10.389 + cost of slightly increased overhead in some places. If unsure say 10.390 + N here. 10.391 + 10.392 +config PREEMPT 10.393 + bool "Preemptible Kernel" 10.394 + help 10.395 + This option reduces the latency of the kernel when reacting to 10.396 + real-time or interactive events by allowing a low priority process to 10.397 + be preempted even if it is in kernel mode executing a system call. 10.398 + This allows applications to run more reliably even when the system is 10.399 + under load. 10.400 + 10.401 + Say Y here if you are building a kernel for a desktop, embedded 10.402 + or real-time system. Say N if you are unsure. 10.403 + 10.404 +#config X86_TSC 10.405 +# bool 10.406 +# depends on (MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2) && !X86_NUMAQ 10.407 +# default y 10.408 + 10.409 +#config X86_MCE 10.410 +# bool "Machine Check Exception" 10.411 +# depends on !X86_VOYAGER 10.412 +# ---help--- 10.413 +# Machine Check Exception support allows the processor to notify the 10.414 +# kernel if it detects a problem (e.g. overheating, component failure). 10.415 +# The action the kernel takes depends on the severity of the problem, 10.416 +# ranging from a warning message on the console, to halting the machine. 10.417 +# Your processor must be a Pentium or newer to support this - check the 10.418 +# flags in /proc/cpuinfo for mce. Note that some older Pentium systems 10.419 +# have a design flaw which leads to false MCE events - hence MCE is 10.420 +# disabled on all P5 processors, unless explicitly enabled with "mce" 10.421 +# as a boot argument. Similarly, if MCE is built in and creates a 10.422 +# problem on some new non-standard machine, you can boot with "nomce" 10.423 +# to disable it. MCE support simply ignores non-MCE processors like 10.424 +# the 386 and 486, so nearly everyone can say Y here. 10.425 + 10.426 +#config X86_MCE_NONFATAL 10.427 +# tristate "Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4" 10.428 +# depends on X86_MCE 10.429 +# help 10.430 +# Enabling this feature starts a timer that triggers every 5 seconds which 10.431 +# will look at the machine check registers to see if anything happened. 10.432 +# Non-fatal problems automatically get corrected (but still logged). 10.433 +# Disable this if you don't want to see these messages. 10.434 +# Seeing the messages this option prints out may be indicative of dying hardware, 10.435 +# or out-of-spec (ie, overclocked) hardware. 10.436 +# This option only does something on certain CPUs. 10.437 +# (AMD Athlon/Duron and Intel Pentium 4) 10.438 + 10.439 +#config X86_MCE_P4THERMAL 10.440 +# bool "check for P4 thermal throttling interrupt." 10.441 +# depends on X86_MCE && (X86_UP_APIC || SMP) 10.442 +# help 10.443 +# Enabling this feature will cause a message to be printed when the P4 10.444 +# enters thermal throttling. 10.445 + 10.446 +#config MICROCODE 10.447 +# tristate "/dev/cpu/microcode - Intel IA32 CPU microcode support" 10.448 +# ---help--- 10.449 +# If you say Y here and also to "/dev file system support" in the 10.450 +# 'File systems' section, you will be able to update the microcode on 10.451 +# Intel processors in the IA32 family, e.g. Pentium Pro, Pentium II, 10.452 +# Pentium III, Pentium 4, Xeon etc. You will obviously need the 10.453 +# actual microcode binary data itself which is not shipped with the 10.454 +# Linux kernel. 10.455 +# 10.456 +# For latest news and information on obtaining all the required 10.457 +# ingredients for this driver, check: 10.458 +# <http://www.urbanmyth.org/microcode/>. 10.459 +# 10.460 +# To compile this driver as a module, choose M here: the 10.461 +# module will be called microcode. 10.462 + 10.463 +#config X86_MSR 10.464 +# tristate "/dev/cpu/*/msr - Model-specific register support" 10.465 +# help 10.466 +# This device gives privileged processes access to the x86 10.467 +# Model-Specific Registers (MSRs). It is a character device with 10.468 +# major 202 and minors 0 to 31 for /dev/cpu/0/msr to /dev/cpu/31/msr. 10.469 +# MSR accesses are directed to a specific CPU on multi-processor 10.470 +# systems. 10.471 + 10.472 +config X86_CPUID 10.473 + tristate "/dev/cpu/*/cpuid - CPU information support" 10.474 + help 10.475 + This device gives processes access to the x86 CPUID instruction to 10.476 + be executed on a specific processor. It is a character device 10.477 + with major 203 and minors 0 to 31 for /dev/cpu/0/cpuid to 10.478 + /dev/cpu/31/cpuid. 10.479 + 10.480 +source "drivers/firmware/Kconfig" 10.481 + 10.482 +choice 10.483 + prompt "High Memory Support" 10.484 + default NOHIGHMEM 10.485 + 10.486 +config NOHIGHMEM 10.487 + bool "off" 10.488 + ---help--- 10.489 + Linux can use up to 64 Gigabytes of physical memory on x86 systems. 10.490 + However, the address space of 32-bit x86 processors is only 4 10.491 + Gigabytes large. That means that, if you have a large amount of 10.492 + physical memory, not all of it can be "permanently mapped" by the 10.493 + kernel. The physical memory that's not permanently mapped is called 10.494 + "high memory". 10.495 + 10.496 + If you are compiling a kernel which will never run on a machine with 10.497 + more than 1 Gigabyte total physical RAM, answer "off" here (default 10.498 + choice and suitable for most users). This will result in a "3GB/1GB" 10.499 + split: 3GB are mapped so that each process sees a 3GB virtual memory 10.500 + space and the remaining part of the 4GB virtual memory space is used 10.501 + by the kernel to permanently map as much physical memory as 10.502 + possible. 10.503 + 10.504 + If the machine has between 1 and 4 Gigabytes physical RAM, then 10.505 + answer "4GB" here. 10.506 + 10.507 + If more than 4 Gigabytes is used then answer "64GB" here. This 10.508 + selection turns Intel PAE (Physical Address Extension) mode on. 10.509 + PAE implements 3-level paging on IA32 processors. PAE is fully 10.510 + supported by Linux, PAE mode is implemented on all recent Intel 10.511 + processors (Pentium Pro and better). NOTE: If you say "64GB" here, 10.512 + then the kernel will not boot on CPUs that don't support PAE! 10.513 + 10.514 + The actual amount of total physical memory will either be 10.515 + auto detected or can be forced by using a kernel command line option 10.516 + such as "mem=256M". (Try "man bootparam" or see the documentation of 10.517 + your boot loader (lilo or loadlin) about how to pass options to the 10.518 + kernel at boot time.) 10.519 + 10.520 + If unsure, say "off". 10.521 + 10.522 +config HIGHMEM4G 10.523 + bool "4GB" 10.524 + help 10.525 + Select this if you have a 32-bit processor and between 1 and 4 10.526 + gigabytes of physical RAM. 10.527 + 10.528 +#config HIGHMEM64G 10.529 +# bool "64GB" 10.530 +# help 10.531 +# Select this if you have a 32-bit processor and more than 4 10.532 +# gigabytes of physical RAM. 10.533 + 10.534 +endchoice 10.535 + 10.536 +config HIGHMEM 10.537 + bool 10.538 + depends on HIGHMEM64G || HIGHMEM4G 10.539 + default y 10.540 + 10.541 +config X86_PAE 10.542 + bool 10.543 + depends on HIGHMEM64G 10.544 + default y 10.545 + 10.546 +# Common NUMA Features 10.547 +config NUMA 10.548 + bool "Numa Memory Allocation and Scheduler Support" 10.549 + depends on SMP && HIGHMEM64G && (X86_NUMAQ || X86_GENERICARCH || (X86_SUMMIT && ACPI)) 10.550 + default n if X86_PC 10.551 + default y if (X86_NUMAQ || X86_SUMMIT) 10.552 + 10.553 +# Need comments to help the hapless user trying to turn on NUMA support 10.554 +comment "NUMA (NUMA-Q) requires SMP, 64GB highmem support" 10.555 + depends on X86_NUMAQ && (!HIGHMEM64G || !SMP) 10.556 + 10.557 +comment "NUMA (Summit) requires SMP, 64GB highmem support, ACPI" 10.558 + depends on X86_SUMMIT && (!HIGHMEM64G || !ACPI) 10.559 + 10.560 +config DISCONTIGMEM 10.561 + bool 10.562 + depends on NUMA 10.563 + default y 10.564 + 10.565 +config HAVE_ARCH_BOOTMEM_NODE 10.566 + bool 10.567 + depends on NUMA 10.568 + default y 10.569 + 10.570 +#config HIGHPTE 10.571 +# bool "Allocate 3rd-level pagetables from highmem" 10.572 +# depends on HIGHMEM4G || HIGHMEM64G 10.573 +# help 10.574 +# The VM uses one page table entry for each page of physical memory. 10.575 +# For systems with a lot of RAM, this can be wasteful of precious 10.576 +# low memory. Setting this option will put user-space page table 10.577 +# entries in high memory. 10.578 + 10.579 +#config MTRR 10.580 +# bool "MTRR (Memory Type Range Register) support" 10.581 +# ---help--- 10.582 +# On Intel P6 family processors (Pentium Pro, Pentium II and later) 10.583 +# the Memory Type Range Registers (MTRRs) may be used to control 10.584 +# processor access to memory ranges. This is most useful if you have 10.585 +# a video (VGA) card on a PCI or AGP bus. Enabling write-combining 10.586 +# allows bus write transfers to be combined into a larger transfer 10.587 +# before bursting over the PCI/AGP bus. This can increase performance 10.588 +# of image write operations 2.5 times or more. Saying Y here creates a 10.589 +# /proc/mtrr file which may be used to manipulate your processor's 10.590 +# MTRRs. Typically the X server should use this. 10.591 +# 10.592 +# This code has a reasonably generic interface so that similar 10.593 +# control registers on other processors can be easily supported 10.594 +# as well: 10.595 +# 10.596 +# The Cyrix 6x86, 6x86MX and M II processors have Address Range 10.597 +# Registers (ARRs) which provide a similar functionality to MTRRs. For 10.598 +# these, the ARRs are used to emulate the MTRRs. 10.599 +# The AMD K6-2 (stepping 8 and above) and K6-3 processors have two 10.600 +# MTRRs. The Centaur C6 (WinChip) has 8 MCRs, allowing 10.601 +# write-combining. All of these processors are supported by this code 10.602 +# and it makes sense to say Y here if you have one of them. 10.603 +# 10.604 +# Saying Y here also fixes a problem with buggy SMP BIOSes which only 10.605 +# set the MTRRs for the boot CPU and not for the secondary CPUs. This 10.606 +# can lead to all sorts of problems, so it's good to say Y here. 10.607 +# 10.608 +# You can safely say Y even if your machine doesn't have MTRRs, you'll 10.609 +# just add about 9 KB to your kernel. 10.610 +# 10.611 +# See <file:Documentation/mtrr.txt> for more information. 10.612 + 10.613 +config IRQBALANCE 10.614 + bool "Enable kernel irq balancing" 10.615 + depends on SMP && X86_IO_APIC 10.616 + default y 10.617 + help 10.618 + The default yes will allow the kernel to do irq load balancing. 10.619 + Saying no will keep the kernel from doing irq load balancing. 10.620 + 10.621 +config HAVE_DEC_LOCK 10.622 + bool 10.623 + depends on (SMP || PREEMPT) && X86_CMPXCHG 10.624 + default y 10.625 + 10.626 +# turning this on wastes a bunch of space. 10.627 +# Summit needs it only when NUMA is on 10.628 +config BOOT_IOREMAP 10.629 + bool 10.630 + depends on (((X86_SUMMIT || X86_GENERICARCH) && NUMA) || (X86 && EFI)) 10.631 + default y 10.632 + 10.633 +config REGPARM 10.634 + bool "Use register arguments (EXPERIMENTAL)" 10.635 + depends on EXPERIMENTAL 10.636 + default n 10.637 + help 10.638 + Compile the kernel with -mregparm=3. This uses an different ABI 10.639 + and passes the first three arguments of a function call in registers. 10.640 + This will probably break binary only modules. 10.641 + 10.642 + This feature is only enabled for gcc-3.0 and later - earlier compilers 10.643 + generate incorrect output with certain kernel constructs when 10.644 + -mregparm=3 is used. 10.645 + 10.646 + 10.647 +if XEN_PHYSDEV_ACCESS 10.648 + 10.649 +menu "Bus options (PCI, PCMCIA, EISA, MCA, ISA)" 10.650 + 10.651 +config X86_VISWS_APIC 10.652 + bool 10.653 + depends on X86_VISWS 10.654 + default y 10.655 + 10.656 +config X86_LOCAL_APIC 10.657 + bool 10.658 + depends on (X86_VISWS || SMP) && !X86_VOYAGER 10.659 + default y 10.660 + 10.661 +config X86_IO_APIC 10.662 + bool 10.663 + depends on SMP && !(X86_VISWS || X86_VOYAGER) 10.664 + default y 10.665 + 10.666 +config PCI 10.667 + bool "PCI support" if !X86_VISWS 10.668 + depends on !X86_VOYAGER 10.669 + default y if X86_VISWS 10.670 + help 10.671 + Find out whether you have a PCI motherboard. PCI is the name of a 10.672 + bus system, i.e. the way the CPU talks to the other stuff inside 10.673 + your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or 10.674 + VESA. If you have PCI, say Y, otherwise N. 10.675 + 10.676 + The PCI-HOWTO, available from 10.677 + <http://www.tldp.org/docs.html#howto>, contains valuable 10.678 + information about which PCI hardware does work under Linux and which 10.679 + doesn't. 10.680 + 10.681 +#choice 10.682 +# prompt "PCI access mode" 10.683 +# depends on PCI && !X86_VISWS 10.684 +# default PCI_GOANY 10.685 +# ---help--- 10.686 +# On PCI systems, the BIOS can be used to detect the PCI devices and 10.687 +# determine their configuration. However, some old PCI motherboards 10.688 +# have BIOS bugs and may crash if this is done. Also, some embedded 10.689 +# PCI-based systems don't have any BIOS at all. Linux can also try to 10.690 +# detect the PCI hardware directly without using the BIOS. 10.691 +# 10.692 +# With this option, you can specify how Linux should detect the 10.693 +# PCI devices. If you choose "BIOS", the BIOS will be used, 10.694 +# if you choose "Direct", the BIOS won't be used, and if you 10.695 +# choose "MMConfig", then PCI Express MMCONFIG will be used. 10.696 +# If you choose "Any", the kernel will try MMCONFIG, then the 10.697 +# direct access method and falls back to the BIOS if that doesn't 10.698 +# work. If unsure, go with the default, which is "Any". 10.699 +# 10.700 +#config PCI_GOBIOS 10.701 +# bool "BIOS" 10.702 +# 10.703 +#config PCI_GOMMCONFIG 10.704 +# bool "MMConfig" 10.705 +# 10.706 +#config PCI_GODIRECT 10.707 +# bool "Direct" 10.708 +# 10.709 +#config PCI_GOANY 10.710 +# bool "Any" 10.711 +# 10.712 +#endchoice 10.713 +# 10.714 +#config PCI_BIOS 10.715 +# bool 10.716 +# depends on !X86_VISWS && PCI && (PCI_GOBIOS || PCI_GOANY) 10.717 +# default y 10.718 +# 10.719 +#config PCI_DIRECT 10.720 +# bool 10.721 +# depends on PCI && ((PCI_GODIRECT || PCI_GOANY) || X86_VISWS) 10.722 +# default y 10.723 + 10.724 +config PCI_DIRECT 10.725 + bool 10.726 + depends on PCI 10.727 + default y 10.728 + 10.729 +source "drivers/pci/Kconfig" 10.730 + 10.731 +config ISA 10.732 + bool "ISA support" 10.733 + depends on !(X86_VOYAGER || X86_VISWS) 10.734 + help 10.735 + Find out whether you have ISA slots on your motherboard. ISA is the 10.736 + name of a bus system, i.e. the way the CPU talks to the other stuff 10.737 + inside your box. Other bus systems are PCI, EISA, MicroChannel 10.738 + (MCA) or VESA. ISA is an older system, now being displaced by PCI; 10.739 + newer boards don't support it. If you have ISA, say Y, otherwise N. 10.740 + 10.741 +config EISA 10.742 + bool "EISA support" 10.743 + depends on ISA 10.744 + ---help--- 10.745 + The Extended Industry Standard Architecture (EISA) bus was 10.746 + developed as an open alternative to the IBM MicroChannel bus. 10.747 + 10.748 + The EISA bus provided some of the features of the IBM MicroChannel 10.749 + bus while maintaining backward compatibility with cards made for 10.750 + the older ISA bus. The EISA bus saw limited use between 1988 and 10.751 + 1995 when it was made obsolete by the PCI bus. 10.752 + 10.753 + Say Y here if you are building a kernel for an EISA-based machine. 10.754 + 10.755 + Otherwise, say N. 10.756 + 10.757 +source "drivers/eisa/Kconfig" 10.758 + 10.759 +config MCA 10.760 + bool "MCA support" 10.761 + depends on !(X86_VISWS || X86_VOYAGER) 10.762 + help 10.763 + MicroChannel Architecture is found in some IBM PS/2 machines and 10.764 + laptops. It is a bus system similar to PCI or ISA. See 10.765 + <file:Documentation/mca.txt> (and especially the web page given 10.766 + there) before attempting to build an MCA bus kernel. 10.767 + 10.768 +config MCA 10.769 + depends on X86_VOYAGER 10.770 + default y if X86_VOYAGER 10.771 + 10.772 +source "drivers/mca/Kconfig" 10.773 + 10.774 +config SCx200 10.775 + tristate "NatSemi SCx200 support" 10.776 + depends on !X86_VOYAGER 10.777 + help 10.778 + This provides basic support for the National Semiconductor SCx200 10.779 + processor. Right now this is just a driver for the GPIO pins. 10.780 + 10.781 + If you don't know what to do here, say N. 10.782 + 10.783 + This support is also available as a module. If compiled as a 10.784 + module, it will be called scx200. 10.785 + 10.786 +source "drivers/pcmcia/Kconfig" 10.787 + 10.788 +source "drivers/pci/hotplug/Kconfig" 10.789 + 10.790 +endmenu 10.791 + 10.792 +endif 10.793 + 10.794 +menu "Kernel hacking" 10.795 + 10.796 +config DEBUG_KERNEL 10.797 + bool "Kernel debugging" 10.798 + help 10.799 + Say Y here if you are developing drivers or trying to debug and 10.800 + identify kernel problems. 10.801 + 10.802 +config EARLY_PRINTK 10.803 + bool "Early printk" if EMBEDDED 10.804 + default y 10.805 + help 10.806 + Write kernel log output directly into the VGA buffer or to a serial 10.807 + port. 10.808 + 10.809 + This is useful for kernel debugging when your machine crashes very 10.810 + early before the console code is initialized. For normal operation 10.811 + it is not recommended because it looks ugly and doesn't cooperate 10.812 + with klogd/syslogd or the X server. You should normally N here, 10.813 + unless you want to debug such a crash. 10.814 + 10.815 +config DEBUG_STACKOVERFLOW 10.816 + bool "Check for stack overflows" 10.817 + depends on DEBUG_KERNEL 10.818 + 10.819 +config DEBUG_STACK_USAGE 10.820 + bool "Stack utilization instrumentation" 10.821 + depends on DEBUG_KERNEL 10.822 + help 10.823 + Enables the display of the minimum amount of free stack which each 10.824 + task has ever had available in the sysrq-T and sysrq-P debug output. 10.825 + 10.826 + This option will slow down process creation somewhat. 10.827 + 10.828 +config DEBUG_SLAB 10.829 + bool "Debug memory allocations" 10.830 + depends on DEBUG_KERNEL 10.831 + help 10.832 + Say Y here to have the kernel do limited verification on memory 10.833 + allocation as well as poisoning memory on free to catch use of freed 10.834 + memory. 10.835 + 10.836 +config MAGIC_SYSRQ 10.837 + bool "Magic SysRq key" 10.838 + depends on DEBUG_KERNEL 10.839 + help 10.840 + If you say Y here, you will have some control over the system even 10.841 + if the system crashes for example during kernel debugging (e.g., you 10.842 + will be able to flush the buffer cache to disk, reboot the system 10.843 + immediately or dump some status information). This is accomplished 10.844 + by pressing various keys while holding SysRq (Alt+PrintScreen). It 10.845 + also works on a serial console (on PC hardware at least), if you 10.846 + send a BREAK and then within 5 seconds a command keypress. The 10.847 + keys are documented in <file:Documentation/sysrq.txt>. Don't say Y 10.848 + unless you really know what this hack does. 10.849 + 10.850 +config DEBUG_SPINLOCK 10.851 + bool "Spinlock debugging" 10.852 + depends on DEBUG_KERNEL 10.853 + help 10.854 + Say Y here and build SMP to catch missing spinlock initialization 10.855 + and certain other kinds of spinlock errors commonly made. This is 10.856 + best used in conjunction with the NMI watchdog so that spinlock 10.857 + deadlocks are also debuggable. 10.858 + 10.859 +config DEBUG_PAGEALLOC 10.860 + bool "Page alloc debugging" 10.861 + depends on DEBUG_KERNEL 10.862 + help 10.863 + Unmap pages from the kernel linear mapping after free_pages(). 10.864 + This results in a large slowdown, but helps to find certain types 10.865 + of memory corruptions. 10.866 + 10.867 +config DEBUG_HIGHMEM 10.868 + bool "Highmem debugging" 10.869 + depends on DEBUG_KERNEL && HIGHMEM 10.870 + help 10.871 + This options enables addition error checking for high memory systems. 10.872 + Disable for production systems. 10.873 + 10.874 +config DEBUG_INFO 10.875 + bool "Compile the kernel with debug info" 10.876 + depends on DEBUG_KERNEL 10.877 + help 10.878 + If you say Y here the resulting kernel image will include 10.879 + debugging info resulting in a larger kernel image. 10.880 + Say Y here only if you plan to use gdb to debug the kernel. 10.881 + If you don't debug the kernel, you can say N. 10.882 + 10.883 +config DEBUG_SPINLOCK_SLEEP 10.884 + bool "Sleep-inside-spinlock checking" 10.885 + help 10.886 + If you say Y here, various routines which may sleep will become very 10.887 + noisy if they are called with a spinlock held. 10.888 + 10.889 +config FRAME_POINTER 10.890 + bool "Compile the kernel with frame pointers" 10.891 + help 10.892 + If you say Y here the resulting kernel image will be slightly larger 10.893 + and slower, but it will give very useful debugging information. 10.894 + If you don't debug the kernel, you can say N, but we may not be able 10.895 + to solve problems without frame pointers. 10.896 + 10.897 +config 4KSTACKS 10.898 + bool "Use 4Kb for kernel stacks instead of 8Kb" 10.899 + help 10.900 + If you say Y here the kernel will use a 4Kb stacksize for the 10.901 + kernel stack attached to each process/thread. This facilitates 10.902 + running more threads on a system and also reduces the pressure 10.903 + on the VM subsystem for higher order allocations. This option 10.904 + will also use IRQ stacks to compensate for the reduced stackspace. 10.905 + 10.906 +config X86_FIND_SMP_CONFIG 10.907 + bool 10.908 + depends on X86_LOCAL_APIC || X86_VOYAGER 10.909 + default y 10.910 + 10.911 +config X86_MPPARSE 10.912 + bool 10.913 + depends on X86_LOCAL_APIC && !X86_VISWS 10.914 + default y 10.915 + 10.916 +endmenu 10.917 + 10.918 +# 10.919 +# Use the generic interrupt handling code in kernel/irq/: 10.920 +# 10.921 +config GENERIC_HARDIRQS 10.922 + bool 10.923 + default y 10.924 + 10.925 +config GENERIC_IRQ_PROBE 10.926 + bool 10.927 + default y 10.928 + 10.929 +config X86_SMP 10.930 + bool 10.931 + depends on SMP && !X86_VOYAGER 10.932 + default y 10.933 + 10.934 +config X86_HT 10.935 + bool 10.936 + depends on SMP && !(X86_VISWS || X86_VOYAGER) 10.937 + default y 10.938 + 10.939 +config X86_BIOS_REBOOT 10.940 + bool 10.941 + depends on !(X86_VISWS || X86_VOYAGER) 10.942 + default y 10.943 + 10.944 +config X86_TRAMPOLINE 10.945 + bool 10.946 + depends on X86_SMP || (X86_VOYAGER && SMP) 10.947 + default y 10.948 + 10.949 +config PC 10.950 + bool 10.951 + depends on X86 && !EMBEDDED 10.952 + default y 10.953 + 10.954 +endmenu
11.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 11.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/i386/Makefile Fri Nov 19 23:17:26 2004 +0000 11.3 @@ -0,0 +1,99 @@ 11.4 +# 11.5 +# i386/Makefile 11.6 +# 11.7 +# This file is included by the global makefile so that you can add your own 11.8 +# architecture-specific flags and dependencies. Remember to do have actions 11.9 +# for "archclean" cleaning up for this architecture. 11.10 +# 11.11 +# This file is subject to the terms and conditions of the GNU General Public 11.12 +# License. See the file "COPYING" in the main directory of this archive 11.13 +# for more details. 11.14 +# 11.15 +# Copyright (C) 1994 by Linus Torvalds 11.16 +# 11.17 +# 19990713 Artur Skawina <skawina@geocities.com> 11.18 +# Added '-march' and '-mpreferred-stack-boundary' support 11.19 +# 11.20 + 11.21 +XENARCH := $(subst ",,$(CONFIG_XENARCH)) 11.22 + 11.23 +LDFLAGS := -m elf_i386 11.24 +LDFLAGS_vmlinux := 11.25 +CHECK := $(CHECK) -D__i386__=1 11.26 + 11.27 +CFLAGS += -pipe -msoft-float 11.28 + 11.29 +# prevent gcc from keeping the stack 16 byte aligned 11.30 +CFLAGS += $(call cc-option,-mpreferred-stack-boundary=2,) 11.31 + 11.32 +align := $(cc-option-align) 11.33 +cflags-$(CONFIG_M386) += -march=i386 11.34 +cflags-$(CONFIG_M486) += -march=i486 11.35 +cflags-$(CONFIG_M586) += -march=i586 11.36 +cflags-$(CONFIG_M586TSC) += -march=i586 11.37 +cflags-$(CONFIG_M586MMX) += $(call cc-option,-march=pentium-mmx,-march=i586) 11.38 +cflags-$(CONFIG_M686) += -march=i686 11.39 +cflags-$(CONFIG_MPENTIUMII) += $(call cc-option,-march=pentium2,-march=i686) 11.40 +cflags-$(CONFIG_MPENTIUMIII) += $(call cc-option,-march=pentium3,-march=i686) 11.41 +cflags-$(CONFIG_MPENTIUMM) += $(call cc-option,-march=pentium3,-march=i686) 11.42 +cflags-$(CONFIG_MPENTIUM4) += $(call cc-option,-march=pentium4,-march=i686) 11.43 +cflags-$(CONFIG_MK6) += -march=k6 11.44 +# Please note, that patches that add -march=athlon-xp and friends are pointless. 11.45 +# They make zero difference whatsosever to performance at this time. 11.46 +cflags-$(CONFIG_MK7) += $(call cc-option,-march=athlon,-march=i686 $(align)-functions=4) 11.47 +cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8,$(call cc-option,-march=athlon,-march=i686 $(align)-functions=4)) 11.48 +cflags-$(CONFIG_MCRUSOE) += -march=i686 $(align)-functions=0 $(align)-jumps=0 $(align)-loops=0 11.49 +cflags-$(CONFIG_MEFFICEON) += $(call cc-option,-march=pentium3,-march=i686) $(align)-functions=0 $(align)-jumps=0 $(align)-loops=0 11.50 +cflags-$(CONFIG_MWINCHIPC6) += $(call cc-option,-march=winchip-c6,-march=i586) 11.51 +cflags-$(CONFIG_MWINCHIP2) += $(call cc-option,-march=winchip2,-march=i586) 11.52 +cflags-$(CONFIG_MWINCHIP3D) += $(call cc-option,-march=winchip2,-march=i586) 11.53 +cflags-$(CONFIG_MCYRIXIII) += $(call cc-option,-march=c3,-march=i486) $(align)-functions=0 $(align)-jumps=0 $(align)-loops=0 11.54 +cflags-$(CONFIG_MVIAC3_2) += $(call cc-option,-march=c3-2,-march=i686) 11.55 + 11.56 +# AMD Elan support 11.57 +cflags-$(CONFIG_X86_ELAN) += -march=i486 11.58 + 11.59 +# -mregparm=3 works ok on gcc-3.0 and later 11.60 +# 11.61 +GCC_VERSION := $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh $(CC)) 11.62 +cflags-$(CONFIG_REGPARM) += $(shell if [ $(GCC_VERSION) -ge 0300 ] ; then echo "-mregparm=3"; fi ;) 11.63 + 11.64 +# Disable unit-at-a-time mode, it makes gcc use a lot more stack 11.65 +# due to the lack of sharing of stacklots. 11.66 +CFLAGS += $(call cc-option,-fno-unit-at-a-time,) 11.67 + 11.68 +CFLAGS += $(cflags-y) 11.69 + 11.70 +head-y := arch/xen/i386/kernel/head.o arch/xen/i386/kernel/init_task.o 11.71 + 11.72 +libs-y += arch/i386/lib/ 11.73 +core-y += arch/xen/i386/kernel/ \ 11.74 + arch/xen/i386/mm/ \ 11.75 + arch/i386/crypto/ 11.76 +# \ 11.77 +# arch/xen/$(mcore-y)/ 11.78 +drivers-$(CONFIG_MATH_EMULATION) += arch/i386/math-emu/ 11.79 +drivers-$(CONFIG_PCI) += arch/xen/i386/pci/ 11.80 +# must be linked after kernel/ 11.81 +drivers-$(CONFIG_OPROFILE) += arch/i386/oprofile/ 11.82 +drivers-$(CONFIG_PM) += arch/i386/power/ 11.83 + 11.84 +# for clean 11.85 +obj- += kernel/ mm/ pci/ 11.86 +#obj- += ../../i386/lib/ ../../i386/mm/ 11.87 +#../../i386/$(mcore-y)/ 11.88 +#obj- += ../../i386/pci/ ../../i386/oprofile/ ../../i386/power/ 11.89 + 11.90 +xenflags-y += -Iinclude/asm-xen/asm-i386/mach-xen \ 11.91 + -Iinclude/asm-i386/mach-default 11.92 +CFLAGS += $(xenflags-y) 11.93 +AFLAGS += $(xenflags-y) 11.94 + 11.95 +prepare: include/asm-$(XENARCH)/asm_offsets.h 11.96 +CLEAN_FILES += include/asm-$(XENARCH)/asm_offsets.h 11.97 + 11.98 +arch/$(XENARCH)/kernel/asm-offsets.s: include/asm include/.asm-ignore \ 11.99 + include/linux/version.h include/config/MARKER 11.100 + 11.101 +include/asm-$(XENARCH)/asm_offsets.h: arch/$(XENARCH)/kernel/asm-offsets.s 11.102 + $(call filechk,gen-asm-offsets)
12.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 12.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/Makefile Fri Nov 19 23:17:26 2004 +0000 12.3 @@ -0,0 +1,90 @@ 12.4 +# 12.5 +# Makefile for the linux kernel. 12.6 +# 12.7 + 12.8 +XENARCH := $(subst ",,$(CONFIG_XENARCH)) 12.9 + 12.10 +CFLAGS += -Iarch/$(XENARCH)/kernel 12.11 + 12.12 +extra-y := head.o init_task.o 12.13 + 12.14 +obj-y := process.o signal.o entry.o traps.o \ 12.15 + time.o ioport.o ldt.o setup.o \ 12.16 + pci-dma.o i386_ksyms.o 12.17 + 12.18 +c-obj-y := semaphore.o irq.o vm86.o \ 12.19 + ptrace.o sys_i386.o \ 12.20 + i387.o dmi_scan.o bootflag.o \ 12.21 + doublefault.o quirks.o 12.22 +s-obj-y := 12.23 + 12.24 +obj-y += cpu/ 12.25 +obj-y += timers/ 12.26 +c-obj-$(CONFIG_ACPI_BOOT) += acpi/ 12.27 +#c-obj-$(CONFIG_X86_BIOS_REBOOT) += reboot.o 12.28 +c-obj-$(CONFIG_MCA) += mca.o 12.29 +c-obj-$(CONFIG_X86_MSR) += msr.o 12.30 +c-obj-$(CONFIG_X86_CPUID) += cpuid.o 12.31 +c-obj-$(CONFIG_MICROCODE) += microcode.o 12.32 +c-obj-$(CONFIG_APM) += apm.o 12.33 +c-obj-$(CONFIG_X86_SMP) += smp.o smpboot.o 12.34 +c-obj-$(CONFIG_X86_TRAMPOLINE) += trampoline.o 12.35 +c-obj-$(CONFIG_X86_MPPARSE) += mpparse.o 12.36 +c-obj-$(CONFIG_X86_LOCAL_APIC) += apic.o nmi.o 12.37 +c-obj-$(CONFIG_X86_IO_APIC) += io_apic.o 12.38 +c-obj-$(CONFIG_X86_NUMAQ) += numaq.o 12.39 +c-obj-$(CONFIG_X86_SUMMIT_NUMA) += summit.o 12.40 +c-obj-$(CONFIG_MODULES) += module.o 12.41 +c-obj-y += sysenter.o 12.42 +obj-y += vsyscall.o 12.43 +c-obj-$(CONFIG_ACPI_SRAT) += srat.o 12.44 +c-obj-$(CONFIG_HPET_TIMER) += time_hpet.o 12.45 +c-obj-$(CONFIG_EFI) += efi.o efi_stub.o 12.46 +c-obj-$(CONFIG_EARLY_PRINTK) += early_printk.o 12.47 + 12.48 +EXTRA_AFLAGS := -traditional 12.49 + 12.50 +c-obj-$(CONFIG_SCx200) += scx200.o 12.51 + 12.52 +# vsyscall.o contains the vsyscall DSO images as __initdata. 12.53 +# We must build both images before we can assemble it. 12.54 +# Note: kbuild does not track this dependency due to usage of .incbin 12.55 +$(obj)/vsyscall.o: $(obj)/vsyscall-int80.so $(obj)/vsyscall-sysenter.so 12.56 +targets += $(foreach F,int80 sysenter,vsyscall-$F.o vsyscall-$F.so) 12.57 + 12.58 +# The DSO images are built using a special linker script. 12.59 +quiet_cmd_syscall = SYSCALL $@ 12.60 + cmd_syscall = $(CC) -nostdlib $(SYSCFLAGS_$(@F)) \ 12.61 + -Wl,-T,$(filter-out FORCE,$^) -o $@ 12.62 + 12.63 +vsyscall-flags = -shared -s -Wl,-soname=linux-gate.so.1 12.64 +SYSCFLAGS_vsyscall-sysenter.so = $(vsyscall-flags) 12.65 +SYSCFLAGS_vsyscall-int80.so = $(vsyscall-flags) 12.66 + 12.67 +$(obj)/vsyscall-int80.so $(obj)/vsyscall-sysenter.so: \ 12.68 +$(obj)/vsyscall-%.so: $(obj)/vsyscall.lds $(obj)/vsyscall-%.o FORCE 12.69 + $(call if_changed,syscall) 12.70 + 12.71 +# We also create a special relocatable object that should mirror the symbol 12.72 +# table and layout of the linked DSO. With ld -R we can then refer to 12.73 +# these symbols in the kernel code rather than hand-coded addresses. 12.74 +extra-y += vsyscall-syms.o 12.75 +$(obj)/built-in.o: $(obj)/vsyscall-syms.o 12.76 +$(obj)/built-in.o: ld_flags += -R $(obj)/vsyscall-syms.o 12.77 + 12.78 +SYSCFLAGS_vsyscall-syms.o = -r 12.79 +$(obj)/vsyscall-syms.o: $(obj)/vsyscall.lds $(obj)/vsyscall-sysenter.o FORCE 12.80 + $(call if_changed,syscall) 12.81 + 12.82 +c-link := init_task.o 12.83 +s-link := vsyscall-int80.o vsyscall-sysenter.o vsyscall-sigreturn.o 12.84 + 12.85 +$(patsubst %.o,$(obj)/%.c,$(c-obj-y) $(c-link)) $(patsubst %.o,$(obj)/%.S,$(s-obj-y) $(s-link)): 12.86 + @ln -fsn $(srctree)/arch/i386/kernel/$(notdir $@) $@ 12.87 + 12.88 +$(obj)/vsyscall-int80.S: $(obj)/vsyscall-sigreturn.S 12.89 + 12.90 +obj-y += $(c-obj-y) $(s-obj-y) 12.91 + 12.92 +clean-files += $(patsubst %.o,%.c,$(c-obj-y) $(c-obj-) $(c-link)) 12.93 +clean-files += $(patsubst %.o,%.S,$(s-obj-y) $(s-obj-) $(s-link))
13.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 13.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/cpu/Makefile Fri Nov 19 23:17:26 2004 +0000 13.3 @@ -0,0 +1,31 @@ 13.4 +# 13.5 +# Makefile for x86-compatible CPU details and quirks 13.6 +# 13.7 + 13.8 +CFLAGS += -Iarch/i386/kernel/cpu 13.9 + 13.10 +obj-y := common.o 13.11 +c-obj-y += proc.o 13.12 + 13.13 +c-obj-y += amd.o 13.14 +c-obj-y += cyrix.o 13.15 +c-obj-y += centaur.o 13.16 +c-obj-y += transmeta.o 13.17 +c-obj-y += intel.o intel_cacheinfo.o 13.18 +c-obj-y += rise.o 13.19 +c-obj-y += nexgen.o 13.20 +c-obj-y += umc.o 13.21 + 13.22 +#obj-$(CONFIG_X86_MCE) += ../../../../i386/kernel/cpu/mcheck/ 13.23 + 13.24 +#obj-$(CONFIG_MTRR) += ../../../../i386/kernel/cpu/mtrr/ 13.25 +#obj-$(CONFIG_CPU_FREQ) += ../../../../i386/kernel/cpu/cpufreq/ 13.26 + 13.27 +c-link := 13.28 + 13.29 +$(patsubst %.o,$(obj)/%.c,$(c-obj-y) $(c-link)): 13.30 + @ln -fsn $(srctree)/arch/i386/kernel/cpu/$(notdir $@) $@ 13.31 + 13.32 +obj-y += $(c-obj-y) 13.33 + 13.34 +clean-files += $(patsubst %.o,%.c,$(c-obj-y) $(c-obj-) $(c-link))
14.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 14.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/cpu/common.c Fri Nov 19 23:17:26 2004 +0000 14.3 @@ -0,0 +1,606 @@ 14.4 +#include <linux/init.h> 14.5 +#include <linux/string.h> 14.6 +#include <linux/delay.h> 14.7 +#include <linux/smp.h> 14.8 +#include <linux/module.h> 14.9 +#include <linux/percpu.h> 14.10 +#include <asm/semaphore.h> 14.11 +#include <asm/processor.h> 14.12 +#include <asm/i387.h> 14.13 +#include <asm/msr.h> 14.14 +#include <asm/io.h> 14.15 +#include <asm/mmu_context.h> 14.16 +#include <asm-xen/hypervisor.h> 14.17 + 14.18 +#include "cpu.h" 14.19 + 14.20 +DEFINE_PER_CPU(struct desc_struct, cpu_gdt_table[GDT_ENTRIES]); 14.21 +EXPORT_PER_CPU_SYMBOL(cpu_gdt_table); 14.22 + 14.23 +static int cachesize_override __initdata = -1; 14.24 +static int disable_x86_fxsr __initdata = 0; 14.25 +static int disable_x86_serial_nr __initdata = 1; 14.26 + 14.27 +struct cpu_dev * cpu_devs[X86_VENDOR_NUM] = {}; 14.28 + 14.29 +extern void mcheck_init(struct cpuinfo_x86 *c); 14.30 + 14.31 +extern void machine_specific_modify_cpu_capabilities(struct cpuinfo_x86 *c); 14.32 + 14.33 +extern int disable_pse; 14.34 + 14.35 +static void default_init(struct cpuinfo_x86 * c) 14.36 +{ 14.37 + /* Not much we can do here... */ 14.38 + /* Check if at least it has cpuid */ 14.39 + if (c->cpuid_level == -1) { 14.40 + /* No cpuid. It must be an ancient CPU */ 14.41 + if (c->x86 == 4) 14.42 + strcpy(c->x86_model_id, "486"); 14.43 + else if (c->x86 == 3) 14.44 + strcpy(c->x86_model_id, "386"); 14.45 + } 14.46 +} 14.47 + 14.48 +static struct cpu_dev default_cpu = { 14.49 + .c_init = default_init, 14.50 +}; 14.51 +static struct cpu_dev * this_cpu = &default_cpu; 14.52 + 14.53 +static int __init cachesize_setup(char *str) 14.54 +{ 14.55 + get_option (&str, &cachesize_override); 14.56 + return 1; 14.57 +} 14.58 +__setup("cachesize=", cachesize_setup); 14.59 + 14.60 +int __init get_model_name(struct cpuinfo_x86 *c) 14.61 +{ 14.62 + unsigned int *v; 14.63 + char *p, *q; 14.64 + 14.65 + if (cpuid_eax(0x80000000) < 0x80000004) 14.66 + return 0; 14.67 + 14.68 + v = (unsigned int *) c->x86_model_id; 14.69 + cpuid(0x80000002, &v[0], &v[1], &v[2], &v[3]); 14.70 + cpuid(0x80000003, &v[4], &v[5], &v[6], &v[7]); 14.71 + cpuid(0x80000004, &v[8], &v[9], &v[10], &v[11]); 14.72 + c->x86_model_id[48] = 0; 14.73 + 14.74 + /* Intel chips right-justify this string for some dumb reason; 14.75 + undo that brain damage */ 14.76 + p = q = &c->x86_model_id[0]; 14.77 + while ( *p == ' ' ) 14.78 + p++; 14.79 + if ( p != q ) { 14.80 + while ( *p ) 14.81 + *q++ = *p++; 14.82 + while ( q <= &c->x86_model_id[48] ) 14.83 + *q++ = '\0'; /* Zero-pad the rest */ 14.84 + } 14.85 + 14.86 + return 1; 14.87 +} 14.88 + 14.89 + 14.90 +void __init display_cacheinfo(struct cpuinfo_x86 *c) 14.91 +{ 14.92 + unsigned int n, dummy, ecx, edx, l2size; 14.93 + 14.94 + n = cpuid_eax(0x80000000); 14.95 + 14.96 + if (n >= 0x80000005) { 14.97 + cpuid(0x80000005, &dummy, &dummy, &ecx, &edx); 14.98 + printk(KERN_INFO "CPU: L1 I Cache: %dK (%d bytes/line), D cache %dK (%d bytes/line)\n", 14.99 + edx>>24, edx&0xFF, ecx>>24, ecx&0xFF); 14.100 + c->x86_cache_size=(ecx>>24)+(edx>>24); 14.101 + } 14.102 + 14.103 + if (n < 0x80000006) /* Some chips just has a large L1. */ 14.104 + return; 14.105 + 14.106 + ecx = cpuid_ecx(0x80000006); 14.107 + l2size = ecx >> 16; 14.108 + 14.109 + /* do processor-specific cache resizing */ 14.110 + if (this_cpu->c_size_cache) 14.111 + l2size = this_cpu->c_size_cache(c,l2size); 14.112 + 14.113 + /* Allow user to override all this if necessary. */ 14.114 + if (cachesize_override != -1) 14.115 + l2size = cachesize_override; 14.116 + 14.117 + if ( l2size == 0 ) 14.118 + return; /* Again, no L2 cache is possible */ 14.119 + 14.120 + c->x86_cache_size = l2size; 14.121 + 14.122 + printk(KERN_INFO "CPU: L2 Cache: %dK (%d bytes/line)\n", 14.123 + l2size, ecx & 0xFF); 14.124 +} 14.125 + 14.126 +/* Naming convention should be: <Name> [(<Codename>)] */ 14.127 +/* This table only is used unless init_<vendor>() below doesn't set it; */ 14.128 +/* in particular, if CPUID levels 0x80000002..4 are supported, this isn't used */ 14.129 + 14.130 +/* Look up CPU names by table lookup. */ 14.131 +static char __init *table_lookup_model(struct cpuinfo_x86 *c) 14.132 +{ 14.133 + struct cpu_model_info *info; 14.134 + 14.135 + if ( c->x86_model >= 16 ) 14.136 + return NULL; /* Range check */ 14.137 + 14.138 + if (!this_cpu) 14.139 + return NULL; 14.140 + 14.141 + info = this_cpu->c_models; 14.142 + 14.143 + while (info && info->family) { 14.144 + if (info->family == c->x86) 14.145 + return info->model_names[c->x86_model]; 14.146 + info++; 14.147 + } 14.148 + return NULL; /* Not found */ 14.149 +} 14.150 + 14.151 + 14.152 +void __init get_cpu_vendor(struct cpuinfo_x86 *c, int early) 14.153 +{ 14.154 + char *v = c->x86_vendor_id; 14.155 + int i; 14.156 + 14.157 + for (i = 0; i < X86_VENDOR_NUM; i++) { 14.158 + if (cpu_devs[i]) { 14.159 + if (!strcmp(v,cpu_devs[i]->c_ident[0]) || 14.160 + (cpu_devs[i]->c_ident[1] && 14.161 + !strcmp(v,cpu_devs[i]->c_ident[1]))) { 14.162 + c->x86_vendor = i; 14.163 + if (!early) 14.164 + this_cpu = cpu_devs[i]; 14.165 + break; 14.166 + } 14.167 + } 14.168 + } 14.169 +} 14.170 + 14.171 + 14.172 +static int __init x86_fxsr_setup(char * s) 14.173 +{ 14.174 + disable_x86_fxsr = 1; 14.175 + return 1; 14.176 +} 14.177 +__setup("nofxsr", x86_fxsr_setup); 14.178 + 14.179 + 14.180 +/* Standard macro to see if a specific flag is changeable */ 14.181 +static inline int flag_is_changeable_p(u32 flag) 14.182 +{ 14.183 + u32 f1, f2; 14.184 + 14.185 + asm("pushfl\n\t" 14.186 + "pushfl\n\t" 14.187 + "popl %0\n\t" 14.188 + "movl %0,%1\n\t" 14.189 + "xorl %2,%0\n\t" 14.190 + "pushl %0\n\t" 14.191 + "popfl\n\t" 14.192 + "pushfl\n\t" 14.193 + "popl %0\n\t" 14.194 + "popfl\n\t" 14.195 + : "=&r" (f1), "=&r" (f2) 14.196 + : "ir" (flag)); 14.197 + 14.198 + return ((f1^f2) & flag) != 0; 14.199 +} 14.200 + 14.201 + 14.202 +/* Probe for the CPUID instruction */ 14.203 +int __init have_cpuid_p(void) 14.204 +{ 14.205 + return flag_is_changeable_p(X86_EFLAGS_ID); 14.206 +} 14.207 + 14.208 +/* Do minimum CPU detection early. 14.209 + Fields really needed: vendor, cpuid_level, family, model, mask, cache alignment. 14.210 + The others are not touched to avoid unwanted side effects. */ 14.211 +void __init early_cpu_detect(void) 14.212 +{ 14.213 + struct cpuinfo_x86 *c = &boot_cpu_data; 14.214 + 14.215 + c->x86_cache_alignment = 32; 14.216 + 14.217 + if (!have_cpuid_p()) 14.218 + return; 14.219 + 14.220 + /* Get vendor name */ 14.221 + cpuid(0x00000000, &c->cpuid_level, 14.222 + (int *)&c->x86_vendor_id[0], 14.223 + (int *)&c->x86_vendor_id[8], 14.224 + (int *)&c->x86_vendor_id[4]); 14.225 + 14.226 + get_cpu_vendor(c, 1); 14.227 + 14.228 + c->x86 = 4; 14.229 + if (c->cpuid_level >= 0x00000001) { 14.230 + u32 junk, tfms, cap0, misc; 14.231 + cpuid(0x00000001, &tfms, &misc, &junk, &cap0); 14.232 + c->x86 = (tfms >> 8) & 15; 14.233 + c->x86_model = (tfms >> 4) & 15; 14.234 + if (c->x86 == 0xf) { 14.235 + c->x86 += (tfms >> 20) & 0xff; 14.236 + c->x86_model += ((tfms >> 16) & 0xF) << 4; 14.237 + } 14.238 + c->x86_mask = tfms & 15; 14.239 + if (cap0 & (1<<19)) 14.240 + c->x86_cache_alignment = ((misc >> 8) & 0xff) * 8; 14.241 + } 14.242 + 14.243 + early_intel_workaround(c); 14.244 +} 14.245 + 14.246 +void __init generic_identify(struct cpuinfo_x86 * c) 14.247 +{ 14.248 + u32 tfms, xlvl; 14.249 + int junk; 14.250 + 14.251 + if (have_cpuid_p()) { 14.252 + /* Get vendor name */ 14.253 + cpuid(0x00000000, &c->cpuid_level, 14.254 + (int *)&c->x86_vendor_id[0], 14.255 + (int *)&c->x86_vendor_id[8], 14.256 + (int *)&c->x86_vendor_id[4]); 14.257 + 14.258 + get_cpu_vendor(c, 0); 14.259 + /* Initialize the standard set of capabilities */ 14.260 + /* Note that the vendor-specific code below might override */ 14.261 + 14.262 + /* Intel-defined flags: level 0x00000001 */ 14.263 + if ( c->cpuid_level >= 0x00000001 ) { 14.264 + u32 capability, excap; 14.265 + cpuid(0x00000001, &tfms, &junk, &excap, &capability); 14.266 + c->x86_capability[0] = capability; 14.267 + c->x86_capability[4] = excap; 14.268 + c->x86 = (tfms >> 8) & 15; 14.269 + c->x86_model = (tfms >> 4) & 15; 14.270 + if (c->x86 == 0xf) { 14.271 + c->x86 += (tfms >> 20) & 0xff; 14.272 + c->x86_model += ((tfms >> 16) & 0xF) << 4; 14.273 + } 14.274 + c->x86_mask = tfms & 15; 14.275 + } else { 14.276 + /* Have CPUID level 0 only - unheard of */ 14.277 + c->x86 = 4; 14.278 + } 14.279 + 14.280 + /* AMD-defined flags: level 0x80000001 */ 14.281 + xlvl = cpuid_eax(0x80000000); 14.282 + if ( (xlvl & 0xffff0000) == 0x80000000 ) { 14.283 + if ( xlvl >= 0x80000001 ) 14.284 + c->x86_capability[1] = cpuid_edx(0x80000001); 14.285 + if ( xlvl >= 0x80000004 ) 14.286 + get_model_name(c); /* Default name */ 14.287 + } 14.288 + } 14.289 +} 14.290 + 14.291 +static void __init squash_the_stupid_serial_number(struct cpuinfo_x86 *c) 14.292 +{ 14.293 + if (cpu_has(c, X86_FEATURE_PN) && disable_x86_serial_nr ) { 14.294 + /* Disable processor serial number */ 14.295 + unsigned long lo,hi; 14.296 + rdmsr(MSR_IA32_BBL_CR_CTL,lo,hi); 14.297 + lo |= 0x200000; 14.298 + wrmsr(MSR_IA32_BBL_CR_CTL,lo,hi); 14.299 + printk(KERN_NOTICE "CPU serial number disabled.\n"); 14.300 + clear_bit(X86_FEATURE_PN, c->x86_capability); 14.301 + 14.302 + /* Disabling the serial number may affect the cpuid level */ 14.303 + c->cpuid_level = cpuid_eax(0); 14.304 + } 14.305 +} 14.306 + 14.307 +static int __init x86_serial_nr_setup(char *s) 14.308 +{ 14.309 + disable_x86_serial_nr = 0; 14.310 + return 1; 14.311 +} 14.312 +__setup("serialnumber", x86_serial_nr_setup); 14.313 + 14.314 + 14.315 + 14.316 +/* 14.317 + * This does the hard work of actually picking apart the CPU stuff... 14.318 + */ 14.319 +void __init identify_cpu(struct cpuinfo_x86 *c) 14.320 +{ 14.321 + int i; 14.322 + 14.323 + c->loops_per_jiffy = loops_per_jiffy; 14.324 + c->x86_cache_size = -1; 14.325 + c->x86_vendor = X86_VENDOR_UNKNOWN; 14.326 + c->cpuid_level = -1; /* CPUID not detected */ 14.327 + c->x86_model = c->x86_mask = 0; /* So far unknown... */ 14.328 + c->x86_vendor_id[0] = '\0'; /* Unset */ 14.329 + c->x86_model_id[0] = '\0'; /* Unset */ 14.330 + memset(&c->x86_capability, 0, sizeof c->x86_capability); 14.331 + 14.332 + if (!have_cpuid_p()) { 14.333 + /* First of all, decide if this is a 486 or higher */ 14.334 + /* It's a 486 if we can modify the AC flag */ 14.335 + if ( flag_is_changeable_p(X86_EFLAGS_AC) ) 14.336 + c->x86 = 4; 14.337 + else 14.338 + c->x86 = 3; 14.339 + } 14.340 + 14.341 + generic_identify(c); 14.342 + 14.343 + printk(KERN_DEBUG "CPU: After generic identify, caps: %08lx %08lx %08lx %08lx\n", 14.344 + c->x86_capability[0], 14.345 + c->x86_capability[1], 14.346 + c->x86_capability[2], 14.347 + c->x86_capability[3]); 14.348 + 14.349 + if (this_cpu->c_identify) { 14.350 + this_cpu->c_identify(c); 14.351 + 14.352 + printk(KERN_DEBUG "CPU: After vendor identify, caps: %08lx %08lx %08lx %08lx\n", 14.353 + c->x86_capability[0], 14.354 + c->x86_capability[1], 14.355 + c->x86_capability[2], 14.356 + c->x86_capability[3]); 14.357 +} 14.358 + 14.359 + /* 14.360 + * Vendor-specific initialization. In this section we 14.361 + * canonicalize the feature flags, meaning if there are 14.362 + * features a certain CPU supports which CPUID doesn't 14.363 + * tell us, CPUID claiming incorrect flags, or other bugs, 14.364 + * we handle them here. 14.365 + * 14.366 + * At the end of this section, c->x86_capability better 14.367 + * indicate the features this CPU genuinely supports! 14.368 + */ 14.369 + if (this_cpu->c_init) 14.370 + this_cpu->c_init(c); 14.371 + 14.372 + /* Disable the PN if appropriate */ 14.373 + squash_the_stupid_serial_number(c); 14.374 + 14.375 + /* 14.376 + * The vendor-specific functions might have changed features. Now 14.377 + * we do "generic changes." 14.378 + */ 14.379 + 14.380 + /* TSC disabled? */ 14.381 + if ( tsc_disable ) 14.382 + clear_bit(X86_FEATURE_TSC, c->x86_capability); 14.383 + 14.384 + /* FXSR disabled? */ 14.385 + if (disable_x86_fxsr) { 14.386 + clear_bit(X86_FEATURE_FXSR, c->x86_capability); 14.387 + clear_bit(X86_FEATURE_XMM, c->x86_capability); 14.388 + } 14.389 + 14.390 + if (disable_pse) 14.391 + clear_bit(X86_FEATURE_PSE, c->x86_capability); 14.392 + 14.393 + /* If the model name is still unset, do table lookup. */ 14.394 + if ( !c->x86_model_id[0] ) { 14.395 + char *p; 14.396 + p = table_lookup_model(c); 14.397 + if ( p ) 14.398 + strcpy(c->x86_model_id, p); 14.399 + else 14.400 + /* Last resort... */ 14.401 + sprintf(c->x86_model_id, "%02x/%02x", 14.402 + c->x86_vendor, c->x86_model); 14.403 + } 14.404 + 14.405 + machine_specific_modify_cpu_capabilities(c); 14.406 + 14.407 + /* Now the feature flags better reflect actual CPU features! */ 14.408 + 14.409 + printk(KERN_DEBUG "CPU: After all inits, caps: %08lx %08lx %08lx %08lx\n", 14.410 + c->x86_capability[0], 14.411 + c->x86_capability[1], 14.412 + c->x86_capability[2], 14.413 + c->x86_capability[3]); 14.414 + 14.415 + /* 14.416 + * On SMP, boot_cpu_data holds the common feature set between 14.417 + * all CPUs; so make sure that we indicate which features are 14.418 + * common between the CPUs. The first time this routine gets 14.419 + * executed, c == &boot_cpu_data. 14.420 + */ 14.421 + if ( c != &boot_cpu_data ) { 14.422 + /* AND the already accumulated flags with these */ 14.423 + for ( i = 0 ; i < NCAPINTS ; i++ ) 14.424 + boot_cpu_data.x86_capability[i] &= c->x86_capability[i]; 14.425 + } 14.426 + 14.427 + /* Init Machine Check Exception if available. */ 14.428 +#ifdef CONFIG_X86_MCE 14.429 + mcheck_init(c); 14.430 +#endif 14.431 +} 14.432 +/* 14.433 + * Perform early boot up checks for a valid TSC. See arch/i386/kernel/time.c 14.434 + */ 14.435 + 14.436 +void __init dodgy_tsc(void) 14.437 +{ 14.438 + if (( boot_cpu_data.x86_vendor == X86_VENDOR_CYRIX ) || 14.439 + ( boot_cpu_data.x86_vendor == X86_VENDOR_NSC )) 14.440 + cpu_devs[X86_VENDOR_CYRIX]->c_init(&boot_cpu_data); 14.441 +} 14.442 + 14.443 +void __init print_cpu_info(struct cpuinfo_x86 *c) 14.444 +{ 14.445 + char *vendor = NULL; 14.446 + 14.447 + if (c->x86_vendor < X86_VENDOR_NUM) 14.448 + vendor = this_cpu->c_vendor; 14.449 + else if (c->cpuid_level >= 0) 14.450 + vendor = c->x86_vendor_id; 14.451 + 14.452 + if (vendor && strncmp(c->x86_model_id, vendor, strlen(vendor))) 14.453 + printk("%s ", vendor); 14.454 + 14.455 + if (!c->x86_model_id[0]) 14.456 + printk("%d86", c->x86); 14.457 + else 14.458 + printk("%s", c->x86_model_id); 14.459 + 14.460 + if (c->x86_mask || c->cpuid_level >= 0) 14.461 + printk(" stepping %02x\n", c->x86_mask); 14.462 + else 14.463 + printk("\n"); 14.464 +} 14.465 + 14.466 +unsigned long cpu_initialized __initdata = 0; 14.467 + 14.468 +/* This is hacky. :) 14.469 + * We're emulating future behavior. 14.470 + * In the future, the cpu-specific init functions will be called implicitly 14.471 + * via the magic of initcalls. 14.472 + * They will insert themselves into the cpu_devs structure. 14.473 + * Then, when cpu_init() is called, we can just iterate over that array. 14.474 + */ 14.475 + 14.476 +extern int intel_cpu_init(void); 14.477 +extern int cyrix_init_cpu(void); 14.478 +extern int nsc_init_cpu(void); 14.479 +extern int amd_init_cpu(void); 14.480 +extern int centaur_init_cpu(void); 14.481 +extern int transmeta_init_cpu(void); 14.482 +extern int rise_init_cpu(void); 14.483 +extern int nexgen_init_cpu(void); 14.484 +extern int umc_init_cpu(void); 14.485 +void early_cpu_detect(void); 14.486 + 14.487 +void __init early_cpu_init(void) 14.488 +{ 14.489 + intel_cpu_init(); 14.490 + cyrix_init_cpu(); 14.491 + nsc_init_cpu(); 14.492 + amd_init_cpu(); 14.493 + centaur_init_cpu(); 14.494 + transmeta_init_cpu(); 14.495 + rise_init_cpu(); 14.496 + nexgen_init_cpu(); 14.497 + umc_init_cpu(); 14.498 + early_cpu_detect(); 14.499 + 14.500 +#ifdef CONFIG_DEBUG_PAGEALLOC 14.501 + /* pse is not compatible with on-the-fly unmapping, 14.502 + * disable it even if the cpus claim to support it. 14.503 + */ 14.504 + clear_bit(X86_FEATURE_PSE, boot_cpu_data.x86_capability); 14.505 + disable_pse = 1; 14.506 +#endif 14.507 +} 14.508 + 14.509 +void __init cpu_gdt_init(struct Xgt_desc_struct *gdt_descr) 14.510 +{ 14.511 + unsigned long frames[gdt_descr->size >> PAGE_SHIFT]; 14.512 + unsigned long va; 14.513 + int f; 14.514 + 14.515 + for (va = gdt_descr->address, f = 0; 14.516 + va < gdt_descr->address + gdt_descr->size; 14.517 + va += PAGE_SIZE, f++) { 14.518 + frames[f] = virt_to_machine(va) >> PAGE_SHIFT; 14.519 + protect_page(swapper_pg_dir, (void *)va, PROT_ON); 14.520 + } 14.521 + flush_page_update_queue(); 14.522 + if (HYPERVISOR_set_gdt(frames, gdt_descr->size / 8)) 14.523 + BUG(); 14.524 + lgdt_finish(); 14.525 +} 14.526 + 14.527 +/* 14.528 + * cpu_init() initializes state that is per-CPU. Some data is already 14.529 + * initialized (naturally) in the bootstrap process, such as the GDT 14.530 + * and IDT. We reload them nevertheless, this function acts as a 14.531 + * 'CPU state barrier', nothing should get across. 14.532 + */ 14.533 +void __init cpu_init (void) 14.534 +{ 14.535 + int cpu = smp_processor_id(); 14.536 + struct tss_struct * t = &per_cpu(init_tss, cpu); 14.537 + struct thread_struct *thread = ¤t->thread; 14.538 + 14.539 + if (test_and_set_bit(cpu, &cpu_initialized)) { 14.540 + printk(KERN_WARNING "CPU#%d already initialized!\n", cpu); 14.541 + for (;;) local_irq_enable(); 14.542 + } 14.543 + printk(KERN_INFO "Initializing CPU#%d\n", cpu); 14.544 + 14.545 + if (cpu_has_vme || cpu_has_de) 14.546 + clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE); 14.547 + if (tsc_disable && cpu_has_tsc) { 14.548 + printk(KERN_NOTICE "Disabling TSC...\n"); 14.549 + /**** FIX-HPA: DOES THIS REALLY BELONG HERE? ****/ 14.550 + clear_bit(X86_FEATURE_TSC, boot_cpu_data.x86_capability); 14.551 + set_in_cr4(X86_CR4_TSD); 14.552 + } 14.553 + 14.554 + /* 14.555 + * Initialize the per-CPU GDT with the boot GDT, 14.556 + * and set up the GDT descriptor: 14.557 + */ 14.558 + if (cpu) { 14.559 + cpu_gdt_descr[cpu].size = GDT_SIZE; 14.560 + cpu_gdt_descr[cpu].address = 0; /* XXXcl alloc page */ 14.561 + BUG(); /* XXXcl SMP */ 14.562 + memcpy((void *)cpu_gdt_descr[cpu].address, 14.563 + (void *)cpu_gdt_descr[0].address, GDT_SIZE); 14.564 + } 14.565 + /* 14.566 + * Set up the per-thread TLS descriptor cache: 14.567 + */ 14.568 + memcpy(thread->tls_array, &get_cpu_gdt_table(cpu)[GDT_ENTRY_TLS_MIN], 14.569 + GDT_ENTRY_TLS_ENTRIES * 8); 14.570 + 14.571 + cpu_gdt_init(&cpu_gdt_descr[cpu]); 14.572 + 14.573 + /* 14.574 + * Delete NT 14.575 + */ 14.576 + __asm__("pushfl ; andl $0xffffbfff,(%esp) ; popfl"); 14.577 + 14.578 + /* 14.579 + * Set up and load the per-CPU TSS and LDT 14.580 + */ 14.581 + atomic_inc(&init_mm.mm_count); 14.582 + current->active_mm = &init_mm; 14.583 + if (current->mm) 14.584 + BUG(); 14.585 + enter_lazy_tlb(&init_mm, current); 14.586 + 14.587 + load_esp0(t, thread); 14.588 + 14.589 + load_LDT(&init_mm.context); 14.590 + flush_page_update_queue(); 14.591 + 14.592 + /* Clear %fs and %gs. */ 14.593 + asm volatile ("xorl %eax, %eax; movl %eax, %fs; movl %eax, %gs"); 14.594 + 14.595 + /* Clear all 6 debug registers: */ 14.596 + 14.597 +#define CD(register) HYPERVISOR_set_debugreg(register, 0) 14.598 + 14.599 + CD(0); CD(1); CD(2); CD(3); /* no db4 and db5 */; CD(6); CD(7); 14.600 + 14.601 +#undef CD 14.602 + 14.603 + /* 14.604 + * Force FPU initialization: 14.605 + */ 14.606 + current_thread_info()->status = 0; 14.607 + current->used_math = 0; 14.608 + mxcsr_feature_mask_init(); 14.609 +}
15.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 15.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/entry.S Fri Nov 19 23:17:26 2004 +0000 15.3 @@ -0,0 +1,987 @@ 15.4 +/* 15.5 + * linux/arch/i386/entry.S 15.6 + * 15.7 + * Copyright (C) 1991, 1992 Linus Torvalds 15.8 + */ 15.9 + 15.10 +/* 15.11 + * entry.S contains the system-call and fault low-level handling routines. 15.12 + * This also contains the timer-interrupt handler, as well as all interrupts 15.13 + * and faults that can result in a task-switch. 15.14 + * 15.15 + * NOTE: This code handles signal-recognition, which happens every time 15.16 + * after a timer-interrupt and after each system call. 15.17 + * 15.18 + * I changed all the .align's to 4 (16 byte alignment), as that's faster 15.19 + * on a 486. 15.20 + * 15.21 + * Stack layout in 'ret_from_system_call': 15.22 + * ptrace needs to have all regs on the stack. 15.23 + * if the order here is changed, it needs to be 15.24 + * updated in fork.c:copy_process, signal.c:do_signal, 15.25 + * ptrace.c and ptrace.h 15.26 + * 15.27 + * 0(%esp) - %ebx 15.28 + * 4(%esp) - %ecx 15.29 + * 8(%esp) - %edx 15.30 + * C(%esp) - %esi 15.31 + * 10(%esp) - %edi 15.32 + * 14(%esp) - %ebp 15.33 + * 18(%esp) - %eax 15.34 + * 1C(%esp) - %ds 15.35 + * 20(%esp) - %es 15.36 + * 24(%esp) - orig_eax 15.37 + * 28(%esp) - %eip 15.38 + * 2C(%esp) - %cs 15.39 + * 30(%esp) - %eflags 15.40 + * 34(%esp) - %oldesp 15.41 + * 38(%esp) - %oldss 15.42 + * 15.43 + * "current" is in register %ebx during any slow entries. 15.44 + */ 15.45 + 15.46 +#include <linux/config.h> 15.47 +#include <linux/linkage.h> 15.48 +#include <asm/thread_info.h> 15.49 +#include <asm/errno.h> 15.50 +#include <asm/segment.h> 15.51 +#include <asm/smp.h> 15.52 +#include <asm/page.h> 15.53 +#include "irq_vectors.h" 15.54 +#include <asm-xen/xen-public/xen.h> 15.55 + 15.56 +#define nr_syscalls ((syscall_table_size)/4) 15.57 + 15.58 +EBX = 0x00 15.59 +ECX = 0x04 15.60 +EDX = 0x08 15.61 +ESI = 0x0C 15.62 +EDI = 0x10 15.63 +EBP = 0x14 15.64 +EAX = 0x18 15.65 +DS = 0x1C 15.66 +ES = 0x20 15.67 +ORIG_EAX = 0x24 15.68 +EIP = 0x28 15.69 +CS = 0x2C 15.70 +EFLAGS = 0x30 15.71 +OLDESP = 0x34 15.72 +OLDSS = 0x38 15.73 + 15.74 +CF_MASK = 0x00000001 15.75 +TF_MASK = 0x00000100 15.76 +IF_MASK = 0x00000200 15.77 +DF_MASK = 0x00000400 15.78 +NT_MASK = 0x00004000 15.79 +VM_MASK = 0x00020000 15.80 + 15.81 +/* Offsets into shared_info_t. */ 15.82 +#define evtchn_upcall_pending /* 0 */ 15.83 +#define evtchn_upcall_mask 1 15.84 + 15.85 +#define XEN_BLOCK_EVENTS(reg) movb $1,evtchn_upcall_mask(reg) 15.86 +#define XEN_UNBLOCK_EVENTS(reg) movb $0,evtchn_upcall_mask(reg) 15.87 +#define XEN_TEST_PENDING(reg) testb $0xFF,evtchn_upcall_pending(%reg) 15.88 + 15.89 +#ifdef CONFIG_PREEMPT 15.90 +#define preempt_stop movl HYPERVISOR_shared_info,%esi ; \ 15.91 + XEN_BLOCK_EVENTS(%esi) 15.92 +#else 15.93 +#define preempt_stop 15.94 +#define resume_kernel restore_all_enable_events 15.95 +#endif 15.96 + 15.97 +#define SAVE_ALL \ 15.98 + cld; \ 15.99 + pushl %es; \ 15.100 + pushl %ds; \ 15.101 + pushl %eax; \ 15.102 + pushl %ebp; \ 15.103 + pushl %edi; \ 15.104 + pushl %esi; \ 15.105 + pushl %edx; \ 15.106 + pushl %ecx; \ 15.107 + pushl %ebx; \ 15.108 + movl $(__USER_DS), %edx; \ 15.109 + movl %edx, %ds; \ 15.110 + movl %edx, %es; 15.111 + 15.112 +#define RESTORE_INT_REGS \ 15.113 + popl %ebx; \ 15.114 + popl %ecx; \ 15.115 + popl %edx; \ 15.116 + popl %esi; \ 15.117 + popl %edi; \ 15.118 + popl %ebp; \ 15.119 + popl %eax 15.120 + 15.121 +#define RESTORE_REGS \ 15.122 + RESTORE_INT_REGS; \ 15.123 +1: popl %ds; \ 15.124 +2: popl %es; \ 15.125 +.section .fixup,"ax"; \ 15.126 +3: movl $0,(%esp); \ 15.127 + jmp 1b; \ 15.128 +4: movl $0,(%esp); \ 15.129 + jmp 2b; \ 15.130 +.previous; \ 15.131 +.section __ex_table,"a";\ 15.132 + .align 4; \ 15.133 + .long 1b,3b; \ 15.134 + .long 2b,4b; \ 15.135 +.previous 15.136 + 15.137 + 15.138 +#define RESTORE_ALL \ 15.139 + RESTORE_REGS \ 15.140 + addl $4, %esp; \ 15.141 +1: iret; \ 15.142 +.section .fixup,"ax"; \ 15.143 +2: movl $(__USER_DS), %edx; \ 15.144 + movl %edx, %ds; \ 15.145 + movl %edx, %es; \ 15.146 + movl $11,%eax; \ 15.147 + call do_exit; \ 15.148 +.previous; \ 15.149 +.section __ex_table,"a";\ 15.150 + .align 4; \ 15.151 + .long 1b,2b; \ 15.152 +.previous 15.153 + 15.154 + 15.155 +ENTRY(ret_from_fork) 15.156 + pushl %eax 15.157 + call schedule_tail 15.158 + GET_THREAD_INFO(%ebp) 15.159 + popl %eax 15.160 + jmp syscall_exit 15.161 + 15.162 +/* 15.163 + * Return to user mode is not as complex as all this looks, 15.164 + * but we want the default path for a system call return to 15.165 + * go as quickly as possible which is why some of this is 15.166 + * less clear than it otherwise should be. 15.167 + */ 15.168 + 15.169 + # userspace resumption stub bypassing syscall exit tracing 15.170 + ALIGN 15.171 +ret_from_exception: 15.172 + preempt_stop 15.173 +ret_from_intr: 15.174 + GET_THREAD_INFO(%ebp) 15.175 + movl EFLAGS(%esp), %eax # mix EFLAGS and CS 15.176 + movb CS(%esp), %al 15.177 + testl $(VM_MASK | 2), %eax 15.178 + jz resume_kernel # returning to kernel or vm86-space 15.179 +ENTRY(resume_userspace) 15.180 + movl HYPERVISOR_shared_info,%esi 15.181 + XEN_BLOCK_EVENTS(%esi) # make tests atomic 15.182 + # make sure we don't miss an interrupt 15.183 + # setting need_resched or sigpending 15.184 + # between sampling and the iret 15.185 +ret_syscall_tests: 15.186 + movl TI_flags(%ebp), %ecx 15.187 + andl $_TIF_WORK_MASK, %ecx # is there any work to be done on 15.188 + # int/exception return? 15.189 + jne work_pending 15.190 + jmp restore_all_enable_events 15.191 + 15.192 +#ifdef CONFIG_PREEMPT 15.193 +ENTRY(resume_kernel) 15.194 + movl HYPERVISOR_shared_info,%esi 15.195 + cmpl $0,TI_preempt_count(%ebp) # non-zero preempt_count ? 15.196 + jnz restore_all_enable_events 15.197 +need_resched: 15.198 + movl TI_flags(%ebp), %ecx # need_resched set ? 15.199 + testb $_TIF_NEED_RESCHED, %cl 15.200 + jz restore_all_enable_events 15.201 + testl $IF_MASK,EFLAGS(%esp) # interrupts off (exception path) ? 15.202 + jz restore_all_enable_events 15.203 + movl $PREEMPT_ACTIVE,TI_preempt_count(%ebp) 15.204 + XEN_UNBLOCK_EVENTS(%esi) # reenable event callbacks 15.205 + call schedule 15.206 + movl HYPERVISOR_shared_info,%esi 15.207 + XEN_BLOCK_EVENTS(%esi) # make tests atomic 15.208 + movl $0,TI_preempt_count(%ebp) 15.209 + jmp need_resched 15.210 +#endif 15.211 + 15.212 +/* SYSENTER_RETURN points to after the "sysenter" instruction in 15.213 + the vsyscall page. See vsyscall-sysentry.S, which defines the symbol. */ 15.214 + 15.215 + # sysenter call handler stub 15.216 +ENTRY(sysenter_entry) 15.217 + movl TSS_sysenter_esp0(%esp),%esp 15.218 +sysenter_past_esp: 15.219 + sti 15.220 + pushl $(__USER_DS) 15.221 + pushl %ebp 15.222 + pushfl 15.223 + pushl $(__USER_CS) 15.224 + pushl $SYSENTER_RETURN 15.225 + 15.226 +/* 15.227 + * Load the potential sixth argument from user stack. 15.228 + * Careful about security. 15.229 + */ 15.230 + cmpl $__PAGE_OFFSET-3,%ebp 15.231 + jae syscall_fault 15.232 +1: movl (%ebp),%ebp 15.233 +.section __ex_table,"a" 15.234 + .align 4 15.235 + .long 1b,syscall_fault 15.236 +.previous 15.237 + 15.238 + pushl %eax 15.239 + SAVE_ALL 15.240 + GET_THREAD_INFO(%ebp) 15.241 + 15.242 + testb $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),TI_flags(%ebp) 15.243 + jnz syscall_trace_entry 15.244 + cmpl $(nr_syscalls), %eax 15.245 + jae syscall_badsys 15.246 + call *sys_call_table(,%eax,4) 15.247 + movl %eax,EAX(%esp) 15.248 + cli 15.249 + movl TI_flags(%ebp), %ecx 15.250 + testw $_TIF_ALLWORK_MASK, %cx 15.251 + jne syscall_exit_work 15.252 +/* if something modifies registers it must also disable sysexit */ 15.253 + movl EIP(%esp), %edx 15.254 + movl OLDESP(%esp), %ecx 15.255 + sti 15.256 + sysexit 15.257 + 15.258 + 15.259 + # system call handler stub 15.260 +ENTRY(system_call) 15.261 + pushl %eax # save orig_eax 15.262 + SAVE_ALL 15.263 + GET_THREAD_INFO(%ebp) 15.264 + # system call tracing in operation 15.265 + testb $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),TI_flags(%ebp) 15.266 + jnz syscall_trace_entry 15.267 + cmpl $(nr_syscalls), %eax 15.268 + jae syscall_badsys 15.269 +syscall_call: 15.270 + call *sys_call_table(,%eax,4) 15.271 + movl %eax,EAX(%esp) # store the return value 15.272 +syscall_exit: 15.273 + movl HYPERVISOR_shared_info,%esi 15.274 + XEN_BLOCK_EVENTS(%esi) # make tests atomic 15.275 + # make sure we don't miss an interrupt 15.276 + # setting need_resched or sigpending 15.277 + # between sampling and the iret 15.278 + movl TI_flags(%ebp), %ecx 15.279 + testw $_TIF_ALLWORK_MASK, %cx # current->work 15.280 + jne syscall_exit_work 15.281 + jmp restore_all_enable_events 15.282 + 15.283 + # perform work that needs to be done immediately before resumption 15.284 + ALIGN 15.285 +work_pending: 15.286 + XEN_UNBLOCK_EVENTS(%esi) # reenable event callbacks 15.287 + testb $_TIF_NEED_RESCHED, %cl 15.288 + jz work_notifysig 15.289 +work_resched: 15.290 + call schedule 15.291 + movl HYPERVISOR_shared_info,%esi 15.292 + XEN_BLOCK_EVENTS(%esi) # make tests atomic 15.293 + # make sure we don't miss an interrupt 15.294 + # setting need_resched or sigpending 15.295 + # between sampling and the iret 15.296 + movl TI_flags(%ebp), %ecx 15.297 + andl $_TIF_WORK_MASK, %ecx # is there any work to be done other 15.298 + # than syscall tracing? 15.299 + jz restore_all_enable_events 15.300 + # XXXcl sti missing??? 15.301 + XEN_UNBLOCK_EVENTS(%esi) # reenable event callbacks 15.302 + testb $_TIF_NEED_RESCHED, %cl 15.303 + jnz work_resched 15.304 + 15.305 +work_notifysig: # deal with pending signals and 15.306 + # notify-resume requests 15.307 + testl $VM_MASK, EFLAGS(%esp) 15.308 + movl %esp, %eax 15.309 + jne work_notifysig_v86 # returning to kernel-space or 15.310 + # vm86-space 15.311 + xorl %edx, %edx 15.312 + call do_notify_resume 15.313 + movl HYPERVISOR_shared_info,%esi 15.314 + jmp restore_all_enable_events 15.315 + 15.316 + ALIGN 15.317 +work_notifysig_v86: 15.318 + pushl %ecx # save ti_flags for do_notify_resume 15.319 + call save_v86_state # %eax contains pt_regs pointer 15.320 + popl %ecx 15.321 + movl %eax, %esp 15.322 + xorl %edx, %edx 15.323 + call do_notify_resume 15.324 + movl HYPERVISOR_shared_info,%esi 15.325 + jmp restore_all_enable_events 15.326 + 15.327 + # perform syscall exit tracing 15.328 + ALIGN 15.329 +syscall_trace_entry: 15.330 + movl $-ENOSYS,EAX(%esp) 15.331 + movl %esp, %eax 15.332 + xorl %edx,%edx 15.333 + call do_syscall_trace 15.334 + movl ORIG_EAX(%esp), %eax 15.335 + cmpl $(nr_syscalls), %eax 15.336 + jnae syscall_call 15.337 + jmp syscall_exit 15.338 + 15.339 + # perform syscall exit tracing 15.340 + ALIGN 15.341 +syscall_exit_work: 15.342 + movl HYPERVISOR_shared_info,%esi 15.343 + testb $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP), %cl 15.344 + jz work_pending 15.345 + XEN_UNBLOCK_EVENTS(%esi) # reenable event callbacks 15.346 + # could let do_syscall_trace() call 15.347 + # schedule() instead 15.348 + movl %esp, %eax 15.349 + movl $1, %edx 15.350 + call do_syscall_trace 15.351 + jmp resume_userspace 15.352 + 15.353 + ALIGN 15.354 +syscall_fault: 15.355 + pushl %eax # save orig_eax 15.356 + SAVE_ALL 15.357 + GET_THREAD_INFO(%ebp) 15.358 + movl $-EFAULT,EAX(%esp) 15.359 + jmp resume_userspace 15.360 + 15.361 + ALIGN 15.362 +syscall_badsys: 15.363 + movl $-ENOSYS,EAX(%esp) 15.364 + jmp resume_userspace 15.365 + 15.366 +ENTRY(divide_error) 15.367 + pushl $0 # no error code 15.368 + pushl $do_divide_error 15.369 + ALIGN 15.370 +error_code: 15.371 + pushl %ds 15.372 + pushl %eax 15.373 + xorl %eax, %eax 15.374 + pushl %ebp 15.375 + pushl %edi 15.376 + pushl %esi 15.377 + pushl %edx 15.378 + decl %eax # eax = -1 15.379 + pushl %ecx 15.380 + pushl %ebx 15.381 + cld 15.382 + movl %es, %ecx 15.383 + movl ES(%esp), %edi # get the function address 15.384 + movl ORIG_EAX(%esp), %edx # get the error code 15.385 + movl %eax, ORIG_EAX(%esp) 15.386 + movl %ecx, ES(%esp) 15.387 + movl $(__USER_DS), %ecx 15.388 + movl %ecx, %ds 15.389 + movl %ecx, %es 15.390 + movl %esp,%eax # pt_regs pointer 15.391 + call *%edi 15.392 + jmp ret_from_exception 15.393 + 15.394 +# A note on the "critical region" in our callback handler. 15.395 +# We want to avoid stacking callback handlers due to events occurring 15.396 +# during handling of the last event. To do this, we keep events disabled 15.397 +# until we've done all processing. HOWEVER, we must enable events before 15.398 +# popping the stack frame (can't be done atomically) and so it would still 15.399 +# be possible to get enough handler activations to overflow the stack. 15.400 +# Although unlikely, bugs of that kind are hard to track down, so we'd 15.401 +# like to avoid the possibility. 15.402 +# So, on entry to the handler we detect whether we interrupted an 15.403 +# existing activation in its critical region -- if so, we pop the current 15.404 +# activation and restart the handler using the previous one. 15.405 +ENTRY(hypervisor_callback) 15.406 + pushl %eax 15.407 + SAVE_ALL 15.408 + GET_THREAD_INFO(%ebp) 15.409 + movl EIP(%esp),%eax 15.410 + cmpl $scrit,%eax 15.411 + jb 11f 15.412 + cmpl $ecrit,%eax 15.413 + jb critical_region_fixup 15.414 +11: push %esp 15.415 + call evtchn_do_upcall 15.416 + add $4,%esp 15.417 + movl HYPERVISOR_shared_info,%esi 15.418 + movb CS(%esp),%cl 15.419 + test $2,%cl # slow return to ring 2 or 3 15.420 + jne ret_syscall_tests 15.421 +restore_all_enable_events: 15.422 +safesti:XEN_UNBLOCK_EVENTS(%esi) # reenable event callbacks 15.423 +scrit: /**** START OF CRITICAL REGION ****/ 15.424 + testb $1,evtchn_upcall_pending(%esi) 15.425 + jnz 14f # process more events if necessary... 15.426 + RESTORE_ALL 15.427 +14: XEN_BLOCK_EVENTS(%esi) 15.428 + jmp 11b 15.429 +ecrit: /**** END OF CRITICAL REGION ****/ 15.430 +# [How we do the fixup]. We want to merge the current stack frame with the 15.431 +# just-interrupted frame. How we do this depends on where in the critical 15.432 +# region the interrupted handler was executing, and so how many saved 15.433 +# registers are in each frame. We do this quickly using the lookup table 15.434 +# 'critical_fixup_table'. For each byte offset in the critical region, it 15.435 +# provides the number of bytes which have already been popped from the 15.436 +# interrupted stack frame. 15.437 +critical_region_fixup: 15.438 + addl $critical_fixup_table-scrit,%eax 15.439 + movzbl (%eax),%eax # %eax contains num bytes popped 15.440 + mov %esp,%esi 15.441 + add %eax,%esi # %esi points at end of src region 15.442 + mov %esp,%edi 15.443 + add $0x34,%edi # %edi points at end of dst region 15.444 + mov %eax,%ecx 15.445 + shr $2,%ecx # convert words to bytes 15.446 + je 16f # skip loop if nothing to copy 15.447 +15: subl $4,%esi # pre-decrementing copy loop 15.448 + subl $4,%edi 15.449 + movl (%esi),%eax 15.450 + movl %eax,(%edi) 15.451 + loop 15b 15.452 +16: movl %edi,%esp # final %edi is top of merged stack 15.453 + jmp 11b 15.454 + 15.455 +critical_fixup_table: 15.456 + .byte 0x00,0x00,0x00 # testb $0xff,(%esi) 15.457 + .byte 0x00,0x00 # jnz 14f 15.458 + .byte 0x00 # pop %ebx 15.459 + .byte 0x04 # pop %ecx 15.460 + .byte 0x08 # pop %edx 15.461 + .byte 0x0c # pop %esi 15.462 + .byte 0x10 # pop %edi 15.463 + .byte 0x14 # pop %ebp 15.464 + .byte 0x18 # pop %eax 15.465 + .byte 0x1c # pop %ds 15.466 + .byte 0x20 # pop %es 15.467 + .byte 0x24,0x24,0x24 # add $4,%esp 15.468 + .byte 0x28 # iret 15.469 + .byte 0x00,0x00,0x00,0x00 # movb $1,1(%esi) 15.470 + .byte 0x00,0x00 # jmp 11b 15.471 + 15.472 +# Hypervisor uses this for application faults while it executes. 15.473 +ENTRY(failsafe_callback) 15.474 +1: popl %ds 15.475 +2: popl %es 15.476 +3: popl %fs 15.477 +4: popl %gs 15.478 +5: iret 15.479 +.section .fixup,"ax"; \ 15.480 +6: movl $0,(%esp); \ 15.481 + jmp 1b; \ 15.482 +7: movl $0,(%esp); \ 15.483 + jmp 2b; \ 15.484 +8: movl $0,(%esp); \ 15.485 + jmp 3b; \ 15.486 +9: movl $0,(%esp); \ 15.487 + jmp 4b; \ 15.488 +10: pushl %ss; \ 15.489 + popl %ds; \ 15.490 + pushl %ss; \ 15.491 + popl %es; \ 15.492 + pushl $11; \ 15.493 + call do_exit; \ 15.494 +.previous; \ 15.495 +.section __ex_table,"a";\ 15.496 + .align 4; \ 15.497 + .long 1b,6b; \ 15.498 + .long 2b,7b; \ 15.499 + .long 3b,8b; \ 15.500 + .long 4b,9b; \ 15.501 + .long 5b,10b; \ 15.502 +.previous 15.503 + 15.504 +ENTRY(coprocessor_error) 15.505 + pushl $0 15.506 + pushl $do_coprocessor_error 15.507 + jmp error_code 15.508 + 15.509 +ENTRY(simd_coprocessor_error) 15.510 + pushl $0 15.511 + pushl $do_simd_coprocessor_error 15.512 + jmp error_code 15.513 + 15.514 +ENTRY(device_not_available) 15.515 + pushl $-1 # mark this as an int 15.516 + SAVE_ALL 15.517 + preempt_stop 15.518 + call math_state_restore 15.519 + jmp ret_from_exception 15.520 + 15.521 +/* 15.522 + * Debug traps and NMI can happen at the one SYSENTER instruction 15.523 + * that sets up the real kernel stack. Check here, since we can't 15.524 + * allow the wrong stack to be used. 15.525 + * 15.526 + * "TSS_sysenter_esp0+12" is because the NMI/debug handler will have 15.527 + * already pushed 3 words if it hits on the sysenter instruction: 15.528 + * eflags, cs and eip. 15.529 + * 15.530 + * We just load the right stack, and push the three (known) values 15.531 + * by hand onto the new stack - while updating the return eip past 15.532 + * the instruction that would have done it for sysenter. 15.533 + */ 15.534 +#define FIX_STACK(offset, ok, label) \ 15.535 + cmpw $__KERNEL_CS,4(%esp); \ 15.536 + jne ok; \ 15.537 +label: \ 15.538 + movl TSS_sysenter_esp0+offset(%esp),%esp; \ 15.539 + pushfl; \ 15.540 + pushl $__KERNEL_CS; \ 15.541 + pushl $sysenter_past_esp 15.542 + 15.543 +ENTRY(debug) 15.544 + cmpl $sysenter_entry,(%esp) 15.545 + jne debug_stack_correct 15.546 + FIX_STACK(12, debug_stack_correct, debug_esp_fix_insn) 15.547 +debug_stack_correct: 15.548 + pushl $-1 # mark this as an int 15.549 + SAVE_ALL 15.550 + xorl %edx,%edx # error code 0 15.551 + movl %esp,%eax # pt_regs pointer 15.552 + call do_debug 15.553 + testl %eax,%eax 15.554 + jnz restore_all_enable_events 15.555 + jmp ret_from_exception 15.556 + 15.557 +#if 0 15.558 +/* 15.559 + * NMI is doubly nasty. It can happen _while_ we're handling 15.560 + * a debug fault, and the debug fault hasn't yet been able to 15.561 + * clear up the stack. So we first check whether we got an 15.562 + * NMI on the sysenter entry path, but after that we need to 15.563 + * check whether we got an NMI on the debug path where the debug 15.564 + * fault happened on the sysenter path. 15.565 + */ 15.566 +ENTRY(nmi) 15.567 + cmpl $sysenter_entry,(%esp) 15.568 + je nmi_stack_fixup 15.569 + pushl %eax 15.570 + movl %esp,%eax 15.571 + /* Do not access memory above the end of our stack page, 15.572 + * it might not exist. 15.573 + */ 15.574 + andl $(THREAD_SIZE-1),%eax 15.575 + cmpl $(THREAD_SIZE-20),%eax 15.576 + popl %eax 15.577 + jae nmi_stack_correct 15.578 + cmpl $sysenter_entry,12(%esp) 15.579 + je nmi_debug_stack_check 15.580 +nmi_stack_correct: 15.581 + pushl %eax 15.582 + SAVE_ALL 15.583 + xorl %edx,%edx # zero error code 15.584 + movl %esp,%eax # pt_regs pointer 15.585 + call do_nmi 15.586 + RESTORE_ALL 15.587 + 15.588 +nmi_stack_fixup: 15.589 + FIX_STACK(12,nmi_stack_correct, 1) 15.590 + jmp nmi_stack_correct 15.591 +nmi_debug_stack_check: 15.592 + cmpw $__KERNEL_CS,16(%esp) 15.593 + jne nmi_stack_correct 15.594 + cmpl $debug - 1,(%esp) 15.595 + jle nmi_stack_correct 15.596 + cmpl $debug_esp_fix_insn,(%esp) 15.597 + jle nmi_debug_stack_fixup 15.598 +nmi_debug_stack_fixup: 15.599 + FIX_STACK(24,nmi_stack_correct, 1) 15.600 + jmp nmi_stack_correct 15.601 +#endif 15.602 + 15.603 +ENTRY(int3) 15.604 + pushl $-1 # mark this as an int 15.605 + SAVE_ALL 15.606 + xorl %edx,%edx # zero error code 15.607 + movl %esp,%eax # pt_regs pointer 15.608 + call do_int3 15.609 + testl %eax,%eax 15.610 + jnz restore_all_enable_events 15.611 + jmp ret_from_exception 15.612 + 15.613 +ENTRY(overflow) 15.614 + pushl $0 15.615 + pushl $do_overflow 15.616 + jmp error_code 15.617 + 15.618 +ENTRY(bounds) 15.619 + pushl $0 15.620 + pushl $do_bounds 15.621 + jmp error_code 15.622 + 15.623 +ENTRY(invalid_op) 15.624 + pushl $0 15.625 + pushl $do_invalid_op 15.626 + jmp error_code 15.627 + 15.628 +ENTRY(coprocessor_segment_overrun) 15.629 + pushl $0 15.630 + pushl $do_coprocessor_segment_overrun 15.631 + jmp error_code 15.632 + 15.633 +ENTRY(double_fault) 15.634 + pushl $do_double_fault 15.635 + jmp error_code 15.636 + 15.637 +ENTRY(invalid_TSS) 15.638 + pushl $do_invalid_TSS 15.639 + jmp error_code 15.640 + 15.641 +ENTRY(segment_not_present) 15.642 + pushl $do_segment_not_present 15.643 + jmp error_code 15.644 + 15.645 +ENTRY(stack_segment) 15.646 + pushl $do_stack_segment 15.647 + jmp error_code 15.648 + 15.649 +ENTRY(general_protection) 15.650 + pushl $do_general_protection 15.651 + jmp error_code 15.652 + 15.653 +ENTRY(alignment_check) 15.654 + pushl $do_alignment_check 15.655 + jmp error_code 15.656 + 15.657 +# This handler is special, because it gets an extra value on its stack, 15.658 +# which is the linear faulting address. 15.659 +# fastcall register usage: %eax = pt_regs, %edx = error code, 15.660 +# %ecx = fault address 15.661 +#define PAGE_FAULT_STUB(_name1, _name2) \ 15.662 +ENTRY(_name1) \ 15.663 + pushl %ds ; \ 15.664 + pushl %eax ; \ 15.665 + xorl %eax, %eax ; \ 15.666 + pushl %ebp ; \ 15.667 + pushl %edi ; \ 15.668 + pushl %esi ; \ 15.669 + pushl %edx ; \ 15.670 + decl %eax /* eax = -1 */ ; \ 15.671 + pushl %ecx ; \ 15.672 + pushl %ebx ; \ 15.673 + cld ; \ 15.674 + movl %es,%edi ; \ 15.675 + movl ES(%esp), %ecx /* get the faulting address */ ; \ 15.676 + movl ORIG_EAX(%esp), %edx /* get the error code */ ; \ 15.677 + movl %eax, ORIG_EAX(%esp) ; \ 15.678 + movl %edi, ES(%esp) ; \ 15.679 + movl $(__KERNEL_DS), %eax ; \ 15.680 + movl %eax, %ds ; \ 15.681 + movl %eax, %es ; \ 15.682 + movl %esp,%eax /* pt_regs pointer */ ; \ 15.683 + call _name2 ; \ 15.684 + jmp ret_from_exception ; 15.685 +PAGE_FAULT_STUB(page_fault, do_page_fault) 15.686 + 15.687 +#ifdef CONFIG_X86_MCE 15.688 +ENTRY(machine_check) 15.689 + pushl $0 15.690 + pushl machine_check_vector 15.691 + jmp error_code 15.692 +#endif 15.693 + 15.694 +ENTRY(fixup_4gb_segment) 15.695 + pushl $do_fixup_4gb_segment 15.696 + jmp error_code 15.697 + 15.698 +.data 15.699 +ENTRY(sys_call_table) 15.700 + .long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */ 15.701 + .long sys_exit 15.702 + .long sys_fork 15.703 + .long sys_read 15.704 + .long sys_write 15.705 + .long sys_open /* 5 */ 15.706 + .long sys_close 15.707 + .long sys_waitpid 15.708 + .long sys_creat 15.709 + .long sys_link 15.710 + .long sys_unlink /* 10 */ 15.711 + .long sys_execve 15.712 + .long sys_chdir 15.713 + .long sys_time 15.714 + .long sys_mknod 15.715 + .long sys_chmod /* 15 */ 15.716 + .long sys_lchown16 15.717 + .long sys_ni_syscall /* old break syscall holder */ 15.718 + .long sys_stat 15.719 + .long sys_lseek 15.720 + .long sys_getpid /* 20 */ 15.721 + .long sys_mount 15.722 + .long sys_oldumount 15.723 + .long sys_setuid16 15.724 + .long sys_getuid16 15.725 + .long sys_stime /* 25 */ 15.726 + .long sys_ptrace 15.727 + .long sys_alarm 15.728 + .long sys_fstat 15.729 + .long sys_pause 15.730 + .long sys_utime /* 30 */ 15.731 + .long sys_ni_syscall /* old stty syscall holder */ 15.732 + .long sys_ni_syscall /* old gtty syscall holder */ 15.733 + .long sys_access 15.734 + .long sys_nice 15.735 + .long sys_ni_syscall /* 35 - old ftime syscall holder */ 15.736 + .long sys_sync 15.737 + .long sys_kill 15.738 + .long sys_rename 15.739 + .long sys_mkdir 15.740 + .long sys_rmdir /* 40 */ 15.741 + .long sys_dup 15.742 + .long sys_pipe 15.743 + .long sys_times 15.744 + .long sys_ni_syscall /* old prof syscall holder */ 15.745 + .long sys_brk /* 45 */ 15.746 + .long sys_setgid16 15.747 + .long sys_getgid16 15.748 + .long sys_signal 15.749 + .long sys_geteuid16 15.750 + .long sys_getegid16 /* 50 */ 15.751 + .long sys_acct 15.752 + .long sys_umount /* recycled never used phys() */ 15.753 + .long sys_ni_syscall /* old lock syscall holder */ 15.754 + .long sys_ioctl 15.755 + .long sys_fcntl /* 55 */ 15.756 + .long sys_ni_syscall /* old mpx syscall holder */ 15.757 + .long sys_setpgid 15.758 + .long sys_ni_syscall /* old ulimit syscall holder */ 15.759 + .long sys_olduname 15.760 + .long sys_umask /* 60 */ 15.761 + .long sys_chroot 15.762 + .long sys_ustat 15.763 + .long sys_dup2 15.764 + .long sys_getppid 15.765 + .long sys_getpgrp /* 65 */ 15.766 + .long sys_setsid 15.767 + .long sys_sigaction 15.768 + .long sys_sgetmask 15.769 + .long sys_ssetmask 15.770 + .long sys_setreuid16 /* 70 */ 15.771 + .long sys_setregid16 15.772 + .long sys_sigsuspend 15.773 + .long sys_sigpending 15.774 + .long sys_sethostname 15.775 + .long sys_setrlimit /* 75 */ 15.776 + .long sys_old_getrlimit 15.777 + .long sys_getrusage 15.778 + .long sys_gettimeofday 15.779 + .long sys_settimeofday 15.780 + .long sys_getgroups16 /* 80 */ 15.781 + .long sys_setgroups16 15.782 + .long old_select 15.783 + .long sys_symlink 15.784 + .long sys_lstat 15.785 + .long sys_readlink /* 85 */ 15.786 + .long sys_uselib 15.787 + .long sys_swapon 15.788 + .long sys_reboot 15.789 + .long old_readdir 15.790 + .long old_mmap /* 90 */ 15.791 + .long sys_munmap 15.792 + .long sys_truncate 15.793 + .long sys_ftruncate 15.794 + .long sys_fchmod 15.795 + .long sys_fchown16 /* 95 */ 15.796 + .long sys_getpriority 15.797 + .long sys_setpriority 15.798 + .long sys_ni_syscall /* old profil syscall holder */ 15.799 + .long sys_statfs 15.800 + .long sys_fstatfs /* 100 */ 15.801 + .long sys_ioperm 15.802 + .long sys_socketcall 15.803 + .long sys_syslog 15.804 + .long sys_setitimer 15.805 + .long sys_getitimer /* 105 */ 15.806 + .long sys_newstat 15.807 + .long sys_newlstat 15.808 + .long sys_newfstat 15.809 + .long sys_uname 15.810 + .long sys_iopl /* 110 */ 15.811 + .long sys_vhangup 15.812 + .long sys_ni_syscall /* old "idle" system call */ 15.813 + .long sys_ni_syscall /* disable sys_vm86old */ 15.814 + .long sys_wait4 15.815 + .long sys_swapoff /* 115 */ 15.816 + .long sys_sysinfo 15.817 + .long sys_ipc 15.818 + .long sys_fsync 15.819 + .long sys_sigreturn 15.820 + .long sys_clone /* 120 */ 15.821 + .long sys_setdomainname 15.822 + .long sys_newuname 15.823 + .long sys_modify_ldt 15.824 + .long sys_adjtimex 15.825 + .long sys_mprotect /* 125 */ 15.826 + .long sys_sigprocmask 15.827 + .long sys_ni_syscall /* old "create_module" */ 15.828 + .long sys_init_module 15.829 + .long sys_delete_module 15.830 + .long sys_ni_syscall /* 130: old "get_kernel_syms" */ 15.831 + .long sys_quotactl 15.832 + .long sys_getpgid 15.833 + .long sys_fchdir 15.834 + .long sys_bdflush 15.835 + .long sys_sysfs /* 135 */ 15.836 + .long sys_personality 15.837 + .long sys_ni_syscall /* reserved for afs_syscall */ 15.838 + .long sys_setfsuid16 15.839 + .long sys_setfsgid16 15.840 + .long sys_llseek /* 140 */ 15.841 + .long sys_getdents 15.842 + .long sys_select 15.843 + .long sys_flock 15.844 + .long sys_msync 15.845 + .long sys_readv /* 145 */ 15.846 + .long sys_writev 15.847 + .long sys_getsid 15.848 + .long sys_fdatasync 15.849 + .long sys_sysctl 15.850 + .long sys_mlock /* 150 */ 15.851 + .long sys_munlock 15.852 + .long sys_mlockall 15.853 + .long sys_munlockall 15.854 + .long sys_sched_setparam 15.855 + .long sys_sched_getparam /* 155 */ 15.856 + .long sys_sched_setscheduler 15.857 + .long sys_sched_getscheduler 15.858 + .long sys_sched_yield 15.859 + .long sys_sched_get_priority_max 15.860 + .long sys_sched_get_priority_min /* 160 */ 15.861 + .long sys_sched_rr_get_interval 15.862 + .long sys_nanosleep 15.863 + .long sys_mremap 15.864 + .long sys_setresuid16 15.865 + .long sys_getresuid16 /* 165 */ 15.866 + .long sys_vm86 15.867 + .long sys_ni_syscall /* Old sys_query_module */ 15.868 + .long sys_poll 15.869 + .long sys_nfsservctl 15.870 + .long sys_setresgid16 /* 170 */ 15.871 + .long sys_getresgid16 15.872 + .long sys_prctl 15.873 + .long sys_rt_sigreturn 15.874 + .long sys_rt_sigaction 15.875 + .long sys_rt_sigprocmask /* 175 */ 15.876 + .long sys_rt_sigpending 15.877 + .long sys_rt_sigtimedwait 15.878 + .long sys_rt_sigqueueinfo 15.879 + .long sys_rt_sigsuspend 15.880 + .long sys_pread64 /* 180 */ 15.881 + .long sys_pwrite64 15.882 + .long sys_chown16 15.883 + .long sys_getcwd 15.884 + .long sys_capget 15.885 + .long sys_capset /* 185 */ 15.886 + .long sys_sigaltstack 15.887 + .long sys_sendfile 15.888 + .long sys_ni_syscall /* reserved for streams1 */ 15.889 + .long sys_ni_syscall /* reserved for streams2 */ 15.890 + .long sys_vfork /* 190 */ 15.891 + .long sys_getrlimit 15.892 + .long sys_mmap2 15.893 + .long sys_truncate64 15.894 + .long sys_ftruncate64 15.895 + .long sys_stat64 /* 195 */ 15.896 + .long sys_lstat64 15.897 + .long sys_fstat64 15.898 + .long sys_lchown 15.899 + .long sys_getuid 15.900 + .long sys_getgid /* 200 */ 15.901 + .long sys_geteuid 15.902 + .long sys_getegid 15.903 + .long sys_setreuid 15.904 + .long sys_setregid 15.905 + .long sys_getgroups /* 205 */ 15.906 + .long sys_setgroups 15.907 + .long sys_fchown 15.908 + .long sys_setresuid 15.909 + .long sys_getresuid 15.910 + .long sys_setresgid /* 210 */ 15.911 + .long sys_getresgid 15.912 + .long sys_chown 15.913 + .long sys_setuid 15.914 + .long sys_setgid 15.915 + .long sys_setfsuid /* 215 */ 15.916 + .long sys_setfsgid 15.917 + .long sys_pivot_root 15.918 + .long sys_mincore 15.919 + .long sys_madvise 15.920 + .long sys_getdents64 /* 220 */ 15.921 + .long sys_fcntl64 15.922 + .long sys_ni_syscall /* reserved for TUX */ 15.923 + .long sys_ni_syscall 15.924 + .long sys_gettid 15.925 + .long sys_readahead /* 225 */ 15.926 + .long sys_setxattr 15.927 + .long sys_lsetxattr 15.928 + .long sys_fsetxattr 15.929 + .long sys_getxattr 15.930 + .long sys_lgetxattr /* 230 */ 15.931 + .long sys_fgetxattr 15.932 + .long sys_listxattr 15.933 + .long sys_llistxattr 15.934 + .long sys_flistxattr 15.935 + .long sys_removexattr /* 235 */ 15.936 + .long sys_lremovexattr 15.937 + .long sys_fremovexattr 15.938 + .long sys_tkill 15.939 + .long sys_sendfile64 15.940 + .long sys_futex /* 240 */ 15.941 + .long sys_sched_setaffinity 15.942 + .long sys_sched_getaffinity 15.943 + .long sys_set_thread_area 15.944 + .long sys_get_thread_area 15.945 + .long sys_io_setup /* 245 */ 15.946 + .long sys_io_destroy 15.947 + .long sys_io_getevents 15.948 + .long sys_io_submit 15.949 + .long sys_io_cancel 15.950 + .long sys_fadvise64 /* 250 */ 15.951 + .long sys_ni_syscall 15.952 + .long sys_exit_group 15.953 + .long sys_lookup_dcookie 15.954 + .long sys_epoll_create 15.955 + .long sys_epoll_ctl /* 255 */ 15.956 + .long sys_epoll_wait 15.957 + .long sys_remap_file_pages 15.958 + .long sys_set_tid_address 15.959 + .long sys_timer_create 15.960 + .long sys_timer_settime /* 260 */ 15.961 + .long sys_timer_gettime 15.962 + .long sys_timer_getoverrun 15.963 + .long sys_timer_delete 15.964 + .long sys_clock_settime 15.965 + .long sys_clock_gettime /* 265 */ 15.966 + .long sys_clock_getres 15.967 + .long sys_clock_nanosleep 15.968 + .long sys_statfs64 15.969 + .long sys_fstatfs64 15.970 + .long sys_tgkill /* 270 */ 15.971 + .long sys_utimes 15.972 + .long sys_fadvise64_64 15.973 + .long sys_ni_syscall /* sys_vserver */ 15.974 + .long sys_mbind 15.975 + .long sys_get_mempolicy 15.976 + .long sys_set_mempolicy 15.977 + .long sys_mq_open 15.978 + .long sys_mq_unlink 15.979 + .long sys_mq_timedsend 15.980 + .long sys_mq_timedreceive /* 280 */ 15.981 + .long sys_mq_notify 15.982 + .long sys_mq_getsetattr 15.983 + .long sys_ni_syscall /* reserved for kexec */ 15.984 + .long sys_waitid 15.985 + .long sys_ni_syscall /* 285 */ /* available */ 15.986 + .long sys_add_key 15.987 + .long sys_request_key 15.988 + .long sys_keyctl 15.989 + 15.990 +syscall_table_size=(.-sys_call_table)
16.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 16.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/head.S Fri Nov 19 23:17:26 2004 +0000 16.3 @@ -0,0 +1,167 @@ 16.4 + 16.5 +#include <linux/config.h> 16.6 + 16.7 +.section __xen_guest 16.8 + .ascii "GUEST_OS=linux,GUEST_VER=2.6,XEN_VER=2.0,VIRT_BASE=0xC0000000" 16.9 + .ascii ",LOADER=generic" 16.10 + .ascii ",PT_MODE_WRITABLE" 16.11 + .byte 0 16.12 + 16.13 +.text 16.14 +#include <linux/threads.h> 16.15 +#include <linux/linkage.h> 16.16 +#include <asm/segment.h> 16.17 +#include <asm/thread_info.h> 16.18 +#include <asm/asm_offsets.h> 16.19 +#include <asm-xen/xen-public/arch-x86_32.h> 16.20 + 16.21 +/* 16.22 + * References to members of the new_cpu_data structure. 16.23 + */ 16.24 + 16.25 +#define X86 new_cpu_data+CPUINFO_x86 16.26 +#define X86_VENDOR new_cpu_data+CPUINFO_x86_vendor 16.27 +#define X86_MODEL new_cpu_data+CPUINFO_x86_model 16.28 +#define X86_MASK new_cpu_data+CPUINFO_x86_mask 16.29 +#define X86_HARD_MATH new_cpu_data+CPUINFO_hard_math 16.30 +#define X86_CPUID new_cpu_data+CPUINFO_cpuid_level 16.31 +#define X86_CAPABILITY new_cpu_data+CPUINFO_x86_capability 16.32 +#define X86_VENDOR_ID new_cpu_data+CPUINFO_x86_vendor_id 16.33 + 16.34 +ENTRY(startup_32) 16.35 + cld 16.36 + 16.37 + /* Set up the stack pointer */ 16.38 + lss stack_start,%esp 16.39 + 16.40 + /* Copy the necessary stuff from xen_start_info structure. */ 16.41 + mov $xen_start_info_union,%edi 16.42 + mov $128,%ecx 16.43 + rep movsl 16.44 + 16.45 +checkCPUtype: 16.46 + 16.47 + /* get vendor info */ 16.48 + xorl %eax,%eax # call CPUID with 0 -> return vendor ID 16.49 + cpuid 16.50 + movl %eax,X86_CPUID # save CPUID level 16.51 + movl %ebx,X86_VENDOR_ID # lo 4 chars 16.52 + movl %edx,X86_VENDOR_ID+4 # next 4 chars 16.53 + movl %ecx,X86_VENDOR_ID+8 # last 4 chars 16.54 + 16.55 + movl $1,%eax # Use the CPUID instruction to get CPU type 16.56 + cpuid 16.57 + movb %al,%cl # save reg for future use 16.58 + andb $0x0f,%ah # mask processor family 16.59 + movb %ah,X86 16.60 + andb $0xf0,%al # mask model 16.61 + shrb $4,%al 16.62 + movb %al,X86_MODEL 16.63 + andb $0x0f,%cl # mask mask revision 16.64 + movb %cl,X86_MASK 16.65 + movl %edx,X86_CAPABILITY 16.66 + 16.67 + xorl %eax,%eax # Clear FS/GS and LDT 16.68 + movl %eax,%fs 16.69 + movl %eax,%gs 16.70 + cld # gcc2 wants the direction flag cleared at all times 16.71 + 16.72 + call start_kernel 16.73 +L6: 16.74 + jmp L6 # main should never return here, but 16.75 + # just in case, we know what happens. 16.76 + 16.77 +ENTRY(lgdt_finish) 16.78 + movl $(__KERNEL_DS),%eax # reload all the segment registers 16.79 + movw %ax,%ss # after changing gdt. 16.80 + 16.81 + movl $(__USER_DS),%eax # DS/ES contains default USER segment 16.82 + movw %ax,%ds 16.83 + movw %ax,%es 16.84 + 16.85 + popl %eax # reload CS by intersegment return 16.86 + pushl $(__KERNEL_CS) 16.87 + pushl %eax 16.88 + lret 16.89 + 16.90 +ENTRY(stack_start) 16.91 + .long init_thread_union+THREAD_SIZE 16.92 + .long __BOOT_DS 16.93 + 16.94 +.globl idt_descr 16.95 +.globl cpu_gdt_descr 16.96 + 16.97 + ALIGN 16.98 + .word 0 # 32-bit align idt_desc.address 16.99 +idt_descr: 16.100 + .word IDT_ENTRIES*8-1 # idt contains 256 entries 16.101 + .long idt_table 16.102 + 16.103 +# boot GDT descriptor (later on used by CPU#0): 16.104 + .word 0 # 32 bit align gdt_desc.address 16.105 +cpu_gdt_descr: 16.106 + .word GDT_SIZE 16.107 + .long cpu_gdt_table 16.108 + 16.109 + .fill NR_CPUS-1,8,0 # space for the other GDT descriptors 16.110 + 16.111 +.org 0x1000 16.112 +ENTRY(empty_zero_page) 16.113 + 16.114 +.org 0x2000 16.115 +ENTRY(swapper_pg_dir) 16.116 + 16.117 +.org 0x3000 16.118 +ENTRY(cpu_gdt_table) 16.119 + .quad 0x0000000000000000 /* NULL descriptor */ 16.120 + .quad 0x0000000000000000 /* 0x0b reserved */ 16.121 + .quad 0x0000000000000000 /* 0x13 reserved */ 16.122 + .quad 0x0000000000000000 /* 0x1b reserved */ 16.123 + .quad 0x0000000000000000 /* 0x20 unused */ 16.124 + .quad 0x0000000000000000 /* 0x28 unused */ 16.125 + .quad 0x0000000000000000 /* 0x33 TLS entry 1 */ 16.126 + .quad 0x0000000000000000 /* 0x3b TLS entry 2 */ 16.127 + .quad 0x0000000000000000 /* 0x43 TLS entry 3 */ 16.128 + .quad 0x0000000000000000 /* 0x4b reserved */ 16.129 + .quad 0x0000000000000000 /* 0x53 reserved */ 16.130 + .quad 0x0000000000000000 /* 0x5b reserved */ 16.131 + 16.132 + .quad 0x00cfbb000000c3ff /* 0x60 kernel 4GB code at 0x00000000 */ 16.133 + .quad 0x00cfb3000000c3ff /* 0x68 kernel 4GB data at 0x00000000 */ 16.134 + .quad 0x00cffb000000c3ff /* 0x73 user 4GB code at 0x00000000 */ 16.135 + .quad 0x00cff3000000c3ff /* 0x7b user 4GB data at 0x00000000 */ 16.136 + 16.137 + .quad 0x0000000000000000 /* 0x80 TSS descriptor */ 16.138 + .quad 0x0000000000000000 /* 0x88 LDT descriptor */ 16.139 + 16.140 + /* Segments used for calling PnP BIOS */ 16.141 + .quad 0x0000000000000000 /* 0x90 32-bit code */ 16.142 + .quad 0x0000000000000000 /* 0x98 16-bit code */ 16.143 + .quad 0x0000000000000000 /* 0xa0 16-bit data */ 16.144 + .quad 0x0000000000000000 /* 0xa8 16-bit data */ 16.145 + .quad 0x0000000000000000 /* 0xb0 16-bit data */ 16.146 + /* 16.147 + * The APM segments have byte granularity and their bases 16.148 + * and limits are set at run time. 16.149 + */ 16.150 + .quad 0x0000000000000000 /* 0xb8 APM CS code */ 16.151 + .quad 0x0000000000000000 /* 0xc0 APM CS 16 code (16 bit) */ 16.152 + .quad 0x0000000000000000 /* 0xc8 APM DS data */ 16.153 + 16.154 + .quad 0x0000000000000000 /* 0xd0 - unused */ 16.155 + .quad 0x0000000000000000 /* 0xd8 - unused */ 16.156 + .quad 0x0000000000000000 /* 0xe0 - unused */ 16.157 + .quad 0x0000000000000000 /* 0xe8 - unused */ 16.158 + .quad 0x0000000000000000 /* 0xf0 - unused */ 16.159 + .quad 0x0000000000000000 /* 0xf8 - GDT entry 31: double-fault TSS */ 16.160 + .fill GDT_ENTRIES-32,8,0 16.161 + 16.162 +.org 0x4000 16.163 +ENTRY(default_ldt) 16.164 + 16.165 +.org 0x5000 16.166 +/* 16.167 + * Real beginning of normal "text" segment 16.168 + */ 16.169 +ENTRY(stext) 16.170 +ENTRY(_stext)
17.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 17.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/i386_ksyms.c Fri Nov 19 23:17:26 2004 +0000 17.3 @@ -0,0 +1,196 @@ 17.4 +#include <linux/config.h> 17.5 +#include <linux/module.h> 17.6 +#include <linux/smp.h> 17.7 +#include <linux/user.h> 17.8 +#include <linux/elfcore.h> 17.9 +#include <linux/mca.h> 17.10 +#include <linux/sched.h> 17.11 +#include <linux/in6.h> 17.12 +#include <linux/interrupt.h> 17.13 +#include <linux/smp_lock.h> 17.14 +#include <linux/pm.h> 17.15 +#include <linux/pci.h> 17.16 +#include <linux/apm_bios.h> 17.17 +#include <linux/kernel.h> 17.18 +#include <linux/string.h> 17.19 +#include <linux/tty.h> 17.20 +#include <linux/highmem.h> 17.21 +#include <linux/time.h> 17.22 + 17.23 +#include <asm/semaphore.h> 17.24 +#include <asm/processor.h> 17.25 +#include <asm/i387.h> 17.26 +#include <asm/uaccess.h> 17.27 +#include <asm/checksum.h> 17.28 +#include <asm/io.h> 17.29 +#include <asm/delay.h> 17.30 +#include <asm/irq.h> 17.31 +#include <asm/mmx.h> 17.32 +#include <asm/desc.h> 17.33 +#include <asm/pgtable.h> 17.34 +#include <asm/tlbflush.h> 17.35 +#include <asm/nmi.h> 17.36 +#include <asm/ist.h> 17.37 +#include <asm/kdebug.h> 17.38 + 17.39 +extern void dump_thread(struct pt_regs *, struct user *); 17.40 +extern spinlock_t rtc_lock; 17.41 + 17.42 +/* This is definitely a GPL-only symbol */ 17.43 +EXPORT_SYMBOL_GPL(cpu_gdt_table); 17.44 + 17.45 +#if defined(CONFIG_APM_MODULE) 17.46 +extern void machine_real_restart(unsigned char *, int); 17.47 +EXPORT_SYMBOL(machine_real_restart); 17.48 +extern void default_idle(void); 17.49 +EXPORT_SYMBOL(default_idle); 17.50 +#endif 17.51 + 17.52 +#ifdef CONFIG_SMP 17.53 +extern void FASTCALL( __write_lock_failed(rwlock_t *rw)); 17.54 +extern void FASTCALL( __read_lock_failed(rwlock_t *rw)); 17.55 +#endif 17.56 + 17.57 +#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_HD) || defined(CONFIG_BLK_DEV_IDE_MODULE) || defined(CONFIG_BLK_DEV_HD_MODULE) 17.58 +extern struct drive_info_struct drive_info; 17.59 +EXPORT_SYMBOL(drive_info); 17.60 +#endif 17.61 + 17.62 +extern unsigned long cpu_khz; 17.63 +extern unsigned long get_cmos_time(void); 17.64 + 17.65 +/* platform dependent support */ 17.66 +EXPORT_SYMBOL(boot_cpu_data); 17.67 +EXPORT_SYMBOL(MCA_bus); 17.68 +#ifdef CONFIG_DISCONTIGMEM 17.69 +EXPORT_SYMBOL(node_data); 17.70 +EXPORT_SYMBOL(physnode_map); 17.71 +#endif 17.72 +#ifdef CONFIG_X86_NUMAQ 17.73 +EXPORT_SYMBOL(xquad_portio); 17.74 +#endif 17.75 +EXPORT_SYMBOL(dump_thread); 17.76 +EXPORT_SYMBOL(dump_fpu); 17.77 +EXPORT_SYMBOL_GPL(kernel_fpu_begin); 17.78 +EXPORT_SYMBOL(__ioremap); 17.79 +EXPORT_SYMBOL(ioremap_nocache); 17.80 +EXPORT_SYMBOL(iounmap); 17.81 +EXPORT_SYMBOL(probe_irq_mask); 17.82 +EXPORT_SYMBOL(kernel_thread); 17.83 +EXPORT_SYMBOL(pm_idle); 17.84 +#ifdef CONFIG_APM 17.85 +EXPORT_SYMBOL(pm_power_off); 17.86 +#endif 17.87 +EXPORT_SYMBOL(get_cmos_time); 17.88 +EXPORT_SYMBOL(cpu_khz); 17.89 +EXPORT_SYMBOL(apm_info); 17.90 + 17.91 +EXPORT_SYMBOL(__down_failed); 17.92 +EXPORT_SYMBOL(__down_failed_interruptible); 17.93 +EXPORT_SYMBOL(__down_failed_trylock); 17.94 +EXPORT_SYMBOL(__up_wakeup); 17.95 +/* Networking helper routines. */ 17.96 +EXPORT_SYMBOL(csum_partial_copy_generic); 17.97 +/* Delay loops */ 17.98 +EXPORT_SYMBOL(__ndelay); 17.99 +EXPORT_SYMBOL(__udelay); 17.100 +EXPORT_SYMBOL(__delay); 17.101 +EXPORT_SYMBOL(__const_udelay); 17.102 + 17.103 +EXPORT_SYMBOL(__get_user_1); 17.104 +EXPORT_SYMBOL(__get_user_2); 17.105 +EXPORT_SYMBOL(__get_user_4); 17.106 + 17.107 +EXPORT_SYMBOL(strpbrk); 17.108 +EXPORT_SYMBOL(strstr); 17.109 + 17.110 +EXPORT_SYMBOL(strncpy_from_user); 17.111 +EXPORT_SYMBOL(__strncpy_from_user); 17.112 +EXPORT_SYMBOL(clear_user); 17.113 +EXPORT_SYMBOL(__clear_user); 17.114 +EXPORT_SYMBOL(__copy_from_user_ll); 17.115 +EXPORT_SYMBOL(__copy_to_user_ll); 17.116 +EXPORT_SYMBOL(strnlen_user); 17.117 + 17.118 +EXPORT_SYMBOL(dma_alloc_coherent); 17.119 +EXPORT_SYMBOL(dma_free_coherent); 17.120 + 17.121 +#ifdef CONFIG_PCI 17.122 +EXPORT_SYMBOL(pcibios_penalize_isa_irq); 17.123 +EXPORT_SYMBOL(pci_mem_start); 17.124 +#endif 17.125 + 17.126 +#ifdef CONFIG_PCI_BIOS 17.127 +EXPORT_SYMBOL(pcibios_set_irq_routing); 17.128 +EXPORT_SYMBOL(pcibios_get_irq_routing_table); 17.129 +#endif 17.130 + 17.131 +#ifdef CONFIG_X86_USE_3DNOW 17.132 +EXPORT_SYMBOL(_mmx_memcpy); 17.133 +EXPORT_SYMBOL(mmx_clear_page); 17.134 +EXPORT_SYMBOL(mmx_copy_page); 17.135 +#endif 17.136 + 17.137 +#ifdef CONFIG_X86_HT 17.138 +EXPORT_SYMBOL(smp_num_siblings); 17.139 +EXPORT_SYMBOL(cpu_sibling_map); 17.140 +#endif 17.141 + 17.142 +#ifdef CONFIG_SMP 17.143 +EXPORT_SYMBOL(cpu_data); 17.144 +EXPORT_SYMBOL(cpu_online_map); 17.145 +EXPORT_SYMBOL(cpu_callout_map); 17.146 +EXPORT_SYMBOL(__write_lock_failed); 17.147 +EXPORT_SYMBOL(__read_lock_failed); 17.148 + 17.149 +/* Global SMP stuff */ 17.150 +EXPORT_SYMBOL(smp_call_function); 17.151 + 17.152 +/* TLB flushing */ 17.153 +EXPORT_SYMBOL(flush_tlb_page); 17.154 +EXPORT_SYMBOL_GPL(flush_tlb_all); 17.155 +#endif 17.156 + 17.157 +#ifdef CONFIG_X86_IO_APIC 17.158 +EXPORT_SYMBOL(IO_APIC_get_PCI_irq_vector); 17.159 +#endif 17.160 + 17.161 +#ifdef CONFIG_MCA 17.162 +EXPORT_SYMBOL(machine_id); 17.163 +#endif 17.164 + 17.165 +#ifdef CONFIG_VT 17.166 +EXPORT_SYMBOL(screen_info); 17.167 +#endif 17.168 + 17.169 +EXPORT_SYMBOL(get_wchan); 17.170 + 17.171 +EXPORT_SYMBOL(rtc_lock); 17.172 + 17.173 +EXPORT_SYMBOL_GPL(set_nmi_callback); 17.174 +EXPORT_SYMBOL_GPL(unset_nmi_callback); 17.175 + 17.176 +#undef memcmp 17.177 +extern int memcmp(const void *,const void *,__kernel_size_t); 17.178 +EXPORT_SYMBOL(memcmp); 17.179 + 17.180 +EXPORT_SYMBOL(register_die_notifier); 17.181 +#ifdef CONFIG_HAVE_DEC_LOCK 17.182 +EXPORT_SYMBOL(_atomic_dec_and_lock); 17.183 +#endif 17.184 + 17.185 +EXPORT_SYMBOL(__PAGE_KERNEL); 17.186 + 17.187 +#ifdef CONFIG_HIGHMEM 17.188 +EXPORT_SYMBOL(kmap); 17.189 +EXPORT_SYMBOL(kunmap); 17.190 +EXPORT_SYMBOL(kmap_atomic); 17.191 +EXPORT_SYMBOL(kunmap_atomic); 17.192 +EXPORT_SYMBOL(kmap_atomic_to_page); 17.193 +#endif 17.194 + 17.195 +#if defined(CONFIG_X86_SPEEDSTEP_SMI) || defined(CONFIG_X86_SPEEDSTEP_SMI_MODULE) 17.196 +EXPORT_SYMBOL(ist_info); 17.197 +#endif 17.198 + 17.199 +EXPORT_SYMBOL(csum_partial);
18.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 18.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/ioport.c Fri Nov 19 23:17:26 2004 +0000 18.3 @@ -0,0 +1,51 @@ 18.4 +#include <linux/sched.h> 18.5 +#include <linux/kernel.h> 18.6 +#include <linux/errno.h> 18.7 +#include <linux/types.h> 18.8 +#include <linux/ioport.h> 18.9 +#include <linux/mm.h> 18.10 +#include <linux/smp.h> 18.11 +#include <linux/smp_lock.h> 18.12 +#include <linux/stddef.h> 18.13 +#include <linux/slab.h> 18.14 +#include <asm-xen/xen-public/dom0_ops.h> 18.15 + 18.16 +asmlinkage long sys_iopl(unsigned int new_io_pl) 18.17 +{ 18.18 + unsigned int old_io_pl = current->thread.io_pl; 18.19 + dom0_op_t op; 18.20 + 18.21 + if (new_io_pl > 3) 18.22 + return -EINVAL; 18.23 + 18.24 + /* Need "raw I/O" privileges for direct port access. */ 18.25 + if ((new_io_pl > old_io_pl) && !capable(CAP_SYS_RAWIO)) 18.26 + return -EPERM; 18.27 + 18.28 + if (!(xen_start_info.flags & SIF_PRIVILEGED)) 18.29 + return -EPERM; 18.30 + 18.31 + /* Maintain OS privileges even if user attempts to relinquish them. */ 18.32 + if (new_io_pl == 0) 18.33 + new_io_pl = 1; 18.34 + 18.35 + /* Change our version of the privilege levels. */ 18.36 + current->thread.io_pl = new_io_pl; 18.37 + 18.38 + /* Force the change at ring 0. */ 18.39 + op.cmd = DOM0_IOPL; 18.40 + op.u.iopl.domain = DOMID_SELF; 18.41 + op.u.iopl.iopl = new_io_pl; 18.42 + HYPERVISOR_dom0_op(&op); 18.43 + 18.44 + return 0; 18.45 +} 18.46 + 18.47 +asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on) 18.48 +{ 18.49 +#if 0 18.50 + printk(KERN_INFO "ioperm not fully supported - %s\n", 18.51 + turn_on ? "set iopl to 3" : "ignore resource release"); 18.52 +#endif 18.53 + return turn_on ? sys_iopl(3) : 0; 18.54 +}
19.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 19.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/ldt.c Fri Nov 19 23:17:26 2004 +0000 19.3 @@ -0,0 +1,270 @@ 19.4 +/* 19.5 + * linux/kernel/ldt.c 19.6 + * 19.7 + * Copyright (C) 1992 Krishna Balasubramanian and Linus Torvalds 19.8 + * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com> 19.9 + */ 19.10 + 19.11 +#include <linux/errno.h> 19.12 +#include <linux/sched.h> 19.13 +#include <linux/string.h> 19.14 +#include <linux/mm.h> 19.15 +#include <linux/smp.h> 19.16 +#include <linux/smp_lock.h> 19.17 +#include <linux/vmalloc.h> 19.18 +#include <linux/slab.h> 19.19 + 19.20 +#include <asm/uaccess.h> 19.21 +#include <asm/system.h> 19.22 +#include <asm/ldt.h> 19.23 +#include <asm/desc.h> 19.24 + 19.25 +#ifdef CONFIG_SMP /* avoids "defined but not used" warnig */ 19.26 +static void flush_ldt(void *null) 19.27 +{ 19.28 + if (current->active_mm) { 19.29 + load_LDT(¤t->active_mm->context); 19.30 + flush_page_update_queue(); 19.31 + } 19.32 +} 19.33 +#endif 19.34 + 19.35 +static int alloc_ldt(mm_context_t *pc, int mincount, int reload) 19.36 +{ 19.37 + void *oldldt; 19.38 + void *newldt; 19.39 + int oldsize; 19.40 + 19.41 + if (mincount <= pc->size) 19.42 + return 0; 19.43 + oldsize = pc->size; 19.44 + mincount = (mincount+511)&(~511); 19.45 + if (mincount*LDT_ENTRY_SIZE > PAGE_SIZE) 19.46 + newldt = vmalloc(mincount*LDT_ENTRY_SIZE); 19.47 + else 19.48 + newldt = kmalloc(mincount*LDT_ENTRY_SIZE, GFP_KERNEL); 19.49 + 19.50 + if (!newldt) 19.51 + return -ENOMEM; 19.52 + 19.53 + if (oldsize) 19.54 + memcpy(newldt, pc->ldt, oldsize*LDT_ENTRY_SIZE); 19.55 + oldldt = pc->ldt; 19.56 + memset(newldt+oldsize*LDT_ENTRY_SIZE, 0, (mincount-oldsize)*LDT_ENTRY_SIZE); 19.57 + pc->ldt = newldt; 19.58 + wmb(); 19.59 + pc->size = mincount; 19.60 + wmb(); 19.61 + 19.62 + if (reload) { 19.63 +#ifdef CONFIG_SMP 19.64 + cpumask_t mask; 19.65 + preempt_disable(); 19.66 +#endif 19.67 + make_pages_readonly(pc->ldt, (pc->size * LDT_ENTRY_SIZE) / 19.68 + PAGE_SIZE); 19.69 + load_LDT(pc); 19.70 + flush_page_update_queue(); 19.71 +#ifdef CONFIG_SMP 19.72 + mask = cpumask_of_cpu(smp_processor_id()); 19.73 + if (!cpus_equal(current->mm->cpu_vm_mask, mask)) 19.74 + smp_call_function(flush_ldt, NULL, 1, 1); 19.75 + preempt_enable(); 19.76 +#endif 19.77 + } 19.78 + if (oldsize) { 19.79 + make_pages_writable(oldldt, (oldsize * LDT_ENTRY_SIZE) / 19.80 + PAGE_SIZE); 19.81 + flush_page_update_queue(); 19.82 + if (oldsize*LDT_ENTRY_SIZE > PAGE_SIZE) 19.83 + vfree(oldldt); 19.84 + else 19.85 + kfree(oldldt); 19.86 + } 19.87 + return 0; 19.88 +} 19.89 + 19.90 +static inline int copy_ldt(mm_context_t *new, mm_context_t *old) 19.91 +{ 19.92 + int err = alloc_ldt(new, old->size, 0); 19.93 + if (err < 0) 19.94 + return err; 19.95 + memcpy(new->ldt, old->ldt, old->size*LDT_ENTRY_SIZE); 19.96 + make_pages_readonly(new->ldt, (new->size * LDT_ENTRY_SIZE) / 19.97 + PAGE_SIZE); 19.98 + flush_page_update_queue(); 19.99 + return 0; 19.100 +} 19.101 + 19.102 +/* 19.103 + * we do not have to muck with descriptors here, that is 19.104 + * done in switch_mm() as needed. 19.105 + */ 19.106 +int init_new_context(struct task_struct *tsk, struct mm_struct *mm) 19.107 +{ 19.108 + struct mm_struct * old_mm; 19.109 + int retval = 0; 19.110 + 19.111 + init_MUTEX(&mm->context.sem); 19.112 + mm->context.size = 0; 19.113 + old_mm = current->mm; 19.114 + if (old_mm && old_mm->context.size > 0) { 19.115 + down(&old_mm->context.sem); 19.116 + retval = copy_ldt(&mm->context, &old_mm->context); 19.117 + up(&old_mm->context.sem); 19.118 + } 19.119 + return retval; 19.120 +} 19.121 + 19.122 +/* 19.123 + * No need to lock the MM as we are the last user 19.124 + */ 19.125 +void destroy_context(struct mm_struct *mm) 19.126 +{ 19.127 + if (mm->context.size) { 19.128 + if (mm == current->active_mm) 19.129 + clear_LDT(); 19.130 + make_pages_writable(mm->context.ldt, 19.131 + (mm->context.size * LDT_ENTRY_SIZE) / 19.132 + PAGE_SIZE); 19.133 + flush_page_update_queue(); 19.134 + if (mm->context.size*LDT_ENTRY_SIZE > PAGE_SIZE) 19.135 + vfree(mm->context.ldt); 19.136 + else 19.137 + kfree(mm->context.ldt); 19.138 + mm->context.size = 0; 19.139 + } 19.140 +} 19.141 + 19.142 +static int read_ldt(void __user * ptr, unsigned long bytecount) 19.143 +{ 19.144 + int err; 19.145 + unsigned long size; 19.146 + struct mm_struct * mm = current->mm; 19.147 + 19.148 + if (!mm->context.size) 19.149 + return 0; 19.150 + if (bytecount > LDT_ENTRY_SIZE*LDT_ENTRIES) 19.151 + bytecount = LDT_ENTRY_SIZE*LDT_ENTRIES; 19.152 + 19.153 + down(&mm->context.sem); 19.154 + size = mm->context.size*LDT_ENTRY_SIZE; 19.155 + if (size > bytecount) 19.156 + size = bytecount; 19.157 + 19.158 + err = 0; 19.159 + if (copy_to_user(ptr, mm->context.ldt, size)) 19.160 + err = -EFAULT; 19.161 + up(&mm->context.sem); 19.162 + if (err < 0) 19.163 + goto error_return; 19.164 + if (size != bytecount) { 19.165 + /* zero-fill the rest */ 19.166 + if (clear_user(ptr+size, bytecount-size) != 0) { 19.167 + err = -EFAULT; 19.168 + goto error_return; 19.169 + } 19.170 + } 19.171 + return bytecount; 19.172 +error_return: 19.173 + return err; 19.174 +} 19.175 + 19.176 +static int read_default_ldt(void __user * ptr, unsigned long bytecount) 19.177 +{ 19.178 + int err; 19.179 + unsigned long size; 19.180 + void *address; 19.181 + 19.182 + err = 0; 19.183 + address = &default_ldt[0]; 19.184 + size = 5*sizeof(struct desc_struct); 19.185 + if (size > bytecount) 19.186 + size = bytecount; 19.187 + 19.188 + err = size; 19.189 + if (copy_to_user(ptr, address, size)) 19.190 + err = -EFAULT; 19.191 + 19.192 + return err; 19.193 +} 19.194 + 19.195 +static int write_ldt(void __user * ptr, unsigned long bytecount, int oldmode) 19.196 +{ 19.197 + struct mm_struct * mm = current->mm; 19.198 + __u32 entry_1, entry_2, *lp; 19.199 + unsigned long phys_lp; 19.200 + int error; 19.201 + struct user_desc ldt_info; 19.202 + 19.203 + error = -EINVAL; 19.204 + if (bytecount != sizeof(ldt_info)) 19.205 + goto out; 19.206 + error = -EFAULT; 19.207 + if (copy_from_user(&ldt_info, ptr, sizeof(ldt_info))) 19.208 + goto out; 19.209 + 19.210 + error = -EINVAL; 19.211 + if (ldt_info.entry_number >= LDT_ENTRIES) 19.212 + goto out; 19.213 + if (ldt_info.contents == 3) { 19.214 + if (oldmode) 19.215 + goto out; 19.216 + if (ldt_info.seg_not_present == 0) 19.217 + goto out; 19.218 + } 19.219 + 19.220 + down(&mm->context.sem); 19.221 + if (ldt_info.entry_number >= mm->context.size) { 19.222 + error = alloc_ldt(¤t->mm->context, ldt_info.entry_number+1, 1); 19.223 + if (error < 0) 19.224 + goto out_unlock; 19.225 + } 19.226 + 19.227 + lp = (__u32 *) ((ldt_info.entry_number << 3) + (char *) mm->context.ldt); 19.228 + phys_lp = arbitrary_virt_to_phys(lp); 19.229 + 19.230 + /* Allow LDTs to be cleared by the user. */ 19.231 + if (ldt_info.base_addr == 0 && ldt_info.limit == 0) { 19.232 + if (oldmode || LDT_empty(&ldt_info)) { 19.233 + entry_1 = 0; 19.234 + entry_2 = 0; 19.235 + goto install; 19.236 + } 19.237 + } 19.238 + 19.239 + entry_1 = LDT_entry_a(&ldt_info); 19.240 + entry_2 = LDT_entry_b(&ldt_info); 19.241 + if (oldmode) 19.242 + entry_2 &= ~(1 << 20); 19.243 + 19.244 + /* Install the new entry ... */ 19.245 +install: 19.246 + error = HYPERVISOR_update_descriptor(phys_lp, entry_1, entry_2); 19.247 + 19.248 +out_unlock: 19.249 + up(&mm->context.sem); 19.250 +out: 19.251 + return error; 19.252 +} 19.253 + 19.254 +asmlinkage int sys_modify_ldt(int func, void __user *ptr, unsigned long bytecount) 19.255 +{ 19.256 + int ret = -ENOSYS; 19.257 + 19.258 + switch (func) { 19.259 + case 0: 19.260 + ret = read_ldt(ptr, bytecount); 19.261 + break; 19.262 + case 1: 19.263 + ret = write_ldt(ptr, bytecount, 1); 19.264 + break; 19.265 + case 2: 19.266 + ret = read_default_ldt(ptr, bytecount); 19.267 + break; 19.268 + case 0x11: 19.269 + ret = write_ldt(ptr, bytecount, 0); 19.270 + break; 19.271 + } 19.272 + return ret; 19.273 +}
20.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 20.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/pci-dma.c Fri Nov 19 23:17:26 2004 +0000 20.3 @@ -0,0 +1,226 @@ 20.4 +/* 20.5 + * Dynamic DMA mapping support. 20.6 + * 20.7 + * On i386 there is no hardware dynamic DMA address translation, 20.8 + * so consistent alloc/free are merely page allocation/freeing. 20.9 + * The rest of the dynamic DMA mapping interface is implemented 20.10 + * in asm/pci.h. 20.11 + */ 20.12 + 20.13 +#include <linux/types.h> 20.14 +#include <linux/mm.h> 20.15 +#include <linux/string.h> 20.16 +#include <linux/pci.h> 20.17 +#include <linux/version.h> 20.18 +#include <asm/io.h> 20.19 + 20.20 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) 20.21 +#define pte_offset_kernel pte_offset 20.22 +#endif 20.23 + 20.24 +struct dma_coherent_mem { 20.25 + void *virt_base; 20.26 + u32 device_base; 20.27 + int size; 20.28 + int flags; 20.29 + unsigned long *bitmap; 20.30 +}; 20.31 + 20.32 +static void 20.33 +xen_contig_memory(unsigned long vstart, unsigned int order) 20.34 +{ 20.35 + /* 20.36 + * Ensure multi-page extents are contiguous in machine memory. 20.37 + * This code could be cleaned up some, and the number of 20.38 + * hypercalls reduced. 20.39 + */ 20.40 + pgd_t *pgd; 20.41 + pmd_t *pmd; 20.42 + pte_t *pte; 20.43 + unsigned long pfn, i; 20.44 + 20.45 + scrub_pages(vstart, 1 << order); 20.46 + /* 1. Zap current PTEs, giving away the underlying pages. */ 20.47 + for (i = 0; i < (1<<order); i++) { 20.48 + pgd = pgd_offset_k( (vstart + (i*PAGE_SIZE))); 20.49 + pmd = pmd_offset(pgd, (vstart + (i*PAGE_SIZE))); 20.50 + pte = pte_offset_kernel(pmd, (vstart + (i*PAGE_SIZE))); 20.51 + pfn = pte->pte_low >> PAGE_SHIFT; 20.52 + queue_l1_entry_update(pte, 0); 20.53 + phys_to_machine_mapping[(__pa(vstart)>>PAGE_SHIFT)+i] = 20.54 + INVALID_P2M_ENTRY; 20.55 + flush_page_update_queue(); 20.56 + if (HYPERVISOR_dom_mem_op(MEMOP_decrease_reservation, 20.57 + &pfn, 1, 0) != 1) BUG(); 20.58 + } 20.59 + /* 2. Get a new contiguous memory extent. */ 20.60 + if (HYPERVISOR_dom_mem_op(MEMOP_increase_reservation, 20.61 + &pfn, 1, order) != 1) BUG(); 20.62 + /* 3. Map the new extent in place of old pages. */ 20.63 + for (i = 0; i < (1<<order); i++) { 20.64 + pgd = pgd_offset_k( (vstart + (i*PAGE_SIZE))); 20.65 + pmd = pmd_offset(pgd, (vstart + (i*PAGE_SIZE))); 20.66 + pte = pte_offset_kernel(pmd, (vstart + (i*PAGE_SIZE))); 20.67 + queue_l1_entry_update( 20.68 + pte, ((pfn+i)<<PAGE_SHIFT)|__PAGE_KERNEL); 20.69 + queue_machphys_update( 20.70 + pfn+i, (__pa(vstart)>>PAGE_SHIFT)+i); 20.71 + phys_to_machine_mapping[(__pa(vstart)>>PAGE_SHIFT)+i] = 20.72 + pfn+i; 20.73 + } 20.74 + /* Flush updates through and flush the TLB. */ 20.75 + xen_tlb_flush(); 20.76 +} 20.77 + 20.78 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) 20.79 +void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size, 20.80 + dma_addr_t *dma_handle) 20.81 +#else 20.82 +void *dma_alloc_coherent(struct device *dev, size_t size, 20.83 + dma_addr_t *dma_handle, int gfp) 20.84 +#endif 20.85 +{ 20.86 + void *ret; 20.87 + unsigned int order = get_order(size); 20.88 + unsigned long vstart; 20.89 + 20.90 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) 20.91 + int gfp = GFP_ATOMIC; 20.92 + 20.93 + if (hwdev == NULL || ((u32)hwdev->dma_mask < 0xffffffff)) 20.94 + gfp |= GFP_DMA; 20.95 +#else 20.96 + struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL; 20.97 + 20.98 + /* ignore region specifiers */ 20.99 + gfp &= ~(__GFP_DMA | __GFP_HIGHMEM); 20.100 + 20.101 + if (mem) { 20.102 + int page = bitmap_find_free_region(mem->bitmap, mem->size, 20.103 + order); 20.104 + if (page >= 0) { 20.105 + *dma_handle = mem->device_base + (page << PAGE_SHIFT); 20.106 + ret = mem->virt_base + (page << PAGE_SHIFT); 20.107 + memset(ret, 0, size); 20.108 + return ret; 20.109 + } 20.110 + if (mem->flags & DMA_MEMORY_EXCLUSIVE) 20.111 + return NULL; 20.112 + } 20.113 + 20.114 + if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff)) 20.115 + gfp |= GFP_DMA; 20.116 +#endif 20.117 + 20.118 + vstart = __get_free_pages(gfp, order); 20.119 + ret = (void *)vstart; 20.120 + if (ret == NULL) 20.121 + return ret; 20.122 + 20.123 + xen_contig_memory(vstart, order); 20.124 + 20.125 + memset(ret, 0, size); 20.126 + *dma_handle = virt_to_bus(ret); 20.127 + 20.128 + return ret; 20.129 +} 20.130 + 20.131 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) 20.132 +void pci_free_consistent(struct pci_dev *hwdev, size_t size, 20.133 + void *vaddr, dma_addr_t dma_handle) 20.134 +{ 20.135 + free_pages((unsigned long)vaddr, get_order(size)); 20.136 +} 20.137 +#else 20.138 + 20.139 +void dma_free_coherent(struct device *dev, size_t size, 20.140 + void *vaddr, dma_addr_t dma_handle) 20.141 +{ 20.142 + struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL; 20.143 + int order = get_order(size); 20.144 + 20.145 + if (mem && vaddr >= mem->virt_base && vaddr < (mem->virt_base + (mem->size << PAGE_SHIFT))) { 20.146 + int page = (vaddr - mem->virt_base) >> PAGE_SHIFT; 20.147 + 20.148 + bitmap_release_region(mem->bitmap, page, order); 20.149 + } else 20.150 + free_pages((unsigned long)vaddr, order); 20.151 +} 20.152 + 20.153 +int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr, 20.154 + dma_addr_t device_addr, size_t size, int flags) 20.155 +{ 20.156 + void __iomem *mem_base; 20.157 + int pages = size >> PAGE_SHIFT; 20.158 + int bitmap_size = (pages + 31)/32; 20.159 + 20.160 + if ((flags & (DMA_MEMORY_MAP | DMA_MEMORY_IO)) == 0) 20.161 + goto out; 20.162 + if (!size) 20.163 + goto out; 20.164 + if (dev->dma_mem) 20.165 + goto out; 20.166 + 20.167 + /* FIXME: this routine just ignores DMA_MEMORY_INCLUDES_CHILDREN */ 20.168 + 20.169 + mem_base = ioremap(bus_addr, size); 20.170 + if (!mem_base) 20.171 + goto out; 20.172 + 20.173 + dev->dma_mem = kmalloc(GFP_KERNEL, sizeof(struct dma_coherent_mem)); 20.174 + if (!dev->dma_mem) 20.175 + goto out; 20.176 + memset(dev->dma_mem, 0, sizeof(struct dma_coherent_mem)); 20.177 + dev->dma_mem->bitmap = kmalloc(GFP_KERNEL, bitmap_size); 20.178 + if (!dev->dma_mem->bitmap) 20.179 + goto free1_out; 20.180 + memset(dev->dma_mem->bitmap, 0, bitmap_size); 20.181 + 20.182 + dev->dma_mem->virt_base = mem_base; 20.183 + dev->dma_mem->device_base = device_addr; 20.184 + dev->dma_mem->size = pages; 20.185 + dev->dma_mem->flags = flags; 20.186 + 20.187 + if (flags & DMA_MEMORY_MAP) 20.188 + return DMA_MEMORY_MAP; 20.189 + 20.190 + return DMA_MEMORY_IO; 20.191 + 20.192 + free1_out: 20.193 + kfree(dev->dma_mem->bitmap); 20.194 + out: 20.195 + return 0; 20.196 +} 20.197 +EXPORT_SYMBOL(dma_declare_coherent_memory); 20.198 + 20.199 +void dma_release_declared_memory(struct device *dev) 20.200 +{ 20.201 + struct dma_coherent_mem *mem = dev->dma_mem; 20.202 + 20.203 + if(!mem) 20.204 + return; 20.205 + dev->dma_mem = NULL; 20.206 + kfree(mem->bitmap); 20.207 + kfree(mem); 20.208 +} 20.209 +EXPORT_SYMBOL(dma_release_declared_memory); 20.210 + 20.211 +void *dma_mark_declared_memory_occupied(struct device *dev, 20.212 + dma_addr_t device_addr, size_t size) 20.213 +{ 20.214 + struct dma_coherent_mem *mem = dev->dma_mem; 20.215 + int pages = (size + (device_addr & ~PAGE_MASK) + PAGE_SIZE - 1) >> PAGE_SHIFT; 20.216 + int pos, err; 20.217 + 20.218 + if (!mem) 20.219 + return ERR_PTR(-EINVAL); 20.220 + 20.221 + pos = (device_addr - mem->device_base) >> PAGE_SHIFT; 20.222 + err = bitmap_allocate_region(mem->bitmap, pos, get_order(pages)); 20.223 + if (err != 0) 20.224 + return ERR_PTR(err); 20.225 + return mem->virt_base + (pos << PAGE_SHIFT); 20.226 +} 20.227 +EXPORT_SYMBOL(dma_mark_declared_memory_occupied); 20.228 + 20.229 +#endif
21.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 21.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/process.c Fri Nov 19 23:17:26 2004 +0000 21.3 @@ -0,0 +1,776 @@ 21.4 +/* 21.5 + * linux/arch/i386/kernel/process.c 21.6 + * 21.7 + * Copyright (C) 1995 Linus Torvalds 21.8 + * 21.9 + * Pentium III FXSR, SSE support 21.10 + * Gareth Hughes <gareth@valinux.com>, May 2000 21.11 + */ 21.12 + 21.13 +/* 21.14 + * This file handles the architecture-dependent parts of process handling.. 21.15 + */ 21.16 + 21.17 +#include <stdarg.h> 21.18 + 21.19 +#include <linux/errno.h> 21.20 +#include <linux/sched.h> 21.21 +#include <linux/fs.h> 21.22 +#include <linux/kernel.h> 21.23 +#include <linux/mm.h> 21.24 +#include <linux/elfcore.h> 21.25 +#include <linux/smp.h> 21.26 +#include <linux/smp_lock.h> 21.27 +#include <linux/stddef.h> 21.28 +#include <linux/slab.h> 21.29 +#include <linux/vmalloc.h> 21.30 +#include <linux/user.h> 21.31 +#include <linux/a.out.h> 21.32 +#include <linux/interrupt.h> 21.33 +#include <linux/config.h> 21.34 +#include <linux/utsname.h> 21.35 +#include <linux/delay.h> 21.36 +#include <linux/reboot.h> 21.37 +#include <linux/init.h> 21.38 +#include <linux/mc146818rtc.h> 21.39 +#include <linux/module.h> 21.40 +#include <linux/kallsyms.h> 21.41 +#include <linux/ptrace.h> 21.42 + 21.43 +#include <asm/uaccess.h> 21.44 +#include <asm/pgtable.h> 21.45 +#include <asm/system.h> 21.46 +#include <asm/io.h> 21.47 +#include <asm/ldt.h> 21.48 +#include <asm/processor.h> 21.49 +#include <asm/i387.h> 21.50 +#include <asm/irq.h> 21.51 +#include <asm/desc.h> 21.52 +#include <asm-xen/multicall.h> 21.53 +#include <asm-xen/xen-public/dom0_ops.h> 21.54 +#ifdef CONFIG_MATH_EMULATION 21.55 +#include <asm/math_emu.h> 21.56 +#endif 21.57 + 21.58 +#include <linux/irq.h> 21.59 +#include <linux/err.h> 21.60 + 21.61 +asmlinkage void ret_from_fork(void) __asm__("ret_from_fork"); 21.62 + 21.63 +int hlt_counter; 21.64 + 21.65 +unsigned long boot_option_idle_override = 0; 21.66 +EXPORT_SYMBOL(boot_option_idle_override); 21.67 + 21.68 +/* 21.69 + * Return saved PC of a blocked thread. 21.70 + */ 21.71 +unsigned long thread_saved_pc(struct task_struct *tsk) 21.72 +{ 21.73 + return ((unsigned long *)tsk->thread.esp)[3]; 21.74 +} 21.75 + 21.76 +/* 21.77 + * Powermanagement idle function, if any.. 21.78 + */ 21.79 +void (*pm_idle)(void); 21.80 + 21.81 +void disable_hlt(void) 21.82 +{ 21.83 + hlt_counter++; 21.84 +} 21.85 + 21.86 +EXPORT_SYMBOL(disable_hlt); 21.87 + 21.88 +void enable_hlt(void) 21.89 +{ 21.90 + hlt_counter--; 21.91 +} 21.92 + 21.93 +EXPORT_SYMBOL(enable_hlt); 21.94 + 21.95 +/* XXX XEN doesn't use default_idle(), poll_idle(). Use xen_idle() instead. */ 21.96 +extern int set_timeout_timer(void); 21.97 +void xen_idle(void) 21.98 +{ 21.99 + int cpu = smp_processor_id(); 21.100 + 21.101 + local_irq_disable(); 21.102 + 21.103 + if (rcu_pending(cpu)) 21.104 + rcu_check_callbacks(cpu, 0); 21.105 + 21.106 + if (need_resched()) { 21.107 + local_irq_enable(); 21.108 + } else if (set_timeout_timer() == 0) { 21.109 + /* NB. Blocking reenable events in a race-free manner. */ 21.110 + HYPERVISOR_block(); 21.111 + } else { 21.112 + local_irq_enable(); 21.113 + HYPERVISOR_yield(); 21.114 + } 21.115 +} 21.116 + 21.117 +/* 21.118 + * The idle thread. There's no useful work to be 21.119 + * done, so just try to conserve power and have a 21.120 + * low exit latency (ie sit in a loop waiting for 21.121 + * somebody to say that they'd like to reschedule) 21.122 + */ 21.123 +void cpu_idle (void) 21.124 +{ 21.125 + /* endless idle loop with no priority at all */ 21.126 + while (1) { 21.127 + while (!need_resched()) { 21.128 + /* 21.129 + * Mark this as an RCU critical section so that 21.130 + * synchronize_kernel() in the unload path waits 21.131 + * for our completion. 21.132 + */ 21.133 + rcu_read_lock(); 21.134 + irq_stat[smp_processor_id()].idle_timestamp = jiffies; 21.135 + xen_idle(); 21.136 + rcu_read_unlock(); 21.137 + } 21.138 + schedule(); 21.139 + } 21.140 +} 21.141 + 21.142 +/* XXX XEN doesn't use mwait_idle(), select_idle_routine(), idle_setup(). */ 21.143 +/* Always use xen_idle() instead. */ 21.144 +void __init select_idle_routine(const struct cpuinfo_x86 *c) {} 21.145 + 21.146 +void show_regs(struct pt_regs * regs) 21.147 +{ 21.148 + printk("\n"); 21.149 + printk("Pid: %d, comm: %20s\n", current->pid, current->comm); 21.150 + printk("EIP: %04x:[<%08lx>] CPU: %d\n",0xffff & regs->xcs,regs->eip, smp_processor_id()); 21.151 + print_symbol("EIP is at %s\n", regs->eip); 21.152 + 21.153 + if (regs->xcs & 2) 21.154 + printk(" ESP: %04x:%08lx",0xffff & regs->xss,regs->esp); 21.155 + printk(" EFLAGS: %08lx %s (%s)\n", 21.156 + regs->eflags, print_tainted(),UTS_RELEASE); 21.157 + printk("EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n", 21.158 + regs->eax,regs->ebx,regs->ecx,regs->edx); 21.159 + printk("ESI: %08lx EDI: %08lx EBP: %08lx", 21.160 + regs->esi, regs->edi, regs->ebp); 21.161 + printk(" DS: %04x ES: %04x\n", 21.162 + 0xffff & regs->xds,0xffff & regs->xes); 21.163 + 21.164 + show_trace(NULL, ®s->esp); 21.165 +} 21.166 + 21.167 +/* 21.168 + * This gets run with %ebx containing the 21.169 + * function to call, and %edx containing 21.170 + * the "args". 21.171 + */ 21.172 +extern void kernel_thread_helper(void); 21.173 +__asm__(".section .text\n" 21.174 + ".align 4\n" 21.175 + "kernel_thread_helper:\n\t" 21.176 + "movl %edx,%eax\n\t" 21.177 + "pushl %edx\n\t" 21.178 + "call *%ebx\n\t" 21.179 + "pushl %eax\n\t" 21.180 + "call do_exit\n" 21.181 + ".previous"); 21.182 + 21.183 +/* 21.184 + * Create a kernel thread 21.185 + */ 21.186 +int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) 21.187 +{ 21.188 + struct pt_regs regs; 21.189 + 21.190 + memset(®s, 0, sizeof(regs)); 21.191 + 21.192 + regs.ebx = (unsigned long) fn; 21.193 + regs.edx = (unsigned long) arg; 21.194 + 21.195 + regs.xds = __USER_DS; 21.196 + regs.xes = __USER_DS; 21.197 + regs.orig_eax = -1; 21.198 + regs.eip = (unsigned long) kernel_thread_helper; 21.199 + regs.xcs = __KERNEL_CS; 21.200 + regs.eflags = X86_EFLAGS_IF | X86_EFLAGS_SF | X86_EFLAGS_PF | 0x2; 21.201 + 21.202 + /* Ok, create the new process.. */ 21.203 + return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); 21.204 +} 21.205 + 21.206 +/* 21.207 + * Free current thread data structures etc.. 21.208 + */ 21.209 +void exit_thread(void) 21.210 +{ 21.211 + struct task_struct *tsk = current; 21.212 + struct thread_struct *t = &tsk->thread; 21.213 + 21.214 + /* The process may have allocated an io port bitmap... nuke it. */ 21.215 + if (unlikely(NULL != t->io_bitmap_ptr)) { 21.216 + int cpu = get_cpu(); 21.217 + struct tss_struct *tss = &per_cpu(init_tss, cpu); 21.218 + 21.219 + kfree(t->io_bitmap_ptr); 21.220 + t->io_bitmap_ptr = NULL; 21.221 + /* 21.222 + * Careful, clear this in the TSS too: 21.223 + */ 21.224 + memset(tss->io_bitmap, 0xff, tss->io_bitmap_max); 21.225 + t->io_bitmap_max = 0; 21.226 + tss->io_bitmap_owner = NULL; 21.227 + tss->io_bitmap_max = 0; 21.228 + tss->io_bitmap_base = INVALID_IO_BITMAP_OFFSET; 21.229 + put_cpu(); 21.230 + } 21.231 +} 21.232 + 21.233 +void flush_thread(void) 21.234 +{ 21.235 + struct task_struct *tsk = current; 21.236 + 21.237 + memset(tsk->thread.debugreg, 0, sizeof(unsigned long)*8); 21.238 + memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array)); 21.239 + /* 21.240 + * Forget coprocessor state.. 21.241 + */ 21.242 + clear_fpu(tsk); 21.243 + tsk->used_math = 0; 21.244 +} 21.245 + 21.246 +void release_thread(struct task_struct *dead_task) 21.247 +{ 21.248 + if (dead_task->mm) { 21.249 + // temporary debugging check 21.250 + if (dead_task->mm->context.size) { 21.251 + printk("WARNING: dead process %8s still has LDT? <%p/%d>\n", 21.252 + dead_task->comm, 21.253 + dead_task->mm->context.ldt, 21.254 + dead_task->mm->context.size); 21.255 + BUG(); 21.256 + } 21.257 + } 21.258 + 21.259 + release_vm86_irqs(dead_task); 21.260 +} 21.261 + 21.262 +/* 21.263 + * This gets called before we allocate a new thread and copy 21.264 + * the current task into it. 21.265 + */ 21.266 +void prepare_to_copy(struct task_struct *tsk) 21.267 +{ 21.268 + unlazy_fpu(tsk); 21.269 +} 21.270 + 21.271 +int copy_thread(int nr, unsigned long clone_flags, unsigned long esp, 21.272 + unsigned long unused, 21.273 + struct task_struct * p, struct pt_regs * regs) 21.274 +{ 21.275 + struct pt_regs * childregs; 21.276 + struct task_struct *tsk; 21.277 + int err; 21.278 + unsigned long eflags; 21.279 + 21.280 + childregs = ((struct pt_regs *) (THREAD_SIZE + (unsigned long) p->thread_info)) - 1; 21.281 + *childregs = *regs; 21.282 + childregs->eax = 0; 21.283 + childregs->esp = esp; 21.284 + 21.285 + p->thread.esp = (unsigned long) childregs; 21.286 + p->thread.esp0 = (unsigned long) (childregs+1); 21.287 + 21.288 + p->thread.eip = (unsigned long) ret_from_fork; 21.289 + 21.290 + savesegment(fs,p->thread.fs); 21.291 + savesegment(gs,p->thread.gs); 21.292 + 21.293 + tsk = current; 21.294 + if (unlikely(NULL != tsk->thread.io_bitmap_ptr)) { 21.295 + p->thread.io_bitmap_ptr = kmalloc(IO_BITMAP_BYTES, GFP_KERNEL); 21.296 + if (!p->thread.io_bitmap_ptr) { 21.297 + p->thread.io_bitmap_max = 0; 21.298 + return -ENOMEM; 21.299 + } 21.300 + memcpy(p->thread.io_bitmap_ptr, tsk->thread.io_bitmap_ptr, 21.301 + IO_BITMAP_BYTES); 21.302 + } 21.303 + 21.304 + /* 21.305 + * Set a new TLS for the child thread? 21.306 + */ 21.307 + if (clone_flags & CLONE_SETTLS) { 21.308 + struct desc_struct *desc; 21.309 + struct user_desc info; 21.310 + int idx; 21.311 + 21.312 + err = -EFAULT; 21.313 + if (copy_from_user(&info, (void __user *)childregs->esi, sizeof(info))) 21.314 + goto out; 21.315 + err = -EINVAL; 21.316 + if (LDT_empty(&info)) 21.317 + goto out; 21.318 + 21.319 + idx = info.entry_number; 21.320 + if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX) 21.321 + goto out; 21.322 + 21.323 + desc = p->thread.tls_array + idx - GDT_ENTRY_TLS_MIN; 21.324 + desc->a = LDT_entry_a(&info); 21.325 + desc->b = LDT_entry_b(&info); 21.326 + } 21.327 + 21.328 + 21.329 + __asm__ __volatile__ ( "pushfl; popl %0" : "=r" (eflags) : ); 21.330 + p->thread.io_pl = (eflags >> 12) & 3; 21.331 + 21.332 + err = 0; 21.333 + out: 21.334 + if (err && p->thread.io_bitmap_ptr) { 21.335 + kfree(p->thread.io_bitmap_ptr); 21.336 + p->thread.io_bitmap_max = 0; 21.337 + } 21.338 + return err; 21.339 +} 21.340 + 21.341 +/* 21.342 + * fill in the user structure for a core dump.. 21.343 + */ 21.344 +void dump_thread(struct pt_regs * regs, struct user * dump) 21.345 +{ 21.346 + int i; 21.347 + 21.348 +/* changed the size calculations - should hopefully work better. lbt */ 21.349 + dump->magic = CMAGIC; 21.350 + dump->start_code = 0; 21.351 + dump->start_stack = regs->esp & ~(PAGE_SIZE - 1); 21.352 + dump->u_tsize = ((unsigned long) current->mm->end_code) >> PAGE_SHIFT; 21.353 + dump->u_dsize = ((unsigned long) (current->mm->brk + (PAGE_SIZE-1))) >> PAGE_SHIFT; 21.354 + dump->u_dsize -= dump->u_tsize; 21.355 + dump->u_ssize = 0; 21.356 + for (i = 0; i < 8; i++) 21.357 + dump->u_debugreg[i] = current->thread.debugreg[i]; 21.358 + 21.359 + if (dump->start_stack < TASK_SIZE) 21.360 + dump->u_ssize = ((unsigned long) (TASK_SIZE - dump->start_stack)) >> PAGE_SHIFT; 21.361 + 21.362 + dump->regs.ebx = regs->ebx; 21.363 + dump->regs.ecx = regs->ecx; 21.364 + dump->regs.edx = regs->edx; 21.365 + dump->regs.esi = regs->esi; 21.366 + dump->regs.edi = regs->edi; 21.367 + dump->regs.ebp = regs->ebp; 21.368 + dump->regs.eax = regs->eax; 21.369 + dump->regs.ds = regs->xds; 21.370 + dump->regs.es = regs->xes; 21.371 + savesegment(fs,dump->regs.fs); 21.372 + savesegment(gs,dump->regs.gs); 21.373 + dump->regs.orig_eax = regs->orig_eax; 21.374 + dump->regs.eip = regs->eip; 21.375 + dump->regs.cs = regs->xcs; 21.376 + dump->regs.eflags = regs->eflags; 21.377 + dump->regs.esp = regs->esp; 21.378 + dump->regs.ss = regs->xss; 21.379 + 21.380 + dump->u_fpvalid = dump_fpu (regs, &dump->i387); 21.381 +} 21.382 + 21.383 +/* 21.384 + * Capture the user space registers if the task is not running (in user space) 21.385 + */ 21.386 +int dump_task_regs(struct task_struct *tsk, elf_gregset_t *regs) 21.387 +{ 21.388 + struct pt_regs ptregs; 21.389 + 21.390 + ptregs = *(struct pt_regs *) 21.391 + ((unsigned long)tsk->thread_info+THREAD_SIZE - sizeof(ptregs)); 21.392 + ptregs.xcs &= 0xffff; 21.393 + ptregs.xds &= 0xffff; 21.394 + ptregs.xes &= 0xffff; 21.395 + ptregs.xss &= 0xffff; 21.396 + 21.397 + elf_core_copy_regs(regs, &ptregs); 21.398 + 21.399 + boot_option_idle_override = 1; 21.400 + return 1; 21.401 +} 21.402 + 21.403 +static inline void 21.404 +handle_io_bitmap(struct thread_struct *next, struct tss_struct *tss) 21.405 +{ 21.406 + if (!next->io_bitmap_ptr) { 21.407 + /* 21.408 + * Disable the bitmap via an invalid offset. We still cache 21.409 + * the previous bitmap owner and the IO bitmap contents: 21.410 + */ 21.411 + tss->io_bitmap_base = INVALID_IO_BITMAP_OFFSET; 21.412 + return; 21.413 + } 21.414 + if (likely(next == tss->io_bitmap_owner)) { 21.415 + /* 21.416 + * Previous owner of the bitmap (hence the bitmap content) 21.417 + * matches the next task, we dont have to do anything but 21.418 + * to set a valid offset in the TSS: 21.419 + */ 21.420 + tss->io_bitmap_base = IO_BITMAP_OFFSET; 21.421 + return; 21.422 + } 21.423 + /* 21.424 + * Lazy TSS's I/O bitmap copy. We set an invalid offset here 21.425 + * and we let the task to get a GPF in case an I/O instruction 21.426 + * is performed. The handler of the GPF will verify that the 21.427 + * faulting task has a valid I/O bitmap and, it true, does the 21.428 + * real copy and restart the instruction. This will save us 21.429 + * redundant copies when the currently switched task does not 21.430 + * perform any I/O during its timeslice. 21.431 + */ 21.432 + tss->io_bitmap_base = INVALID_IO_BITMAP_OFFSET_LAZY; 21.433 +} 21.434 +/* 21.435 + * This special macro can be used to load a debugging register 21.436 + */ 21.437 +#define loaddebug(thread,register) \ 21.438 + HYPERVISOR_set_debugreg((register), \ 21.439 + (thread->debugreg[register])) 21.440 + 21.441 +/* 21.442 + * switch_to(x,yn) should switch tasks from x to y. 21.443 + * 21.444 + * We fsave/fwait so that an exception goes off at the right time 21.445 + * (as a call from the fsave or fwait in effect) rather than to 21.446 + * the wrong process. Lazy FP saving no longer makes any sense 21.447 + * with modern CPU's, and this simplifies a lot of things (SMP 21.448 + * and UP become the same). 21.449 + * 21.450 + * NOTE! We used to use the x86 hardware context switching. The 21.451 + * reason for not using it any more becomes apparent when you 21.452 + * try to recover gracefully from saved state that is no longer 21.453 + * valid (stale segment register values in particular). With the 21.454 + * hardware task-switch, there is no way to fix up bad state in 21.455 + * a reasonable manner. 21.456 + * 21.457 + * The fact that Intel documents the hardware task-switching to 21.458 + * be slow is a fairly red herring - this code is not noticeably 21.459 + * faster. However, there _is_ some room for improvement here, 21.460 + * so the performance issues may eventually be a valid point. 21.461 + * More important, however, is the fact that this allows us much 21.462 + * more flexibility. 21.463 + * 21.464 + * The return value (in %eax) will be the "prev" task after 21.465 + * the task-switch, and shows up in ret_from_fork in entry.S, 21.466 + * for example. 21.467 + */ 21.468 +struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct task_struct *next_p) 21.469 +{ 21.470 + struct thread_struct *prev = &prev_p->thread, 21.471 + *next = &next_p->thread; 21.472 + int cpu = smp_processor_id(); 21.473 + struct tss_struct *tss = &per_cpu(init_tss, cpu); 21.474 + dom0_op_t op; 21.475 + 21.476 + /* NB. No need to disable interrupts as already done in sched.c */ 21.477 + /* __cli(); */ 21.478 + 21.479 + /* 21.480 + * Save away %fs and %gs. No need to save %es and %ds, as 21.481 + * those are always kernel segments while inside the kernel. 21.482 + */ 21.483 + asm volatile("movl %%fs,%0":"=m" (*(int *)&prev->fs)); 21.484 + asm volatile("movl %%gs,%0":"=m" (*(int *)&prev->gs)); 21.485 + 21.486 + /* 21.487 + * We clobber FS and GS here so that we avoid a GPF when 21.488 + * restoring previous task's FS/GS values in Xen when the LDT 21.489 + * is switched. If we don't do this then we can end up 21.490 + * erroneously re-flushing the page-update queue when we 21.491 + * 'execute_multicall_list'. 21.492 + */ 21.493 + __asm__ __volatile__ ( 21.494 + "xorl %%eax,%%eax; movl %%eax,%%fs; movl %%eax,%%gs" : : : 21.495 + "eax" ); 21.496 + 21.497 + MULTICALL_flush_page_update_queue(); 21.498 + 21.499 + /* never put a printk in __switch_to... printk() calls wake_up*() indirectly */ 21.500 + 21.501 + /* 21.502 + * This is basically '__unlazy_fpu', except that we queue a 21.503 + * multicall to indicate FPU task switch, rather than 21.504 + * synchronously trapping to Xen. 21.505 + */ 21.506 + if (prev_p->thread_info->status & TS_USEDFPU) { 21.507 + save_init_fpu(prev_p); 21.508 + queue_multicall0(__HYPERVISOR_fpu_taskswitch); 21.509 + } 21.510 + 21.511 + /* 21.512 + * Reload esp0, LDT and the page table pointer: 21.513 + * This is load_esp0(tss, next) with a multicall. 21.514 + */ 21.515 + tss->esp0 = next->esp0; 21.516 + /* This can only happen when SEP is enabled, no need to test 21.517 + * "SEP"arately */ 21.518 + if (unlikely(tss->ss1 != next->sysenter_cs)) { 21.519 + tss->ss1 = next->sysenter_cs; 21.520 + wrmsr(MSR_IA32_SYSENTER_CS, next->sysenter_cs, 0); 21.521 + } 21.522 + queue_multicall2(__HYPERVISOR_stack_switch, tss->ss0, tss->esp0); 21.523 + 21.524 + /* 21.525 + * Load the per-thread Thread-Local Storage descriptor. 21.526 + * This is load_TLS(next, cpu) with multicalls. 21.527 + */ 21.528 +#define C(i) do { \ 21.529 + if (unlikely(next->tls_array[i].a != prev->tls_array[i].a || \ 21.530 + next->tls_array[i].b != prev->tls_array[i].b)) \ 21.531 + queue_multicall3(__HYPERVISOR_update_descriptor, \ 21.532 + virt_to_machine(&get_cpu_gdt_table(cpu) \ 21.533 + [GDT_ENTRY_TLS_MIN + i]), \ 21.534 + ((u32 *)&next->tls_array[i])[0], \ 21.535 + ((u32 *)&next->tls_array[i])[1]); \ 21.536 +} while (0) 21.537 + C(0); C(1); C(2); 21.538 +#undef C 21.539 + 21.540 + if (xen_start_info.flags & SIF_PRIVILEGED) { 21.541 + op.cmd = DOM0_IOPL; 21.542 + op.u.iopl.domain = DOMID_SELF; 21.543 + op.u.iopl.iopl = next->io_pl; 21.544 + queue_multicall1(__HYPERVISOR_dom0_op, (unsigned long)&op); 21.545 + } 21.546 + 21.547 + /* EXECUTE ALL TASK SWITCH XEN SYSCALLS AT THIS POINT. */ 21.548 + execute_multicall_list(); 21.549 + /* __sti(); */ 21.550 + 21.551 + /* 21.552 + * Restore %fs and %gs if needed. 21.553 + */ 21.554 + if (unlikely(prev->fs | prev->gs | next->fs | next->gs)) { 21.555 + loadsegment(fs, next->fs); 21.556 + loadsegment(gs, next->gs); 21.557 + } 21.558 + 21.559 + /* 21.560 + * Now maybe reload the debug registers 21.561 + */ 21.562 + if (unlikely(next->debugreg[7])) { 21.563 + loaddebug(next, 0); 21.564 + loaddebug(next, 1); 21.565 + loaddebug(next, 2); 21.566 + loaddebug(next, 3); 21.567 + /* no 4 and 5 */ 21.568 + loaddebug(next, 6); 21.569 + loaddebug(next, 7); 21.570 + } 21.571 + 21.572 + if (unlikely(prev->io_bitmap_ptr || next->io_bitmap_ptr)) 21.573 + handle_io_bitmap(next, tss); 21.574 + 21.575 + return prev_p; 21.576 +} 21.577 + 21.578 +asmlinkage int sys_fork(struct pt_regs regs) 21.579 +{ 21.580 + return do_fork(SIGCHLD, regs.esp, ®s, 0, NULL, NULL); 21.581 +} 21.582 + 21.583 +asmlinkage int sys_clone(struct pt_regs regs) 21.584 +{ 21.585 + unsigned long clone_flags; 21.586 + unsigned long newsp; 21.587 + int __user *parent_tidptr, *child_tidptr; 21.588 + 21.589 + clone_flags = regs.ebx; 21.590 + newsp = regs.ecx; 21.591 + parent_tidptr = (int __user *)regs.edx; 21.592 + child_tidptr = (int __user *)regs.edi; 21.593 + if (!newsp) 21.594 + newsp = regs.esp; 21.595 + return do_fork(clone_flags, newsp, ®s, 0, parent_tidptr, child_tidptr); 21.596 +} 21.597 + 21.598 +/* 21.599 + * This is trivial, and on the face of it looks like it 21.600 + * could equally well be done in user mode. 21.601 + * 21.602 + * Not so, for quite unobvious reasons - register pressure. 21.603 + * In user mode vfork() cannot have a stack frame, and if 21.604 + * done by calling the "clone()" system call directly, you 21.605 + * do not have enough call-clobbered registers to hold all 21.606 + * the information you need. 21.607 + */ 21.608 +asmlinkage int sys_vfork(struct pt_regs regs) 21.609 +{ 21.610 + return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs.esp, ®s, 0, NULL, NULL); 21.611 +} 21.612 + 21.613 +/* 21.614 + * sys_execve() executes a new program. 21.615 + */ 21.616 +asmlinkage int sys_execve(struct pt_regs regs) 21.617 +{ 21.618 + int error; 21.619 + char * filename; 21.620 + 21.621 + filename = getname((char __user *) regs.ebx); 21.622 + error = PTR_ERR(filename); 21.623 + if (IS_ERR(filename)) 21.624 + goto out; 21.625 + error = do_execve(filename, 21.626 + (char __user * __user *) regs.ecx, 21.627 + (char __user * __user *) regs.edx, 21.628 + ®s); 21.629 + if (error == 0) { 21.630 + task_lock(current); 21.631 + current->ptrace &= ~PT_DTRACE; 21.632 + task_unlock(current); 21.633 + /* Make sure we don't return using sysenter.. */ 21.634 + set_thread_flag(TIF_IRET); 21.635 + } 21.636 + putname(filename); 21.637 +out: 21.638 + return error; 21.639 +} 21.640 + 21.641 +#define top_esp (THREAD_SIZE - sizeof(unsigned long)) 21.642 +#define top_ebp (THREAD_SIZE - 2*sizeof(unsigned long)) 21.643 + 21.644 +unsigned long get_wchan(struct task_struct *p) 21.645 +{ 21.646 + unsigned long ebp, esp, eip; 21.647 + unsigned long stack_page; 21.648 + int count = 0; 21.649 + if (!p || p == current || p->state == TASK_RUNNING) 21.650 + return 0; 21.651 + stack_page = (unsigned long)p->thread_info; 21.652 + esp = p->thread.esp; 21.653 + if (!stack_page || esp < stack_page || esp > top_esp+stack_page) 21.654 + return 0; 21.655 + /* include/asm-i386/system.h:switch_to() pushes ebp last. */ 21.656 + ebp = *(unsigned long *) esp; 21.657 + do { 21.658 + if (ebp < stack_page || ebp > top_ebp+stack_page) 21.659 + return 0; 21.660 + eip = *(unsigned long *) (ebp+4); 21.661 + if (!in_sched_functions(eip)) 21.662 + return eip; 21.663 + ebp = *(unsigned long *) ebp; 21.664 + } while (count++ < 16); 21.665 + return 0; 21.666 +} 21.667 + 21.668 +/* 21.669 + * sys_alloc_thread_area: get a yet unused TLS descriptor index. 21.670 + */ 21.671 +static int get_free_idx(void) 21.672 +{ 21.673 + struct thread_struct *t = ¤t->thread; 21.674 + int idx; 21.675 + 21.676 + for (idx = 0; idx < GDT_ENTRY_TLS_ENTRIES; idx++) 21.677 + if (desc_empty(t->tls_array + idx)) 21.678 + return idx + GDT_ENTRY_TLS_MIN; 21.679 + return -ESRCH; 21.680 +} 21.681 + 21.682 +/* 21.683 + * Set a given TLS descriptor: 21.684 + */ 21.685 +asmlinkage int sys_set_thread_area(struct user_desc __user *u_info) 21.686 +{ 21.687 + struct thread_struct *t = ¤t->thread; 21.688 + struct user_desc info; 21.689 + struct desc_struct *desc; 21.690 + int cpu, idx; 21.691 + 21.692 + if (copy_from_user(&info, u_info, sizeof(info))) 21.693 + return -EFAULT; 21.694 + idx = info.entry_number; 21.695 + 21.696 + /* 21.697 + * index -1 means the kernel should try to find and 21.698 + * allocate an empty descriptor: 21.699 + */ 21.700 + if (idx == -1) { 21.701 + idx = get_free_idx(); 21.702 + if (idx < 0) 21.703 + return idx; 21.704 + if (put_user(idx, &u_info->entry_number)) 21.705 + return -EFAULT; 21.706 + } 21.707 + 21.708 + if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX) 21.709 + return -EINVAL; 21.710 + 21.711 + desc = t->tls_array + idx - GDT_ENTRY_TLS_MIN; 21.712 + 21.713 + /* 21.714 + * We must not get preempted while modifying the TLS. 21.715 + */ 21.716 + cpu = get_cpu(); 21.717 + 21.718 + if (LDT_empty(&info)) { 21.719 + desc->a = 0; 21.720 + desc->b = 0; 21.721 + } else { 21.722 + desc->a = LDT_entry_a(&info); 21.723 + desc->b = LDT_entry_b(&info); 21.724 + } 21.725 + load_TLS(t, cpu); 21.726 + 21.727 + put_cpu(); 21.728 + 21.729 + return 0; 21.730 +} 21.731 + 21.732 +/* 21.733 + * Get the current Thread-Local Storage area: 21.734 + */ 21.735 + 21.736 +#define GET_BASE(desc) ( \ 21.737 + (((desc)->a >> 16) & 0x0000ffff) | \ 21.738 + (((desc)->b << 16) & 0x00ff0000) | \ 21.739 + ( (desc)->b & 0xff000000) ) 21.740 + 21.741 +#define GET_LIMIT(desc) ( \ 21.742 + ((desc)->a & 0x0ffff) | \ 21.743 + ((desc)->b & 0xf0000) ) 21.744 + 21.745 +#define GET_32BIT(desc) (((desc)->b >> 22) & 1) 21.746 +#define GET_CONTENTS(desc) (((desc)->b >> 10) & 3) 21.747 +#define GET_WRITABLE(desc) (((desc)->b >> 9) & 1) 21.748 +#define GET_LIMIT_PAGES(desc) (((desc)->b >> 23) & 1) 21.749 +#define GET_PRESENT(desc) (((desc)->b >> 15) & 1) 21.750 +#define GET_USEABLE(desc) (((desc)->b >> 20) & 1) 21.751 + 21.752 +asmlinkage int sys_get_thread_area(struct user_desc __user *u_info) 21.753 +{ 21.754 + struct user_desc info; 21.755 + struct desc_struct *desc; 21.756 + int idx; 21.757 + 21.758 + if (get_user(idx, &u_info->entry_number)) 21.759 + return -EFAULT; 21.760 + if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX) 21.761 + return -EINVAL; 21.762 + 21.763 + desc = current->thread.tls_array + idx - GDT_ENTRY_TLS_MIN; 21.764 + 21.765 + info.entry_number = idx; 21.766 + info.base_addr = GET_BASE(desc); 21.767 + info.limit = GET_LIMIT(desc); 21.768 + info.seg_32bit = GET_32BIT(desc); 21.769 + info.contents = GET_CONTENTS(desc); 21.770 + info.read_exec_only = !GET_WRITABLE(desc); 21.771 + info.limit_in_pages = GET_LIMIT_PAGES(desc); 21.772 + info.seg_not_present = !GET_PRESENT(desc); 21.773 + info.useable = GET_USEABLE(desc); 21.774 + 21.775 + if (copy_to_user(u_info, &info, sizeof(info))) 21.776 + return -EFAULT; 21.777 + return 0; 21.778 +} 21.779 +
22.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 22.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/setup.c Fri Nov 19 23:17:26 2004 +0000 22.3 @@ -0,0 +1,1509 @@ 22.4 +/* 22.5 + * linux/arch/i386/kernel/setup.c 22.6 + * 22.7 + * Copyright (C) 1995 Linus Torvalds 22.8 + * 22.9 + * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999 22.10 + * 22.11 + * Memory region support 22.12 + * David Parsons <orc@pell.chi.il.us>, July-August 1999 22.13 + * 22.14 + * Added E820 sanitization routine (removes overlapping memory regions); 22.15 + * Brian Moyle <bmoyle@mvista.com>, February 2001 22.16 + * 22.17 + * Moved CPU detection code to cpu/${cpu}.c 22.18 + * Patrick Mochel <mochel@osdl.org>, March 2002 22.19 + * 22.20 + * Provisions for empty E820 memory regions (reported by certain BIOSes). 22.21 + * Alex Achenbach <xela@slit.de>, December 2002. 22.22 + * 22.23 + */ 22.24 + 22.25 +/* 22.26 + * This file handles the architecture-dependent parts of initialization 22.27 + */ 22.28 + 22.29 +#include <linux/sched.h> 22.30 +#include <linux/mm.h> 22.31 +#include <linux/tty.h> 22.32 +#include <linux/ioport.h> 22.33 +#include <linux/acpi.h> 22.34 +#include <linux/apm_bios.h> 22.35 +#include <linux/initrd.h> 22.36 +#include <linux/bootmem.h> 22.37 +#include <linux/seq_file.h> 22.38 +#include <linux/console.h> 22.39 +#include <linux/root_dev.h> 22.40 +#include <linux/highmem.h> 22.41 +#include <linux/module.h> 22.42 +#include <linux/efi.h> 22.43 +#include <linux/init.h> 22.44 +#include <linux/edd.h> 22.45 +#include <video/edid.h> 22.46 +#include <asm/e820.h> 22.47 +#include <asm/mpspec.h> 22.48 +#include <asm/setup.h> 22.49 +#include <asm/arch_hooks.h> 22.50 +#include <asm/sections.h> 22.51 +#include <asm/io_apic.h> 22.52 +#include <asm/ist.h> 22.53 +#include <asm/io.h> 22.54 +#include <asm-xen/hypervisor.h> 22.55 +#include "setup_arch_pre.h" 22.56 +#include <bios_ebda.h> 22.57 + 22.58 +int disable_pse __initdata = 0; 22.59 + 22.60 +/* 22.61 + * Machine setup.. 22.62 + */ 22.63 + 22.64 +#ifdef CONFIG_EFI 22.65 +int efi_enabled = 0; 22.66 +EXPORT_SYMBOL(efi_enabled); 22.67 +#endif 22.68 + 22.69 +/* cpu data as detected by the assembly code in head.S */ 22.70 +struct cpuinfo_x86 new_cpu_data __initdata = { 0, 0, 0, 0, -1, 0, 1, 0, -1 }; 22.71 +/* common cpu data for all cpus */ 22.72 +struct cpuinfo_x86 boot_cpu_data = { 0, 0, 0, 0, -1, 0, 1, 0, -1 }; 22.73 + 22.74 +unsigned long mmu_cr4_features; 22.75 +EXPORT_SYMBOL_GPL(mmu_cr4_features); 22.76 + 22.77 +#ifdef CONFIG_ACPI_INTERPRETER 22.78 + int acpi_disabled = 0; 22.79 +#else 22.80 + int acpi_disabled = 1; 22.81 +#endif 22.82 +EXPORT_SYMBOL(acpi_disabled); 22.83 + 22.84 +#ifdef CONFIG_ACPI_BOOT 22.85 +int __initdata acpi_force = 0; 22.86 +extern acpi_interrupt_flags acpi_sci_flags; 22.87 +#endif 22.88 + 22.89 +int MCA_bus; 22.90 +/* for MCA, but anyone else can use it if they want */ 22.91 +unsigned int machine_id; 22.92 +unsigned int machine_submodel_id; 22.93 +unsigned int BIOS_revision; 22.94 +unsigned int mca_pentium_flag; 22.95 + 22.96 +/* For PCI or other memory-mapped resources */ 22.97 +unsigned long pci_mem_start = 0x10000000; 22.98 + 22.99 +/* user-defined highmem size */ 22.100 +static unsigned int highmem_pages = -1; 22.101 + 22.102 +/* 22.103 + * Setup options 22.104 + */ 22.105 +struct drive_info_struct { char dummy[32]; } drive_info; 22.106 +struct screen_info screen_info; 22.107 +struct apm_info apm_info; 22.108 +struct sys_desc_table_struct { 22.109 + unsigned short length; 22.110 + unsigned char table[0]; 22.111 +}; 22.112 +struct edid_info edid_info; 22.113 +struct ist_info ist_info; 22.114 +struct e820map e820; 22.115 + 22.116 +unsigned char aux_device_present; 22.117 + 22.118 +extern void early_cpu_init(void); 22.119 +extern void dmi_scan_machine(void); 22.120 +extern void generic_apic_probe(char *); 22.121 +extern int root_mountflags; 22.122 + 22.123 +unsigned long saved_videomode; 22.124 + 22.125 +#define RAMDISK_IMAGE_START_MASK 0x07FF 22.126 +#define RAMDISK_PROMPT_FLAG 0x8000 22.127 +#define RAMDISK_LOAD_FLAG 0x4000 22.128 + 22.129 +static char command_line[COMMAND_LINE_SIZE]; 22.130 + 22.131 +unsigned char __initdata boot_params[PARAM_SIZE]; 22.132 + 22.133 +static struct resource data_resource = { 22.134 + .name = "Kernel data", 22.135 + .start = 0, 22.136 + .end = 0, 22.137 + .flags = IORESOURCE_BUSY | IORESOURCE_MEM 22.138 +}; 22.139 + 22.140 +static struct resource code_resource = { 22.141 + .name = "Kernel code", 22.142 + .start = 0, 22.143 + .end = 0, 22.144 + .flags = IORESOURCE_BUSY | IORESOURCE_MEM 22.145 +}; 22.146 + 22.147 +#ifdef CONFIG_XEN_PRIVILEGED_GUEST 22.148 +static struct resource system_rom_resource = { 22.149 + .name = "System ROM", 22.150 + .start = 0xf0000, 22.151 + .end = 0xfffff, 22.152 + .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM 22.153 +}; 22.154 + 22.155 +static struct resource extension_rom_resource = { 22.156 + .name = "Extension ROM", 22.157 + .start = 0xe0000, 22.158 + .end = 0xeffff, 22.159 + .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM 22.160 +}; 22.161 + 22.162 +static struct resource adapter_rom_resources[] = { { 22.163 + .name = "Adapter ROM", 22.164 + .start = 0xc8000, 22.165 + .end = 0, 22.166 + .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM 22.167 +}, { 22.168 + .name = "Adapter ROM", 22.169 + .start = 0, 22.170 + .end = 0, 22.171 + .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM 22.172 +}, { 22.173 + .name = "Adapter ROM", 22.174 + .start = 0, 22.175 + .end = 0, 22.176 + .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM 22.177 +}, { 22.178 + .name = "Adapter ROM", 22.179 + .start = 0, 22.180 + .end = 0, 22.181 + .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM 22.182 +}, { 22.183 + .name = "Adapter ROM", 22.184 + .start = 0, 22.185 + .end = 0, 22.186 + .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM 22.187 +}, { 22.188 + .name = "Adapter ROM", 22.189 + .start = 0, 22.190 + .end = 0, 22.191 + .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM 22.192 +} }; 22.193 + 22.194 +#define ADAPTER_ROM_RESOURCES \ 22.195 + (sizeof adapter_rom_resources / sizeof adapter_rom_resources[0]) 22.196 + 22.197 +static struct resource video_rom_resource = { 22.198 + .name = "Video ROM", 22.199 + .start = 0xc0000, 22.200 + .end = 0xc7fff, 22.201 + .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM 22.202 +}; 22.203 +#endif 22.204 + 22.205 +static struct resource video_ram_resource = { 22.206 + .name = "Video RAM area", 22.207 + .start = 0xa0000, 22.208 + .end = 0xbffff, 22.209 + .flags = IORESOURCE_BUSY | IORESOURCE_MEM 22.210 +}; 22.211 + 22.212 +static struct resource standard_io_resources[] = { { 22.213 + .name = "dma1", 22.214 + .start = 0x0000, 22.215 + .end = 0x001f, 22.216 + .flags = IORESOURCE_BUSY | IORESOURCE_IO 22.217 +}, { 22.218 + .name = "pic1", 22.219 + .start = 0x0020, 22.220 + .end = 0x0021, 22.221 + .flags = IORESOURCE_BUSY | IORESOURCE_IO 22.222 +}, { 22.223 + .name = "timer0", 22.224 + .start = 0x0040, 22.225 + .end = 0x0043, 22.226 + .flags = IORESOURCE_BUSY | IORESOURCE_IO 22.227 +}, { 22.228 + .name = "timer1", 22.229 + .start = 0x0050, 22.230 + .end = 0x0053, 22.231 + .flags = IORESOURCE_BUSY | IORESOURCE_IO 22.232 +}, { 22.233 + .name = "keyboard", 22.234 + .start = 0x0060, 22.235 + .end = 0x006f, 22.236 + .flags = IORESOURCE_BUSY | IORESOURCE_IO 22.237 +}, { 22.238 + .name = "dma page reg", 22.239 + .start = 0x0080, 22.240 + .end = 0x008f, 22.241 + .flags = IORESOURCE_BUSY | IORESOURCE_IO 22.242 +}, { 22.243 + .name = "pic2", 22.244 + .start = 0x00a0, 22.245 + .end = 0x00a1, 22.246 + .flags = IORESOURCE_BUSY | IORESOURCE_IO 22.247 +}, { 22.248 + .name = "dma2", 22.249 + .start = 0x00c0, 22.250 + .end = 0x00df, 22.251 + .flags = IORESOURCE_BUSY | IORESOURCE_IO 22.252 +}, { 22.253 + .name = "fpu", 22.254 + .start = 0x00f0, 22.255 + .end = 0x00ff, 22.256 + .flags = IORESOURCE_BUSY | IORESOURCE_IO 22.257 +} }; 22.258 + 22.259 +#define STANDARD_IO_RESOURCES \ 22.260 + (sizeof standard_io_resources / sizeof standard_io_resources[0]) 22.261 + 22.262 +#ifdef CONFIG_XEN_PRIVILEGED_GUEST 22.263 +#define romsignature(x) (*(unsigned short *)(x) == 0xaa55) 22.264 + 22.265 +static int __init romchecksum(unsigned char *rom, unsigned long length) 22.266 +{ 22.267 + unsigned char *p, sum = 0; 22.268 + 22.269 + for (p = rom; p < rom + length; p++) 22.270 + sum += *p; 22.271 + return sum == 0; 22.272 +} 22.273 + 22.274 +static void __init probe_roms(void) 22.275 +{ 22.276 + unsigned long start, length, upper; 22.277 + unsigned char *rom; 22.278 + int i; 22.279 + 22.280 + /* video rom */ 22.281 + upper = adapter_rom_resources[0].start; 22.282 + for (start = video_rom_resource.start; start < upper; start += 2048) { 22.283 + rom = isa_bus_to_virt(start); 22.284 + if (!romsignature(rom)) 22.285 + continue; 22.286 + 22.287 + video_rom_resource.start = start; 22.288 + 22.289 + /* 0 < length <= 0x7f * 512, historically */ 22.290 + length = rom[2] * 512; 22.291 + 22.292 + /* if checksum okay, trust length byte */ 22.293 + if (length && romchecksum(rom, length)) 22.294 + video_rom_resource.end = start + length - 1; 22.295 + 22.296 + request_resource(&iomem_resource, &video_rom_resource); 22.297 + break; 22.298 + } 22.299 + 22.300 + start = (video_rom_resource.end + 1 + 2047) & ~2047UL; 22.301 + if (start < upper) 22.302 + start = upper; 22.303 + 22.304 + /* system rom */ 22.305 + request_resource(&iomem_resource, &system_rom_resource); 22.306 + upper = system_rom_resource.start; 22.307 + 22.308 + /* check for extension rom (ignore length byte!) */ 22.309 + rom = isa_bus_to_virt(extension_rom_resource.start); 22.310 + if (romsignature(rom)) { 22.311 + length = extension_rom_resource.end - extension_rom_resource.start + 1; 22.312 + if (romchecksum(rom, length)) { 22.313 + request_resource(&iomem_resource, &extension_rom_resource); 22.314 + upper = extension_rom_resource.start; 22.315 + } 22.316 + } 22.317 + 22.318 + /* check for adapter roms on 2k boundaries */ 22.319 + for (i = 0; i < ADAPTER_ROM_RESOURCES && start < upper; start += 2048) { 22.320 + rom = isa_bus_to_virt(start); 22.321 + if (!romsignature(rom)) 22.322 + continue; 22.323 + 22.324 + /* 0 < length <= 0x7f * 512, historically */ 22.325 + length = rom[2] * 512; 22.326 + 22.327 + /* but accept any length that fits if checksum okay */ 22.328 + if (!length || start + length > upper || !romchecksum(rom, length)) 22.329 + continue; 22.330 + 22.331 + adapter_rom_resources[i].start = start; 22.332 + adapter_rom_resources[i].end = start + length - 1; 22.333 + request_resource(&iomem_resource, &adapter_rom_resources[i]); 22.334 + 22.335 + start = adapter_rom_resources[i++].end & ~2047UL; 22.336 + } 22.337 +} 22.338 +#endif 22.339 + 22.340 +/* 22.341 + * Point at the empty zero page to start with. We map the real shared_info 22.342 + * page as soon as fixmap is up and running. 22.343 + */ 22.344 +shared_info_t *HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page; 22.345 +EXPORT_SYMBOL(HYPERVISOR_shared_info); 22.346 + 22.347 +unsigned long *phys_to_machine_mapping, *pfn_to_mfn_frame_list; 22.348 +EXPORT_SYMBOL(phys_to_machine_mapping); 22.349 + 22.350 +multicall_entry_t multicall_list[8]; 22.351 +int nr_multicall_ents = 0; 22.352 + 22.353 +/* Raw start-of-day parameters from the hypervisor. */ 22.354 +union xen_start_info_union xen_start_info_union; 22.355 + 22.356 +static void __init limit_regions(unsigned long long size) 22.357 +{ 22.358 + unsigned long long current_addr = 0; 22.359 + int i; 22.360 + 22.361 + if (efi_enabled) { 22.362 + for (i = 0; i < memmap.nr_map; i++) { 22.363 + current_addr = memmap.map[i].phys_addr + 22.364 + (memmap.map[i].num_pages << 12); 22.365 + if (memmap.map[i].type == EFI_CONVENTIONAL_MEMORY) { 22.366 + if (current_addr >= size) { 22.367 + memmap.map[i].num_pages -= 22.368 + (((current_addr-size) + PAGE_SIZE-1) >> PAGE_SHIFT); 22.369 + memmap.nr_map = i + 1; 22.370 + return; 22.371 + } 22.372 + } 22.373 + } 22.374 + } 22.375 + for (i = 0; i < e820.nr_map; i++) { 22.376 + if (e820.map[i].type == E820_RAM) { 22.377 + current_addr = e820.map[i].addr + e820.map[i].size; 22.378 + if (current_addr >= size) { 22.379 + e820.map[i].size -= current_addr-size; 22.380 + e820.nr_map = i + 1; 22.381 + return; 22.382 + } 22.383 + } 22.384 + } 22.385 +} 22.386 + 22.387 +static void __init add_memory_region(unsigned long long start, 22.388 + unsigned long long size, int type) 22.389 +{ 22.390 + int x; 22.391 + 22.392 + if (!efi_enabled) { 22.393 + x = e820.nr_map; 22.394 + 22.395 + if (x == E820MAX) { 22.396 + printk(KERN_ERR "Ooops! Too many entries in the memory map!\n"); 22.397 + return; 22.398 + } 22.399 + 22.400 + e820.map[x].addr = start; 22.401 + e820.map[x].size = size; 22.402 + e820.map[x].type = type; 22.403 + e820.nr_map++; 22.404 + } 22.405 +} /* add_memory_region */ 22.406 + 22.407 +#define E820_DEBUG 1 22.408 + 22.409 +static void __init print_memory_map(char *who) 22.410 +{ 22.411 + int i; 22.412 + 22.413 + for (i = 0; i < e820.nr_map; i++) { 22.414 + printk(" %s: %016Lx - %016Lx ", who, 22.415 + e820.map[i].addr, 22.416 + e820.map[i].addr + e820.map[i].size); 22.417 + switch (e820.map[i].type) { 22.418 + case E820_RAM: printk("(usable)\n"); 22.419 + break; 22.420 + case E820_RESERVED: 22.421 + printk("(reserved)\n"); 22.422 + break; 22.423 + case E820_ACPI: 22.424 + printk("(ACPI data)\n"); 22.425 + break; 22.426 + case E820_NVS: 22.427 + printk("(ACPI NVS)\n"); 22.428 + break; 22.429 + default: printk("type %lu\n", e820.map[i].type); 22.430 + break; 22.431 + } 22.432 + } 22.433 +} 22.434 + 22.435 +#if 0 22.436 +/* 22.437 + * Sanitize the BIOS e820 map. 22.438 + * 22.439 + * Some e820 responses include overlapping entries. The following 22.440 + * replaces the original e820 map with a new one, removing overlaps. 22.441 + * 22.442 + */ 22.443 +struct change_member { 22.444 + struct e820entry *pbios; /* pointer to original bios entry */ 22.445 + unsigned long long addr; /* address for this change point */ 22.446 +}; 22.447 +struct change_member change_point_list[2*E820MAX] __initdata; 22.448 +struct change_member *change_point[2*E820MAX] __initdata; 22.449 +struct e820entry *overlap_list[E820MAX] __initdata; 22.450 +struct e820entry new_bios[E820MAX] __initdata; 22.451 + 22.452 +static int __init sanitize_e820_map(struct e820entry * biosmap, char * pnr_map) 22.453 +{ 22.454 + struct change_member *change_tmp; 22.455 + unsigned long current_type, last_type; 22.456 + unsigned long long last_addr; 22.457 + int chgidx, still_changing; 22.458 + int overlap_entries; 22.459 + int new_bios_entry; 22.460 + int old_nr, new_nr, chg_nr; 22.461 + int i; 22.462 + 22.463 + /* 22.464 + Visually we're performing the following (1,2,3,4 = memory types)... 22.465 + 22.466 + Sample memory map (w/overlaps): 22.467 + ____22__________________ 22.468 + ______________________4_ 22.469 + ____1111________________ 22.470 + _44_____________________ 22.471 + 11111111________________ 22.472 + ____________________33__ 22.473 + ___________44___________ 22.474 + __________33333_________ 22.475 + ______________22________ 22.476 + ___________________2222_ 22.477 + _________111111111______ 22.478 + _____________________11_ 22.479 + _________________4______ 22.480 + 22.481 + Sanitized equivalent (no overlap): 22.482 + 1_______________________ 22.483 + _44_____________________ 22.484 + ___1____________________ 22.485 + ____22__________________ 22.486 + ______11________________ 22.487 + _________1______________ 22.488 + __________3_____________ 22.489 + ___________44___________ 22.490 + _____________33_________ 22.491 + _______________2________ 22.492 + ________________1_______ 22.493 + _________________4______ 22.494 + ___________________2____ 22.495 + ____________________33__ 22.496 + ______________________4_ 22.497 + */ 22.498 + 22.499 + /* if there's only one memory region, don't bother */ 22.500 + if (*pnr_map < 2) 22.501 + return -1; 22.502 + 22.503 + old_nr = *pnr_map; 22.504 + 22.505 + /* bail out if we find any unreasonable addresses in bios map */ 22.506 + for (i=0; i<old_nr; i++) 22.507 + if (biosmap[i].addr + biosmap[i].size < biosmap[i].addr) 22.508 + return -1; 22.509 + 22.510 + /* create pointers for initial change-point information (for sorting) */ 22.511 + for (i=0; i < 2*old_nr; i++) 22.512 + change_point[i] = &change_point_list[i]; 22.513 + 22.514 + /* record all known change-points (starting and ending addresses), 22.515 + omitting those that are for empty memory regions */ 22.516 + chgidx = 0; 22.517 + for (i=0; i < old_nr; i++) { 22.518 + if (biosmap[i].size != 0) { 22.519 + change_point[chgidx]->addr = biosmap[i].addr; 22.520 + change_point[chgidx++]->pbios = &biosmap[i]; 22.521 + change_point[chgidx]->addr = biosmap[i].addr + biosmap[i].size; 22.522 + change_point[chgidx++]->pbios = &biosmap[i]; 22.523 + } 22.524 + } 22.525 + chg_nr = chgidx; /* true number of change-points */ 22.526 + 22.527 + /* sort change-point list by memory addresses (low -> high) */ 22.528 + still_changing = 1; 22.529 + while (still_changing) { 22.530 + still_changing = 0; 22.531 + for (i=1; i < chg_nr; i++) { 22.532 + /* if <current_addr> > <last_addr>, swap */ 22.533 + /* or, if current=<start_addr> & last=<end_addr>, swap */ 22.534 + if ((change_point[i]->addr < change_point[i-1]->addr) || 22.535 + ((change_point[i]->addr == change_point[i-1]->addr) && 22.536 + (change_point[i]->addr == change_point[i]->pbios->addr) && 22.537 + (change_point[i-1]->addr != change_point[i-1]->pbios->addr)) 22.538 + ) 22.539 + { 22.540 + change_tmp = change_point[i]; 22.541 + change_point[i] = change_point[i-1]; 22.542 + change_point[i-1] = change_tmp; 22.543 + still_changing=1; 22.544 + } 22.545 + } 22.546 + } 22.547 + 22.548 + /* create a new bios memory map, removing overlaps */ 22.549 + overlap_entries=0; /* number of entries in the overlap table */ 22.550 + new_bios_entry=0; /* index for creating new bios map entries */ 22.551 + last_type = 0; /* start with undefined memory type */ 22.552 + last_addr = 0; /* start with 0 as last starting address */ 22.553 + /* loop through change-points, determining affect on the new bios map */ 22.554 + for (chgidx=0; chgidx < chg_nr; chgidx++) 22.555 + { 22.556 + /* keep track of all overlapping bios entries */ 22.557 + if (change_point[chgidx]->addr == change_point[chgidx]->pbios->addr) 22.558 + { 22.559 + /* add map entry to overlap list (> 1 entry implies an overlap) */ 22.560 + overlap_list[overlap_entries++]=change_point[chgidx]->pbios; 22.561 + } 22.562 + else 22.563 + { 22.564 + /* remove entry from list (order independent, so swap with last) */ 22.565 + for (i=0; i<overlap_entries; i++) 22.566 + { 22.567 + if (overlap_list[i] == change_point[chgidx]->pbios) 22.568 + overlap_list[i] = overlap_list[overlap_entries-1]; 22.569 + } 22.570 + overlap_entries--; 22.571 + } 22.572 + /* if there are overlapping entries, decide which "type" to use */ 22.573 + /* (larger value takes precedence -- 1=usable, 2,3,4,4+=unusable) */ 22.574 + current_type = 0; 22.575 + for (i=0; i<overlap_entries; i++) 22.576 + if (overlap_list[i]->type > current_type) 22.577 + current_type = overlap_list[i]->type; 22.578 + /* continue building up new bios map based on this information */ 22.579 + if (current_type != last_type) { 22.580 + if (last_type != 0) { 22.581 + new_bios[new_bios_entry].size = 22.582 + change_point[chgidx]->addr - last_addr; 22.583 + /* move forward only if the new size was non-zero */ 22.584 + if (new_bios[new_bios_entry].size != 0) 22.585 + if (++new_bios_entry >= E820MAX) 22.586 + break; /* no more space left for new bios entries */ 22.587 + } 22.588 + if (current_type != 0) { 22.589 + new_bios[new_bios_entry].addr = change_point[chgidx]->addr; 22.590 + new_bios[new_bios_entry].type = current_type; 22.591 + last_addr=change_point[chgidx]->addr; 22.592 + } 22.593 + last_type = current_type; 22.594 + } 22.595 + } 22.596 + new_nr = new_bios_entry; /* retain count for new bios entries */ 22.597 + 22.598 + /* copy new bios mapping into original location */ 22.599 + memcpy(biosmap, new_bios, new_nr*sizeof(struct e820entry)); 22.600 + *pnr_map = new_nr; 22.601 + 22.602 + return 0; 22.603 +} 22.604 + 22.605 +/* 22.606 + * Copy the BIOS e820 map into a safe place. 22.607 + * 22.608 + * Sanity-check it while we're at it.. 22.609 + * 22.610 + * If we're lucky and live on a modern system, the setup code 22.611 + * will have given us a memory map that we can use to properly 22.612 + * set up memory. If we aren't, we'll fake a memory map. 22.613 + * 22.614 + * We check to see that the memory map contains at least 2 elements 22.615 + * before we'll use it, because the detection code in setup.S may 22.616 + * not be perfect and most every PC known to man has two memory 22.617 + * regions: one from 0 to 640k, and one from 1mb up. (The IBM 22.618 + * thinkpad 560x, for example, does not cooperate with the memory 22.619 + * detection code.) 22.620 + */ 22.621 +static int __init copy_e820_map(struct e820entry * biosmap, int nr_map) 22.622 +{ 22.623 + /* Only one memory region (or negative)? Ignore it */ 22.624 + if (nr_map < 2) 22.625 + return -1; 22.626 + 22.627 + do { 22.628 + unsigned long long start = biosmap->addr; 22.629 + unsigned long long size = biosmap->size; 22.630 + unsigned long long end = start + size; 22.631 + unsigned long type = biosmap->type; 22.632 + 22.633 + /* Overflow in 64 bits? Ignore the memory map. */ 22.634 + if (start > end) 22.635 + return -1; 22.636 + 22.637 + /* 22.638 + * Some BIOSes claim RAM in the 640k - 1M region. 22.639 + * Not right. Fix it up. 22.640 + */ 22.641 + if (type == E820_RAM) { 22.642 + if (start < 0x100000ULL && end > 0xA0000ULL) { 22.643 + if (start < 0xA0000ULL) 22.644 + add_memory_region(start, 0xA0000ULL-start, type); 22.645 + if (end <= 0x100000ULL) 22.646 + continue; 22.647 + start = 0x100000ULL; 22.648 + size = end - start; 22.649 + } 22.650 + } 22.651 + add_memory_region(start, size, type); 22.652 + } while (biosmap++,--nr_map); 22.653 + return 0; 22.654 +} 22.655 +#endif 22.656 + 22.657 +#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE) 22.658 +struct edd edd; 22.659 +#ifdef CONFIG_EDD_MODULE 22.660 +EXPORT_SYMBOL(edd); 22.661 +#endif 22.662 +/** 22.663 + * copy_edd() - Copy the BIOS EDD information 22.664 + * from boot_params into a safe place. 22.665 + * 22.666 + */ 22.667 +static inline void copy_edd(void) 22.668 +{ 22.669 + memcpy(edd.mbr_signature, EDD_MBR_SIGNATURE, sizeof(edd.mbr_signature)); 22.670 + memcpy(edd.edd_info, EDD_BUF, sizeof(edd.edd_info)); 22.671 + edd.mbr_signature_nr = EDD_MBR_SIG_NR; 22.672 + edd.edd_info_nr = EDD_NR; 22.673 +} 22.674 +#else 22.675 +static inline void copy_edd(void) 22.676 +{ 22.677 +} 22.678 +#endif 22.679 + 22.680 +/* 22.681 + * Do NOT EVER look at the BIOS memory size location. 22.682 + * It does not work on many machines. 22.683 + */ 22.684 +#define LOWMEMSIZE() (0x9f000) 22.685 + 22.686 +static void __init parse_cmdline_early (char ** cmdline_p) 22.687 +{ 22.688 + char c = ' ', *to = command_line, *from = saved_command_line; 22.689 + int len = 0; 22.690 + int userdef = 0; 22.691 + 22.692 + memcpy(saved_command_line, xen_start_info.cmd_line, MAX_CMDLINE); 22.693 + /* Save unparsed command line copy for /proc/cmdline */ 22.694 + saved_command_line[COMMAND_LINE_SIZE-1] = '\0'; 22.695 + 22.696 + for (;;) { 22.697 + /* 22.698 + * "mem=nopentium" disables the 4MB page tables. 22.699 + * "mem=XXX[kKmM]" defines a memory region from HIGH_MEM 22.700 + * to <mem>, overriding the bios size. 22.701 + * "memmap=XXX[KkmM]@XXX[KkmM]" defines a memory region from 22.702 + * <start> to <start>+<mem>, overriding the bios size. 22.703 + * 22.704 + * HPA tells me bootloaders need to parse mem=, so no new 22.705 + * option should be mem= [also see Documentation/i386/boot.txt] 22.706 + */ 22.707 + if (c == ' ' && !memcmp(from, "mem=", 4)) { 22.708 + if (to != command_line) 22.709 + to--; 22.710 + if (!memcmp(from+4, "nopentium", 9)) { 22.711 + from += 9+4; 22.712 + clear_bit(X86_FEATURE_PSE, boot_cpu_data.x86_capability); 22.713 + disable_pse = 1; 22.714 + } else { 22.715 + /* If the user specifies memory size, we 22.716 + * limit the BIOS-provided memory map to 22.717 + * that size. exactmap can be used to specify 22.718 + * the exact map. mem=number can be used to 22.719 + * trim the existing memory map. 22.720 + */ 22.721 + unsigned long long mem_size; 22.722 + 22.723 + mem_size = memparse(from+4, &from); 22.724 + limit_regions(mem_size); 22.725 + userdef=1; 22.726 + } 22.727 + } 22.728 + 22.729 + if (c == ' ' && !memcmp(from, "memmap=", 7)) { 22.730 + if (to != command_line) 22.731 + to--; 22.732 + if (!memcmp(from+7, "exactmap", 8)) { 22.733 + from += 8+7; 22.734 + e820.nr_map = 0; 22.735 + userdef = 1; 22.736 + } else { 22.737 + /* If the user specifies memory size, we 22.738 + * limit the BIOS-provided memory map to 22.739 + * that size. exactmap can be used to specify 22.740 + * the exact map. mem=number can be used to 22.741 + * trim the existing memory map. 22.742 + */ 22.743 + unsigned long long start_at, mem_size; 22.744 + 22.745 + mem_size = memparse(from+7, &from); 22.746 + if (*from == '@') { 22.747 + start_at = memparse(from+1, &from); 22.748 + add_memory_region(start_at, mem_size, E820_RAM); 22.749 + } else if (*from == '#') { 22.750 + start_at = memparse(from+1, &from); 22.751 + add_memory_region(start_at, mem_size, E820_ACPI); 22.752 + } else if (*from == '$') { 22.753 + start_at = memparse(from+1, &from); 22.754 + add_memory_region(start_at, mem_size, E820_RESERVED); 22.755 + } else { 22.756 + limit_regions(mem_size); 22.757 + userdef=1; 22.758 + } 22.759 + } 22.760 + } 22.761 + 22.762 +#ifdef CONFIG_X86_SMP 22.763 + /* 22.764 + * If the BIOS enumerates physical processors before logical, 22.765 + * maxcpus=N at enumeration-time can be used to disable HT. 22.766 + */ 22.767 + else if (!memcmp(from, "maxcpus=", 8)) { 22.768 + extern unsigned int maxcpus; 22.769 + 22.770 + maxcpus = simple_strtoul(from + 8, NULL, 0); 22.771 + } 22.772 +#endif 22.773 + 22.774 +#ifdef CONFIG_ACPI_BOOT 22.775 + /* "acpi=off" disables both ACPI table parsing and interpreter */ 22.776 + else if (!memcmp(from, "acpi=off", 8)) { 22.777 + disable_acpi(); 22.778 + } 22.779 + 22.780 + /* acpi=force to over-ride black-list */ 22.781 + else if (!memcmp(from, "acpi=force", 10)) { 22.782 + acpi_force = 1; 22.783 + acpi_ht = 1; 22.784 + acpi_disabled = 0; 22.785 + } 22.786 + 22.787 + /* acpi=strict disables out-of-spec workarounds */ 22.788 + else if (!memcmp(from, "acpi=strict", 11)) { 22.789 + acpi_strict = 1; 22.790 + } 22.791 + 22.792 + /* Limit ACPI just to boot-time to enable HT */ 22.793 + else if (!memcmp(from, "acpi=ht", 7)) { 22.794 + if (!acpi_force) 22.795 + disable_acpi(); 22.796 + acpi_ht = 1; 22.797 + } 22.798 + 22.799 + /* "pci=noacpi" disable ACPI IRQ routing and PCI scan */ 22.800 + else if (!memcmp(from, "pci=noacpi", 10)) { 22.801 + acpi_disable_pci(); 22.802 + } 22.803 + /* "acpi=noirq" disables ACPI interrupt routing */ 22.804 + else if (!memcmp(from, "acpi=noirq", 10)) { 22.805 + acpi_noirq_set(); 22.806 + } 22.807 + 22.808 + else if (!memcmp(from, "acpi_sci=edge", 13)) 22.809 + acpi_sci_flags.trigger = 1; 22.810 + 22.811 + else if (!memcmp(from, "acpi_sci=level", 14)) 22.812 + acpi_sci_flags.trigger = 3; 22.813 + 22.814 + else if (!memcmp(from, "acpi_sci=high", 13)) 22.815 + acpi_sci_flags.polarity = 1; 22.816 + 22.817 + else if (!memcmp(from, "acpi_sci=low", 12)) 22.818 + acpi_sci_flags.polarity = 3; 22.819 + 22.820 +#ifdef CONFIG_X86_IO_APIC 22.821 + else if (!memcmp(from, "acpi_skip_timer_override", 24)) 22.822 + acpi_skip_timer_override = 1; 22.823 +#endif 22.824 + 22.825 +#ifdef CONFIG_X86_LOCAL_APIC 22.826 + /* disable IO-APIC */ 22.827 + else if (!memcmp(from, "noapic", 6)) 22.828 + disable_ioapic_setup(); 22.829 +#endif /* CONFIG_X86_LOCAL_APIC */ 22.830 +#endif /* CONFIG_ACPI_BOOT */ 22.831 + 22.832 + /* 22.833 + * highmem=size forces highmem to be exactly 'size' bytes. 22.834 + * This works even on boxes that have no highmem otherwise. 22.835 + * This also works to reduce highmem size on bigger boxes. 22.836 + */ 22.837 + if (c == ' ' && !memcmp(from, "highmem=", 8)) 22.838 + highmem_pages = memparse(from+8, &from) >> PAGE_SHIFT; 22.839 + 22.840 + /* 22.841 + * vmalloc=size forces the vmalloc area to be exactly 'size' 22.842 + * bytes. This can be used to increase (or decrease) the 22.843 + * vmalloc area - the default is 128m. 22.844 + */ 22.845 + if (c == ' ' && !memcmp(from, "vmalloc=", 8)) 22.846 + __VMALLOC_RESERVE = memparse(from+8, &from); 22.847 + 22.848 + c = *(from++); 22.849 + if (!c) 22.850 + break; 22.851 + if (COMMAND_LINE_SIZE <= ++len) 22.852 + break; 22.853 + *(to++) = c; 22.854 + } 22.855 + *to = '\0'; 22.856 + *cmdline_p = command_line; 22.857 + if (userdef) { 22.858 + printk(KERN_INFO "user-defined physical RAM map:\n"); 22.859 + print_memory_map("user"); 22.860 + } 22.861 +} 22.862 + 22.863 +/* 22.864 + * Callback for efi_memory_walk. 22.865 + */ 22.866 +static int __init 22.867 +efi_find_max_pfn(unsigned long start, unsigned long end, void *arg) 22.868 +{ 22.869 + unsigned long *max_pfn = arg, pfn; 22.870 + 22.871 + if (start < end) { 22.872 + pfn = PFN_UP(end -1); 22.873 + if (pfn > *max_pfn) 22.874 + *max_pfn = pfn; 22.875 + } 22.876 + return 0; 22.877 +} 22.878 + 22.879 + 22.880 +/* 22.881 + * Find the highest page frame number we have available 22.882 + */ 22.883 +void __init find_max_pfn(void) 22.884 +{ 22.885 + int i; 22.886 + 22.887 + max_pfn = 0; 22.888 + if (efi_enabled) { 22.889 + efi_memmap_walk(efi_find_max_pfn, &max_pfn); 22.890 + return; 22.891 + } 22.892 + 22.893 + for (i = 0; i < e820.nr_map; i++) { 22.894 + unsigned long start, end; 22.895 + /* RAM? */ 22.896 + if (e820.map[i].type != E820_RAM) 22.897 + continue; 22.898 + start = PFN_UP(e820.map[i].addr); 22.899 + end = PFN_DOWN(e820.map[i].addr + e820.map[i].size); 22.900 + if (start >= end) 22.901 + continue; 22.902 + if (end > max_pfn) 22.903 + max_pfn = end; 22.904 + } 22.905 +} 22.906 + 22.907 +/* 22.908 + * Determine low and high memory ranges: 22.909 + */ 22.910 +unsigned long __init find_max_low_pfn(void) 22.911 +{ 22.912 + unsigned long max_low_pfn; 22.913 + 22.914 + max_low_pfn = max_pfn; 22.915 + if (max_low_pfn > MAXMEM_PFN) { 22.916 + if (highmem_pages == -1) 22.917 + highmem_pages = max_pfn - MAXMEM_PFN; 22.918 + if (highmem_pages + MAXMEM_PFN < max_pfn) 22.919 + max_pfn = MAXMEM_PFN + highmem_pages; 22.920 + if (highmem_pages + MAXMEM_PFN > max_pfn) { 22.921 + printk("only %luMB highmem pages available, ignoring highmem size of %uMB.\n", pages_to_mb(max_pfn - MAXMEM_PFN), pages_to_mb(highmem_pages)); 22.922 + highmem_pages = 0; 22.923 + } 22.924 + max_low_pfn = MAXMEM_PFN; 22.925 +#ifndef CONFIG_HIGHMEM 22.926 + /* Maximum memory usable is what is directly addressable */ 22.927 + printk(KERN_WARNING "Warning only %ldMB will be used.\n", 22.928 + MAXMEM>>20); 22.929 + if (max_pfn > MAX_NONPAE_PFN) 22.930 + printk(KERN_WARNING "Use a PAE enabled kernel.\n"); 22.931 + else 22.932 + printk(KERN_WARNING "Use a HIGHMEM enabled kernel.\n"); 22.933 + max_pfn = MAXMEM_PFN; 22.934 +#else /* !CONFIG_HIGHMEM */ 22.935 +#ifndef CONFIG_X86_PAE 22.936 + if (max_pfn > MAX_NONPAE_PFN) { 22.937 + max_pfn = MAX_NONPAE_PFN; 22.938 + printk(KERN_WARNING "Warning only 4GB will be used.\n"); 22.939 + printk(KERN_WARNING "Use a PAE enabled kernel.\n"); 22.940 + } 22.941 +#endif /* !CONFIG_X86_PAE */ 22.942 +#endif /* !CONFIG_HIGHMEM */ 22.943 + } else { 22.944 + if (highmem_pages == -1) 22.945 + highmem_pages = 0; 22.946 +#ifdef CONFIG_HIGHMEM 22.947 + if (highmem_pages >= max_pfn) { 22.948 + printk(KERN_ERR "highmem size specified (%uMB) is bigger than pages available (%luMB)!.\n", pages_to_mb(highmem_pages), pages_to_mb(max_pfn)); 22.949 + highmem_pages = 0; 22.950 + } 22.951 + if (highmem_pages) { 22.952 + if (max_low_pfn-highmem_pages < 64*1024*1024/PAGE_SIZE){ 22.953 + printk(KERN_ERR "highmem size %uMB results in smaller than 64MB lowmem, ignoring it.\n", pages_to_mb(highmem_pages)); 22.954 + highmem_pages = 0; 22.955 + } 22.956 + max_low_pfn -= highmem_pages; 22.957 + } 22.958 +#else 22.959 + if (highmem_pages) 22.960 + printk(KERN_ERR "ignoring highmem size on non-highmem kernel!\n"); 22.961 +#endif 22.962 + } 22.963 + return max_low_pfn; 22.964 +} 22.965 + 22.966 +#ifndef CONFIG_DISCONTIGMEM 22.967 + 22.968 +/* 22.969 + * Free all available memory for boot time allocation. Used 22.970 + * as a callback function by efi_memory_walk() 22.971 + */ 22.972 + 22.973 +static int __init 22.974 +free_available_memory(unsigned long start, unsigned long end, void *arg) 22.975 +{ 22.976 + /* check max_low_pfn */ 22.977 + if (start >= ((max_low_pfn + 1) << PAGE_SHIFT)) 22.978 + return 0; 22.979 + if (end >= ((max_low_pfn + 1) << PAGE_SHIFT)) 22.980 + end = (max_low_pfn + 1) << PAGE_SHIFT; 22.981 + if (start < end) 22.982 + free_bootmem(start, end - start); 22.983 + 22.984 + return 0; 22.985 +} 22.986 +/* 22.987 + * Register fully available low RAM pages with the bootmem allocator. 22.988 + */ 22.989 +static void __init register_bootmem_low_pages(unsigned long max_low_pfn) 22.990 +{ 22.991 + int i; 22.992 + 22.993 + if (efi_enabled) { 22.994 + efi_memmap_walk(free_available_memory, NULL); 22.995 + return; 22.996 + } 22.997 + for (i = 0; i < e820.nr_map; i++) { 22.998 + unsigned long curr_pfn, last_pfn, size; 22.999 + /* 22.1000 + * Reserve usable low memory 22.1001 + */ 22.1002 + if (e820.map[i].type != E820_RAM) 22.1003 + continue; 22.1004 + /* 22.1005 + * We are rounding up the start address of usable memory: 22.1006 + */ 22.1007 + curr_pfn = PFN_UP(e820.map[i].addr); 22.1008 + if (curr_pfn >= max_low_pfn) 22.1009 + continue; 22.1010 + /* 22.1011 + * ... and at the end of the usable range downwards: 22.1012 + */ 22.1013 + last_pfn = PFN_DOWN(e820.map[i].addr + e820.map[i].size); 22.1014 + 22.1015 + if (last_pfn > max_low_pfn) 22.1016 + last_pfn = max_low_pfn; 22.1017 + 22.1018 + /* 22.1019 + * .. finally, did all the rounding and playing 22.1020 + * around just make the area go away? 22.1021 + */ 22.1022 + if (last_pfn <= curr_pfn) 22.1023 + continue; 22.1024 + 22.1025 + size = last_pfn - curr_pfn; 22.1026 + free_bootmem(PFN_PHYS(curr_pfn), PFN_PHYS(size)); 22.1027 + } 22.1028 +} 22.1029 + 22.1030 +/* 22.1031 + * workaround for Dell systems that neglect to reserve EBDA 22.1032 + */ 22.1033 +static void __init reserve_ebda_region(void) 22.1034 +{ 22.1035 + unsigned int addr; 22.1036 + addr = get_bios_ebda(); 22.1037 + if (addr) 22.1038 + reserve_bootmem(addr, PAGE_SIZE); 22.1039 +} 22.1040 + 22.1041 +static unsigned long __init setup_memory(void) 22.1042 +{ 22.1043 + unsigned long bootmap_size, start_pfn, max_low_pfn; 22.1044 + 22.1045 + /* 22.1046 + * partially used pages are not usable - thus 22.1047 + * we are rounding upwards: 22.1048 + */ 22.1049 + start_pfn = PFN_UP(__pa(xen_start_info.pt_base)) + xen_start_info.nr_pt_frames; 22.1050 + 22.1051 + find_max_pfn(); 22.1052 + 22.1053 + max_low_pfn = find_max_low_pfn(); 22.1054 + 22.1055 +#ifdef CONFIG_HIGHMEM 22.1056 + highstart_pfn = highend_pfn = max_pfn; 22.1057 + if (max_pfn > max_low_pfn) { 22.1058 + highstart_pfn = max_low_pfn; 22.1059 + } 22.1060 + printk(KERN_NOTICE "%ldMB HIGHMEM available.\n", 22.1061 + pages_to_mb(highend_pfn - highstart_pfn)); 22.1062 +#endif 22.1063 + printk(KERN_NOTICE "%ldMB LOWMEM available.\n", 22.1064 + pages_to_mb(max_low_pfn)); 22.1065 + /* 22.1066 + * Initialize the boot-time allocator (with low memory only): 22.1067 + */ 22.1068 + bootmap_size = init_bootmem(start_pfn, max_low_pfn); 22.1069 + 22.1070 + register_bootmem_low_pages(max_low_pfn); 22.1071 + 22.1072 + /* 22.1073 + * Reserve the bootmem bitmap itself as well. We do this in two 22.1074 + * steps (first step was init_bootmem()) because this catches 22.1075 + * the (very unlikely) case of us accidentally initializing the 22.1076 + * bootmem allocator with an invalid RAM area. 22.1077 + */ 22.1078 + reserve_bootmem(HIGH_MEMORY, (PFN_PHYS(start_pfn) + 22.1079 + bootmap_size + PAGE_SIZE-1) - (HIGH_MEMORY)); 22.1080 + 22.1081 + /* reserve EBDA region, it's a 4K region */ 22.1082 + reserve_ebda_region(); 22.1083 + 22.1084 + /* could be an AMD 768MPX chipset. Reserve a page before VGA to prevent 22.1085 + PCI prefetch into it (errata #56). Usually the page is reserved anyways, 22.1086 + unless you have no PS/2 mouse plugged in. */ 22.1087 + if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD && 22.1088 + boot_cpu_data.x86 == 6) 22.1089 + reserve_bootmem(0xa0000 - 4096, 4096); 22.1090 + 22.1091 +#ifdef CONFIG_SMP 22.1092 + /* 22.1093 + * But first pinch a few for the stack/trampoline stuff 22.1094 + * FIXME: Don't need the extra page at 4K, but need to fix 22.1095 + * trampoline before removing it. (see the GDT stuff) 22.1096 + */ 22.1097 + reserve_bootmem(PAGE_SIZE, PAGE_SIZE); 22.1098 +#endif 22.1099 +#ifdef CONFIG_ACPI_SLEEP 22.1100 + /* 22.1101 + * Reserve low memory region for sleep support. 22.1102 + */ 22.1103 + acpi_reserve_bootmem(); 22.1104 +#endif 22.1105 +#ifdef CONFIG_X86_FIND_SMP_CONFIG 22.1106 + /* 22.1107 + * Find and reserve possible boot-time SMP configuration: 22.1108 + */ 22.1109 + find_smp_config(); 22.1110 +#endif 22.1111 + 22.1112 +#ifdef CONFIG_BLK_DEV_INITRD 22.1113 + if (xen_start_info.mod_start) { 22.1114 + if (INITRD_START + INITRD_SIZE <= (max_low_pfn << PAGE_SHIFT)) { 22.1115 + /*reserve_bootmem(INITRD_START, INITRD_SIZE);*/ 22.1116 + initrd_start = INITRD_START + PAGE_OFFSET; 22.1117 + initrd_end = initrd_start+INITRD_SIZE; 22.1118 + initrd_below_start_ok = 1; 22.1119 + } 22.1120 + else { 22.1121 + printk(KERN_ERR "initrd extends beyond end of memory " 22.1122 + "(0x%08lx > 0x%08lx)\ndisabling initrd\n", 22.1123 + INITRD_START + INITRD_SIZE, 22.1124 + max_low_pfn << PAGE_SHIFT); 22.1125 + initrd_start = 0; 22.1126 + } 22.1127 + } 22.1128 +#endif 22.1129 + 22.1130 + phys_to_machine_mapping = (unsigned long *)xen_start_info.mfn_list; 22.1131 + 22.1132 + return max_low_pfn; 22.1133 +} 22.1134 +#else 22.1135 +extern unsigned long setup_memory(void); 22.1136 +#endif /* !CONFIG_DISCONTIGMEM */ 22.1137 + 22.1138 +/* 22.1139 + * Request address space for all standard RAM and ROM resources 22.1140 + * and also for regions reported as reserved by the e820. 22.1141 + */ 22.1142 +static void __init 22.1143 +legacy_init_iomem_resources(struct resource *code_resource, struct resource *data_resource) 22.1144 +{ 22.1145 + int i; 22.1146 + 22.1147 +#ifdef CONFIG_XEN_PRIVILEGED_GUEST 22.1148 + probe_roms(); 22.1149 +#endif 22.1150 + for (i = 0; i < e820.nr_map; i++) { 22.1151 + struct resource *res; 22.1152 + if (e820.map[i].addr + e820.map[i].size > 0x100000000ULL) 22.1153 + continue; 22.1154 + res = alloc_bootmem_low(sizeof(struct resource)); 22.1155 + switch (e820.map[i].type) { 22.1156 + case E820_RAM: res->name = "System RAM"; break; 22.1157 + case E820_ACPI: res->name = "ACPI Tables"; break; 22.1158 + case E820_NVS: res->name = "ACPI Non-volatile Storage"; break; 22.1159 + default: res->name = "reserved"; 22.1160 + } 22.1161 + res->start = e820.map[i].addr; 22.1162 + res->end = res->start + e820.map[i].size - 1; 22.1163 + res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; 22.1164 + request_resource(&iomem_resource, res); 22.1165 + if (e820.map[i].type == E820_RAM) { 22.1166 + /* 22.1167 + * We don't know which RAM region contains kernel data, 22.1168 + * so we try it repeatedly and let the resource manager 22.1169 + * test it. 22.1170 + */ 22.1171 + request_resource(res, code_resource); 22.1172 + request_resource(res, data_resource); 22.1173 + } 22.1174 + } 22.1175 +} 22.1176 + 22.1177 +/* 22.1178 + * Request address space for all standard resources 22.1179 + */ 22.1180 +static void __init register_memory(unsigned long max_low_pfn) 22.1181 +{ 22.1182 + unsigned long low_mem_size; 22.1183 + int i; 22.1184 + 22.1185 + if (efi_enabled) 22.1186 + efi_initialize_iomem_resources(&code_resource, &data_resource); 22.1187 + else 22.1188 + legacy_init_iomem_resources(&code_resource, &data_resource); 22.1189 + 22.1190 + /* EFI systems may still have VGA */ 22.1191 + request_resource(&iomem_resource, &video_ram_resource); 22.1192 + 22.1193 + /* request I/O space for devices used on all i[345]86 PCs */ 22.1194 + for (i = 0; i < STANDARD_IO_RESOURCES; i++) 22.1195 + request_resource(&ioport_resource, &standard_io_resources[i]); 22.1196 + 22.1197 + /* Tell the PCI layer not to allocate too close to the RAM area.. */ 22.1198 + low_mem_size = ((max_low_pfn << PAGE_SHIFT) + 0xfffff) & ~0xfffff; 22.1199 + if (low_mem_size > pci_mem_start) 22.1200 + pci_mem_start = low_mem_size; 22.1201 +} 22.1202 + 22.1203 +/* Use inline assembly to define this because the nops are defined 22.1204 + as inline assembly strings in the include files and we cannot 22.1205 + get them easily into strings. */ 22.1206 +asm("\t.data\nintelnops: " 22.1207 + GENERIC_NOP1 GENERIC_NOP2 GENERIC_NOP3 GENERIC_NOP4 GENERIC_NOP5 GENERIC_NOP6 22.1208 + GENERIC_NOP7 GENERIC_NOP8); 22.1209 +asm("\t.data\nk8nops: " 22.1210 + K8_NOP1 K8_NOP2 K8_NOP3 K8_NOP4 K8_NOP5 K8_NOP6 22.1211 + K8_NOP7 K8_NOP8); 22.1212 +asm("\t.data\nk7nops: " 22.1213 + K7_NOP1 K7_NOP2 K7_NOP3 K7_NOP4 K7_NOP5 K7_NOP6 22.1214 + K7_NOP7 K7_NOP8); 22.1215 + 22.1216 +extern unsigned char intelnops[], k8nops[], k7nops[]; 22.1217 +static unsigned char *intel_nops[ASM_NOP_MAX+1] = { 22.1218 + NULL, 22.1219 + intelnops, 22.1220 + intelnops + 1, 22.1221 + intelnops + 1 + 2, 22.1222 + intelnops + 1 + 2 + 3, 22.1223 + intelnops + 1 + 2 + 3 + 4, 22.1224 + intelnops + 1 + 2 + 3 + 4 + 5, 22.1225 + intelnops + 1 + 2 + 3 + 4 + 5 + 6, 22.1226 + intelnops + 1 + 2 + 3 + 4 + 5 + 6 + 7, 22.1227 +}; 22.1228 +static unsigned char *k8_nops[ASM_NOP_MAX+1] = { 22.1229 + NULL, 22.1230 + k8nops, 22.1231 + k8nops + 1, 22.1232 + k8nops + 1 + 2, 22.1233 + k8nops + 1 + 2 + 3, 22.1234 + k8nops + 1 + 2 + 3 + 4, 22.1235 + k8nops + 1 + 2 + 3 + 4 + 5, 22.1236 + k8nops + 1 + 2 + 3 + 4 + 5 + 6, 22.1237 + k8nops + 1 + 2 + 3 + 4 + 5 + 6 + 7, 22.1238 +}; 22.1239 +static unsigned char *k7_nops[ASM_NOP_MAX+1] = { 22.1240 + NULL, 22.1241 + k7nops, 22.1242 + k7nops + 1, 22.1243 + k7nops + 1 + 2, 22.1244 + k7nops + 1 + 2 + 3, 22.1245 + k7nops + 1 + 2 + 3 + 4, 22.1246 + k7nops + 1 + 2 + 3 + 4 + 5, 22.1247 + k7nops + 1 + 2 + 3 + 4 + 5 + 6, 22.1248 + k7nops + 1 + 2 + 3 + 4 + 5 + 6 + 7, 22.1249 +}; 22.1250 +static struct nop { 22.1251 + int cpuid; 22.1252 + unsigned char **noptable; 22.1253 +} noptypes[] = { 22.1254 + { X86_FEATURE_K8, k8_nops }, 22.1255 + { X86_FEATURE_K7, k7_nops }, 22.1256 + { -1, NULL } 22.1257 +}; 22.1258 + 22.1259 +/* Replace instructions with better alternatives for this CPU type. 22.1260 + 22.1261 + This runs before SMP is initialized to avoid SMP problems with 22.1262 + self modifying code. This implies that assymetric systems where 22.1263 + APs have less capabilities than the boot processor are not handled. 22.1264 + In this case boot with "noreplacement". */ 22.1265 +void apply_alternatives(void *start, void *end) 22.1266 +{ 22.1267 + struct alt_instr *a; 22.1268 + int diff, i, k; 22.1269 + unsigned char **noptable = intel_nops; 22.1270 + for (i = 0; noptypes[i].cpuid >= 0; i++) { 22.1271 + if (boot_cpu_has(noptypes[i].cpuid)) { 22.1272 + noptable = noptypes[i].noptable; 22.1273 + break; 22.1274 + } 22.1275 + } 22.1276 + for (a = start; (void *)a < end; a++) { 22.1277 + if (!boot_cpu_has(a->cpuid)) 22.1278 + continue; 22.1279 + BUG_ON(a->replacementlen > a->instrlen); 22.1280 + memcpy(a->instr, a->replacement, a->replacementlen); 22.1281 + diff = a->instrlen - a->replacementlen; 22.1282 + /* Pad the rest with nops */ 22.1283 + for (i = a->replacementlen; diff > 0; diff -= k, i += k) { 22.1284 + k = diff; 22.1285 + if (k > ASM_NOP_MAX) 22.1286 + k = ASM_NOP_MAX; 22.1287 + memcpy(a->instr + i, noptable[k], k); 22.1288 + } 22.1289 + } 22.1290 +} 22.1291 + 22.1292 +static int no_replacement __initdata = 0; 22.1293 + 22.1294 +void __init alternative_instructions(void) 22.1295 +{ 22.1296 + extern struct alt_instr __alt_instructions[], __alt_instructions_end[]; 22.1297 + if (no_replacement) 22.1298 + return; 22.1299 + apply_alternatives(__alt_instructions, __alt_instructions_end); 22.1300 +} 22.1301 + 22.1302 +static int __init noreplacement_setup(char *s) 22.1303 +{ 22.1304 + no_replacement = 1; 22.1305 + return 0; 22.1306 +} 22.1307 + 22.1308 +__setup("noreplacement", noreplacement_setup); 22.1309 + 22.1310 +static char * __init machine_specific_memory_setup(void); 22.1311 + 22.1312 +/* 22.1313 + * Determine if we were loaded by an EFI loader. If so, then we have also been 22.1314 + * passed the efi memmap, systab, etc., so we should use these data structures 22.1315 + * for initialization. Note, the efi init code path is determined by the 22.1316 + * global efi_enabled. This allows the same kernel image to be used on existing 22.1317 + * systems (with a traditional BIOS) as well as on EFI systems. 22.1318 + */ 22.1319 +void __init setup_arch(char **cmdline_p) 22.1320 +{ 22.1321 + int i,j; 22.1322 + 22.1323 + unsigned long max_low_pfn; 22.1324 + 22.1325 + /* Force a quick death if the kernel panics. */ 22.1326 + extern int panic_timeout; 22.1327 + if ( panic_timeout == 0 ) 22.1328 + panic_timeout = 1; 22.1329 + 22.1330 + HYPERVISOR_vm_assist(VMASST_CMD_enable, 22.1331 + VMASST_TYPE_4gb_segments); 22.1332 + 22.1333 + memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data)); 22.1334 + early_cpu_init(); 22.1335 + 22.1336 + /* 22.1337 + * FIXME: This isn't an official loader_type right 22.1338 + * now but does currently work with elilo. 22.1339 + * If we were configured as an EFI kernel, check to make 22.1340 + * sure that we were loaded correctly from elilo and that 22.1341 + * the system table is valid. If not, then initialize normally. 22.1342 + */ 22.1343 +#ifdef CONFIG_EFI 22.1344 + if ((LOADER_TYPE == 0x50) && EFI_SYSTAB) 22.1345 + efi_enabled = 1; 22.1346 +#endif 22.1347 + 22.1348 + ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); /*old_decode_dev(ORIG_ROOT_DEV);*/ 22.1349 + drive_info = DRIVE_INFO; 22.1350 + screen_info = SCREEN_INFO; 22.1351 + edid_info = EDID_INFO; 22.1352 + apm_info.bios = APM_BIOS_INFO; 22.1353 + ist_info = IST_INFO; 22.1354 + saved_videomode = VIDEO_MODE; 22.1355 + if( SYS_DESC_TABLE.length != 0 ) { 22.1356 + MCA_bus = SYS_DESC_TABLE.table[3] &0x2; 22.1357 + machine_id = SYS_DESC_TABLE.table[0]; 22.1358 + machine_submodel_id = SYS_DESC_TABLE.table[1]; 22.1359 + BIOS_revision = SYS_DESC_TABLE.table[2]; 22.1360 + } 22.1361 + aux_device_present = AUX_DEVICE_INFO; 22.1362 + 22.1363 +#ifdef CONFIG_XEN_PHYSDEV_ACCESS 22.1364 + /* This is drawn from a dump from vgacon:startup in standard Linux. */ 22.1365 + screen_info.orig_video_mode = 3; 22.1366 + screen_info.orig_video_isVGA = 1; 22.1367 + screen_info.orig_video_lines = 25; 22.1368 + screen_info.orig_video_cols = 80; 22.1369 + screen_info.orig_video_ega_bx = 3; 22.1370 + screen_info.orig_video_points = 16; 22.1371 +#endif 22.1372 + 22.1373 +#ifdef CONFIG_BLK_DEV_RAM 22.1374 + rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK; 22.1375 + rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0); 22.1376 + rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0); 22.1377 +#endif 22.1378 + ARCH_SETUP 22.1379 + if (efi_enabled) 22.1380 + efi_init(); 22.1381 + else { 22.1382 + printk(KERN_INFO "BIOS-provided physical RAM map:\n"); 22.1383 + print_memory_map(machine_specific_memory_setup()); 22.1384 + } 22.1385 + 22.1386 + copy_edd(); 22.1387 + 22.1388 + if (!MOUNT_ROOT_RDONLY) 22.1389 + root_mountflags &= ~MS_RDONLY; 22.1390 + init_mm.start_code = (unsigned long) _text; 22.1391 + init_mm.end_code = (unsigned long) _etext; 22.1392 + init_mm.end_data = (unsigned long) _edata; 22.1393 + init_mm.brk = (PFN_UP(__pa(xen_start_info.pt_base)) + xen_start_info.nr_pt_frames) << PAGE_SHIFT; 22.1394 + 22.1395 + code_resource.start = virt_to_phys(_text); 22.1396 + code_resource.end = virt_to_phys(_etext)-1; 22.1397 + data_resource.start = virt_to_phys(_etext); 22.1398 + data_resource.end = virt_to_phys(_edata)-1; 22.1399 + 22.1400 + parse_cmdline_early(cmdline_p); 22.1401 + 22.1402 + max_low_pfn = setup_memory(); 22.1403 + 22.1404 + /* 22.1405 + * NOTE: before this point _nobody_ is allowed to allocate 22.1406 + * any memory using the bootmem allocator. Although the 22.1407 + * alloctor is now initialised only the first 8Mb of the kernel 22.1408 + * virtual address space has been mapped. All allocations before 22.1409 + * paging_init() has completed must use the alloc_bootmem_low_pages() 22.1410 + * variant (which allocates DMA'able memory) and care must be taken 22.1411 + * not to exceed the 8Mb limit. 22.1412 + */ 22.1413 + 22.1414 +#ifdef CONFIG_SMP 22.1415 + smp_alloc_memory(); /* AP processor realmode stacks in low memory*/ 22.1416 +#endif 22.1417 + paging_init(); 22.1418 + 22.1419 + pfn_to_mfn_frame_list = alloc_bootmem_low_pages(PAGE_SIZE); 22.1420 + for ( i=0, j=0; i < max_pfn; i+=(PAGE_SIZE/sizeof(unsigned long)), j++ ) 22.1421 + { 22.1422 + pfn_to_mfn_frame_list[j] = 22.1423 + virt_to_machine(&phys_to_machine_mapping[i]) >> PAGE_SHIFT; 22.1424 + } 22.1425 + HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list = 22.1426 + virt_to_machine(pfn_to_mfn_frame_list) >> PAGE_SHIFT; 22.1427 + 22.1428 + 22.1429 + /* 22.1430 + * NOTE: at this point the bootmem allocator is fully available. 22.1431 + */ 22.1432 + 22.1433 +#ifdef CONFIG_EARLY_PRINTK 22.1434 + { 22.1435 + char *s = strstr(*cmdline_p, "earlyprintk="); 22.1436 + if (s) { 22.1437 + extern void setup_early_printk(char *); 22.1438 + 22.1439 + setup_early_printk(s); 22.1440 + printk("early console enabled\n"); 22.1441 + } 22.1442 + } 22.1443 +#endif 22.1444 + 22.1445 + 22.1446 + dmi_scan_machine(); 22.1447 + 22.1448 +#ifdef CONFIG_X86_GENERICARCH 22.1449 + generic_apic_probe(*cmdline_p); 22.1450 +#endif 22.1451 + if (efi_enabled) 22.1452 + efi_map_memmap(); 22.1453 + 22.1454 + /* 22.1455 + * Parse the ACPI tables for possible boot-time SMP configuration. 22.1456 + */ 22.1457 + acpi_boot_init(); 22.1458 + 22.1459 +#ifdef CONFIG_X86_LOCAL_APIC 22.1460 + if (smp_found_config) 22.1461 + get_smp_config(); 22.1462 +#endif 22.1463 + 22.1464 + register_memory(max_low_pfn); 22.1465 + 22.1466 + /* If we are a privileged guest OS then we should request IO privs. */ 22.1467 + if (xen_start_info.flags & SIF_PRIVILEGED) { 22.1468 + dom0_op_t op; 22.1469 + op.cmd = DOM0_IOPL; 22.1470 + op.u.iopl.domain = DOMID_SELF; 22.1471 + op.u.iopl.iopl = 1; 22.1472 + if (HYPERVISOR_dom0_op(&op) != 0) 22.1473 + panic("Unable to obtain IOPL, despite SIF_PRIVILEGED"); 22.1474 + current->thread.io_pl = 1; 22.1475 + } 22.1476 + 22.1477 + if (xen_start_info.flags & SIF_INITDOMAIN) { 22.1478 + if (!(xen_start_info.flags & SIF_PRIVILEGED)) 22.1479 + panic("Xen granted us console access " 22.1480 + "but not privileged status"); 22.1481 + 22.1482 +#ifdef CONFIG_VT 22.1483 +#if defined(CONFIG_VGA_CONSOLE) 22.1484 + if (!efi_enabled || 22.1485 + (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY)) 22.1486 + conswitchp = &vga_con; 22.1487 +#elif defined(CONFIG_DUMMY_CONSOLE) 22.1488 + conswitchp = &dummy_con; 22.1489 +#endif 22.1490 +#endif 22.1491 + } else { 22.1492 +#ifdef CONFIG_XEN_PRIVILEGED_GUEST 22.1493 + extern const struct consw xennull_con; 22.1494 + extern int console_use_vt; 22.1495 +#if defined(CONFIG_VGA_CONSOLE) 22.1496 + /* disable VGA driver */ 22.1497 + ORIG_VIDEO_ISVGA = VIDEO_TYPE_VLFB; 22.1498 +#endif 22.1499 + conswitchp = &xennull_con; 22.1500 + console_use_vt = 0; 22.1501 +#endif 22.1502 + } 22.1503 +} 22.1504 + 22.1505 +#include "setup_arch_post.h" 22.1506 +/* 22.1507 + * Local Variables: 22.1508 + * mode:c 22.1509 + * c-file-style:"k&r" 22.1510 + * c-basic-offset:8 22.1511 + * End: 22.1512 + */
23.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 23.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/signal.c Fri Nov 19 23:17:26 2004 +0000 23.3 @@ -0,0 +1,649 @@ 23.4 +/* 23.5 + * linux/arch/i386/kernel/signal.c 23.6 + * 23.7 + * Copyright (C) 1991, 1992 Linus Torvalds 23.8 + * 23.9 + * 1997-11-28 Modified for POSIX.1b signals by Richard Henderson 23.10 + * 2000-06-20 Pentium III FXSR, SSE support by Gareth Hughes 23.11 + */ 23.12 + 23.13 +#include <linux/sched.h> 23.14 +#include <linux/mm.h> 23.15 +#include <linux/smp.h> 23.16 +#include <linux/smp_lock.h> 23.17 +#include <linux/kernel.h> 23.18 +#include <linux/signal.h> 23.19 +#include <linux/errno.h> 23.20 +#include <linux/wait.h> 23.21 +#include <linux/unistd.h> 23.22 +#include <linux/stddef.h> 23.23 +#include <linux/personality.h> 23.24 +#include <linux/suspend.h> 23.25 +#include <linux/ptrace.h> 23.26 +#include <linux/elf.h> 23.27 +#include <asm/processor.h> 23.28 +#include <asm/ucontext.h> 23.29 +#include <asm/uaccess.h> 23.30 +#include <asm/i387.h> 23.31 +#include "sigframe.h" 23.32 + 23.33 +#define DEBUG_SIG 0 23.34 + 23.35 +#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) 23.36 + 23.37 +/* 23.38 + * Atomically swap in the new signal mask, and wait for a signal. 23.39 + */ 23.40 +asmlinkage int 23.41 +sys_sigsuspend(int history0, int history1, old_sigset_t mask) 23.42 +{ 23.43 + struct pt_regs * regs = (struct pt_regs *) &history0; 23.44 + sigset_t saveset; 23.45 + 23.46 + mask &= _BLOCKABLE; 23.47 + spin_lock_irq(¤t->sighand->siglock); 23.48 + saveset = current->blocked; 23.49 + siginitset(¤t->blocked, mask); 23.50 + recalc_sigpending(); 23.51 + spin_unlock_irq(¤t->sighand->siglock); 23.52 + 23.53 + regs->eax = -EINTR; 23.54 + while (1) { 23.55 + current->state = TASK_INTERRUPTIBLE; 23.56 + schedule(); 23.57 + if (do_signal(regs, &saveset)) 23.58 + return -EINTR; 23.59 + } 23.60 +} 23.61 + 23.62 +asmlinkage int 23.63 +sys_rt_sigsuspend(struct pt_regs regs) 23.64 +{ 23.65 + sigset_t saveset, newset; 23.66 + 23.67 + /* XXX: Don't preclude handling different sized sigset_t's. */ 23.68 + if (regs.ecx != sizeof(sigset_t)) 23.69 + return -EINVAL; 23.70 + 23.71 + if (copy_from_user(&newset, (sigset_t __user *)regs.ebx, sizeof(newset))) 23.72 + return -EFAULT; 23.73 + sigdelsetmask(&newset, ~_BLOCKABLE); 23.74 + 23.75 + spin_lock_irq(¤t->sighand->siglock); 23.76 + saveset = current->blocked; 23.77 + current->blocked = newset; 23.78 + recalc_sigpending(); 23.79 + spin_unlock_irq(¤t->sighand->siglock); 23.80 + 23.81 + regs.eax = -EINTR; 23.82 + while (1) { 23.83 + current->state = TASK_INTERRUPTIBLE; 23.84 + schedule(); 23.85 + if (do_signal(®s, &saveset)) 23.86 + return -EINTR; 23.87 + } 23.88 +} 23.89 + 23.90 +asmlinkage int 23.91 +sys_sigaction(int sig, const struct old_sigaction __user *act, 23.92 + struct old_sigaction __user *oact) 23.93 +{ 23.94 + struct k_sigaction new_ka, old_ka; 23.95 + int ret; 23.96 + 23.97 + if (act) { 23.98 + old_sigset_t mask; 23.99 + if (verify_area(VERIFY_READ, act, sizeof(*act)) || 23.100 + __get_user(new_ka.sa.sa_handler, &act->sa_handler) || 23.101 + __get_user(new_ka.sa.sa_restorer, &act->sa_restorer)) 23.102 + return -EFAULT; 23.103 + __get_user(new_ka.sa.sa_flags, &act->sa_flags); 23.104 + __get_user(mask, &act->sa_mask); 23.105 + siginitset(&new_ka.sa.sa_mask, mask); 23.106 + } 23.107 + 23.108 + ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); 23.109 + 23.110 + if (!ret && oact) { 23.111 + if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) || 23.112 + __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || 23.113 + __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer)) 23.114 + return -EFAULT; 23.115 + __put_user(old_ka.sa.sa_flags, &oact->sa_flags); 23.116 + __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); 23.117 + } 23.118 + 23.119 + return ret; 23.120 +} 23.121 + 23.122 +asmlinkage int 23.123 +sys_sigaltstack(unsigned long ebx) 23.124 +{ 23.125 + /* This is needed to make gcc realize it doesn't own the "struct pt_regs" */ 23.126 + struct pt_regs *regs = (struct pt_regs *)&ebx; 23.127 + const stack_t __user *uss = (const stack_t __user *)ebx; 23.128 + stack_t __user *uoss = (stack_t __user *)regs->ecx; 23.129 + 23.130 + return do_sigaltstack(uss, uoss, regs->esp); 23.131 +} 23.132 + 23.133 + 23.134 +/* 23.135 + * Do a signal return; undo the signal stack. 23.136 + */ 23.137 + 23.138 +static int 23.139 +restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *peax) 23.140 +{ 23.141 + unsigned int err = 0; 23.142 + 23.143 + /* Always make any pending restarted system calls return -EINTR */ 23.144 + current_thread_info()->restart_block.fn = do_no_restart_syscall; 23.145 + 23.146 +#define COPY(x) err |= __get_user(regs->x, &sc->x) 23.147 + 23.148 +#define COPY_SEG(seg) \ 23.149 + { unsigned short tmp; \ 23.150 + err |= __get_user(tmp, &sc->seg); \ 23.151 + regs->x##seg = tmp; } 23.152 + 23.153 +#define COPY_SEG_STRICT(seg) \ 23.154 + { unsigned short tmp; \ 23.155 + err |= __get_user(tmp, &sc->seg); \ 23.156 + regs->x##seg = tmp|3; } 23.157 + 23.158 +#define GET_SEG(seg) \ 23.159 + { unsigned short tmp; \ 23.160 + err |= __get_user(tmp, &sc->seg); \ 23.161 + loadsegment(seg,tmp); } 23.162 + 23.163 +#define FIX_EFLAGS (X86_EFLAGS_AC | X86_EFLAGS_OF | X86_EFLAGS_DF | \ 23.164 + X86_EFLAGS_TF | X86_EFLAGS_SF | X86_EFLAGS_ZF | \ 23.165 + X86_EFLAGS_AF | X86_EFLAGS_PF | X86_EFLAGS_CF) 23.166 + 23.167 + GET_SEG(gs); 23.168 + GET_SEG(fs); 23.169 + COPY_SEG(es); 23.170 + COPY_SEG(ds); 23.171 + COPY(edi); 23.172 + COPY(esi); 23.173 + COPY(ebp); 23.174 + COPY(esp); 23.175 + COPY(ebx); 23.176 + COPY(edx); 23.177 + COPY(ecx); 23.178 + COPY(eip); 23.179 + COPY_SEG_STRICT(cs); 23.180 + COPY_SEG_STRICT(ss); 23.181 + 23.182 + { 23.183 + unsigned int tmpflags; 23.184 + err |= __get_user(tmpflags, &sc->eflags); 23.185 + regs->eflags = (regs->eflags & ~FIX_EFLAGS) | (tmpflags & FIX_EFLAGS); 23.186 + regs->orig_eax = -1; /* disable syscall checks */ 23.187 + } 23.188 + 23.189 + { 23.190 + struct _fpstate __user * buf; 23.191 + err |= __get_user(buf, &sc->fpstate); 23.192 + if (buf) { 23.193 + if (verify_area(VERIFY_READ, buf, sizeof(*buf))) 23.194 + goto badframe; 23.195 + err |= restore_i387(buf); 23.196 + } 23.197 + } 23.198 + 23.199 + err |= __get_user(*peax, &sc->eax); 23.200 + return err; 23.201 + 23.202 +badframe: 23.203 + return 1; 23.204 +} 23.205 + 23.206 +asmlinkage int sys_sigreturn(unsigned long __unused) 23.207 +{ 23.208 + struct pt_regs *regs = (struct pt_regs *) &__unused; 23.209 + struct sigframe __user *frame = (struct sigframe __user *)(regs->esp - 8); 23.210 + sigset_t set; 23.211 + int eax; 23.212 + 23.213 + if (verify_area(VERIFY_READ, frame, sizeof(*frame))) 23.214 + goto badframe; 23.215 + if (__get_user(set.sig[0], &frame->sc.oldmask) 23.216 + || (_NSIG_WORDS > 1 23.217 + && __copy_from_user(&set.sig[1], &frame->extramask, 23.218 + sizeof(frame->extramask)))) 23.219 + goto badframe; 23.220 + 23.221 + sigdelsetmask(&set, ~_BLOCKABLE); 23.222 + spin_lock_irq(¤t->sighand->siglock); 23.223 + current->blocked = set; 23.224 + recalc_sigpending(); 23.225 + spin_unlock_irq(¤t->sighand->siglock); 23.226 + 23.227 + if (restore_sigcontext(regs, &frame->sc, &eax)) 23.228 + goto badframe; 23.229 + return eax; 23.230 + 23.231 +badframe: 23.232 + force_sig(SIGSEGV, current); 23.233 + return 0; 23.234 +} 23.235 + 23.236 +asmlinkage int sys_rt_sigreturn(unsigned long __unused) 23.237 +{ 23.238 + struct pt_regs *regs = (struct pt_regs *) &__unused; 23.239 + struct rt_sigframe __user *frame = (struct rt_sigframe __user *)(regs->esp - 4); 23.240 + sigset_t set; 23.241 + int eax; 23.242 + 23.243 + if (verify_area(VERIFY_READ, frame, sizeof(*frame))) 23.244 + goto badframe; 23.245 + if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) 23.246 + goto badframe; 23.247 + 23.248 + sigdelsetmask(&set, ~_BLOCKABLE); 23.249 + spin_lock_irq(¤t->sighand->siglock); 23.250 + current->blocked = set; 23.251 + recalc_sigpending(); 23.252 + spin_unlock_irq(¤t->sighand->siglock); 23.253 + 23.254 + if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &eax)) 23.255 + goto badframe; 23.256 + 23.257 + if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->esp) == -EFAULT) 23.258 + goto badframe; 23.259 + 23.260 + return eax; 23.261 + 23.262 +badframe: 23.263 + force_sig(SIGSEGV, current); 23.264 + return 0; 23.265 +} 23.266 + 23.267 +/* 23.268 + * Set up a signal frame. 23.269 + */ 23.270 + 23.271 +static int 23.272 +setup_sigcontext(struct sigcontext __user *sc, struct _fpstate __user *fpstate, 23.273 + struct pt_regs *regs, unsigned long mask) 23.274 +{ 23.275 + int tmp, err = 0; 23.276 + unsigned long eflags; 23.277 + 23.278 + tmp = 0; 23.279 + __asm__("movl %%gs,%0" : "=r"(tmp): "0"(tmp)); 23.280 + err |= __put_user(tmp, (unsigned int __user *)&sc->gs); 23.281 + __asm__("movl %%fs,%0" : "=r"(tmp): "0"(tmp)); 23.282 + err |= __put_user(tmp, (unsigned int __user *)&sc->fs); 23.283 + 23.284 + err |= __put_user(regs->xes, (unsigned int __user *)&sc->es); 23.285 + err |= __put_user(regs->xds, (unsigned int __user *)&sc->ds); 23.286 + err |= __put_user(regs->edi, &sc->edi); 23.287 + err |= __put_user(regs->esi, &sc->esi); 23.288 + err |= __put_user(regs->ebp, &sc->ebp); 23.289 + err |= __put_user(regs->esp, &sc->esp); 23.290 + err |= __put_user(regs->ebx, &sc->ebx); 23.291 + err |= __put_user(regs->edx, &sc->edx); 23.292 + err |= __put_user(regs->ecx, &sc->ecx); 23.293 + err |= __put_user(regs->eax, &sc->eax); 23.294 + err |= __put_user(current->thread.trap_no, &sc->trapno); 23.295 + err |= __put_user(current->thread.error_code, &sc->err); 23.296 + err |= __put_user(regs->eip, &sc->eip); 23.297 + err |= __put_user(regs->xcs, (unsigned int __user *)&sc->cs); 23.298 + eflags = regs->eflags; 23.299 + if (current->ptrace & PT_PTRACED) { 23.300 + eflags &= ~TF_MASK; 23.301 + } 23.302 + err |= __put_user(eflags, &sc->eflags); 23.303 + err |= __put_user(regs->esp, &sc->esp_at_signal); 23.304 + err |= __put_user(regs->xss, (unsigned int __user *)&sc->ss); 23.305 + 23.306 + tmp = save_i387(fpstate); 23.307 + if (tmp < 0) 23.308 + err = 1; 23.309 + else 23.310 + err |= __put_user(tmp ? fpstate : NULL, &sc->fpstate); 23.311 + 23.312 + /* non-iBCS2 extensions.. */ 23.313 + err |= __put_user(mask, &sc->oldmask); 23.314 + err |= __put_user(current->thread.cr2, &sc->cr2); 23.315 + 23.316 + return err; 23.317 +} 23.318 + 23.319 +/* 23.320 + * Determine which stack to use.. 23.321 + */ 23.322 +static inline void __user * 23.323 +get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size) 23.324 +{ 23.325 + unsigned long esp; 23.326 + 23.327 + /* Default to using normal stack */ 23.328 + esp = regs->esp; 23.329 + 23.330 + /* This is the X/Open sanctioned signal stack switching. */ 23.331 + if (ka->sa.sa_flags & SA_ONSTACK) { 23.332 + if (sas_ss_flags(esp) == 0) 23.333 + esp = current->sas_ss_sp + current->sas_ss_size; 23.334 + } 23.335 + 23.336 + /* This is the legacy signal stack switching. */ 23.337 + else if ((regs->xss & 0xffff) != __USER_DS && 23.338 + !(ka->sa.sa_flags & SA_RESTORER) && 23.339 + ka->sa.sa_restorer) { 23.340 + esp = (unsigned long) ka->sa.sa_restorer; 23.341 + } 23.342 + 23.343 + return (void __user *)((esp - frame_size) & -8ul); 23.344 +} 23.345 + 23.346 +/* These symbols are defined with the addresses in the vsyscall page. 23.347 + See vsyscall-sigreturn.S. */ 23.348 +extern void __user __kernel_sigreturn; 23.349 +extern void __user __kernel_rt_sigreturn; 23.350 + 23.351 +static void setup_frame(int sig, struct k_sigaction *ka, 23.352 + sigset_t *set, struct pt_regs * regs) 23.353 +{ 23.354 + void __user *restorer; 23.355 + struct sigframe __user *frame; 23.356 + int err = 0; 23.357 + int usig; 23.358 + 23.359 + frame = get_sigframe(ka, regs, sizeof(*frame)); 23.360 + 23.361 + if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) 23.362 + goto give_sigsegv; 23.363 + 23.364 + usig = current_thread_info()->exec_domain 23.365 + && current_thread_info()->exec_domain->signal_invmap 23.366 + && sig < 32 23.367 + ? current_thread_info()->exec_domain->signal_invmap[sig] 23.368 + : sig; 23.369 + 23.370 + err |= __put_user(usig, &frame->sig); 23.371 + if (err) 23.372 + goto give_sigsegv; 23.373 + 23.374 + err |= setup_sigcontext(&frame->sc, &frame->fpstate, regs, set->sig[0]); 23.375 + if (err) 23.376 + goto give_sigsegv; 23.377 + 23.378 + if (_NSIG_WORDS > 1) { 23.379 + err |= __copy_to_user(&frame->extramask, &set->sig[1], 23.380 + sizeof(frame->extramask)); 23.381 + } 23.382 + if (err) 23.383 + goto give_sigsegv; 23.384 + 23.385 + restorer = &__kernel_sigreturn; 23.386 + if (ka->sa.sa_flags & SA_RESTORER) 23.387 + restorer = ka->sa.sa_restorer; 23.388 + 23.389 + /* Set up to return from userspace. */ 23.390 + err |= __put_user(restorer, &frame->pretcode); 23.391 + 23.392 + /* 23.393 + * This is popl %eax ; movl $,%eax ; int $0x80 23.394 + * 23.395 + * WE DO NOT USE IT ANY MORE! It's only left here for historical 23.396 + * reasons and because gdb uses it as a signature to notice 23.397 + * signal handler stack frames. 23.398 + */ 23.399 + err |= __put_user(0xb858, (short __user *)(frame->retcode+0)); 23.400 + err |= __put_user(__NR_sigreturn, (int __user *)(frame->retcode+2)); 23.401 + err |= __put_user(0x80cd, (short __user *)(frame->retcode+6)); 23.402 + 23.403 + if (err) 23.404 + goto give_sigsegv; 23.405 + 23.406 + /* Set up registers for signal handler */ 23.407 + regs->esp = (unsigned long) frame; 23.408 + regs->eip = (unsigned long) ka->sa.sa_handler; 23.409 + regs->eax = (unsigned long) sig; 23.410 + regs->edx = (unsigned long) 0; 23.411 + regs->ecx = (unsigned long) 0; 23.412 + 23.413 + set_fs(USER_DS); 23.414 + regs->xds = __USER_DS; 23.415 + regs->xes = __USER_DS; 23.416 + regs->xss = __USER_DS; 23.417 + regs->xcs = __USER_CS; 23.418 + if (regs->eflags & TF_MASK) { 23.419 + if ((current->ptrace & (PT_PTRACED | PT_DTRACE)) == (PT_PTRACED | PT_DTRACE)) { 23.420 + ptrace_notify(SIGTRAP); 23.421 + } else { 23.422 + regs->eflags &= ~TF_MASK; 23.423 + } 23.424 + } 23.425 + 23.426 +#if DEBUG_SIG 23.427 + printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n", 23.428 + current->comm, current->pid, frame, regs->eip, frame->pretcode); 23.429 +#endif 23.430 + 23.431 + return; 23.432 + 23.433 +give_sigsegv: 23.434 + force_sigsegv(sig, current); 23.435 +} 23.436 + 23.437 +static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, 23.438 + sigset_t *set, struct pt_regs * regs) 23.439 +{ 23.440 + void __user *restorer; 23.441 + struct rt_sigframe __user *frame; 23.442 + int err = 0; 23.443 + int usig; 23.444 + 23.445 + frame = get_sigframe(ka, regs, sizeof(*frame)); 23.446 + 23.447 + if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) 23.448 + goto give_sigsegv; 23.449 + 23.450 + usig = current_thread_info()->exec_domain 23.451 + && current_thread_info()->exec_domain->signal_invmap 23.452 + && sig < 32 23.453 + ? current_thread_info()->exec_domain->signal_invmap[sig] 23.454 + : sig; 23.455 + 23.456 + err |= __put_user(usig, &frame->sig); 23.457 + err |= __put_user(&frame->info, &frame->pinfo); 23.458 + err |= __put_user(&frame->uc, &frame->puc); 23.459 + err |= copy_siginfo_to_user(&frame->info, info); 23.460 + if (err) 23.461 + goto give_sigsegv; 23.462 + 23.463 + /* Create the ucontext. */ 23.464 + err |= __put_user(0, &frame->uc.uc_flags); 23.465 + err |= __put_user(0, &frame->uc.uc_link); 23.466 + err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); 23.467 + err |= __put_user(sas_ss_flags(regs->esp), 23.468 + &frame->uc.uc_stack.ss_flags); 23.469 + err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); 23.470 + err |= setup_sigcontext(&frame->uc.uc_mcontext, &frame->fpstate, 23.471 + regs, set->sig[0]); 23.472 + err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); 23.473 + if (err) 23.474 + goto give_sigsegv; 23.475 + 23.476 + /* Set up to return from userspace. */ 23.477 + restorer = &__kernel_rt_sigreturn; 23.478 + if (ka->sa.sa_flags & SA_RESTORER) 23.479 + restorer = ka->sa.sa_restorer; 23.480 + err |= __put_user(restorer, &frame->pretcode); 23.481 + 23.482 + /* 23.483 + * This is movl $,%eax ; int $0x80 23.484 + * 23.485 + * WE DO NOT USE IT ANY MORE! It's only left here for historical 23.486 + * reasons and because gdb uses it as a signature to notice 23.487 + * signal handler stack frames. 23.488 + */ 23.489 + err |= __put_user(0xb8, (char __user *)(frame->retcode+0)); 23.490 + err |= __put_user(__NR_rt_sigreturn, (int __user *)(frame->retcode+1)); 23.491 + err |= __put_user(0x80cd, (short __user *)(frame->retcode+5)); 23.492 + 23.493 + if (err) 23.494 + goto give_sigsegv; 23.495 + 23.496 + /* Set up registers for signal handler */ 23.497 + regs->esp = (unsigned long) frame; 23.498 + regs->eip = (unsigned long) ka->sa.sa_handler; 23.499 + regs->eax = (unsigned long) usig; 23.500 + regs->edx = (unsigned long) &frame->info; 23.501 + regs->ecx = (unsigned long) &frame->uc; 23.502 + 23.503 + set_fs(USER_DS); 23.504 + regs->xds = __USER_DS; 23.505 + regs->xes = __USER_DS; 23.506 + regs->xss = __USER_DS; 23.507 + regs->xcs = __USER_CS; 23.508 + if (regs->eflags & TF_MASK) { 23.509 + if (current->ptrace & PT_PTRACED) { 23.510 + ptrace_notify(SIGTRAP); 23.511 + } else { 23.512 + regs->eflags &= ~TF_MASK; 23.513 + } 23.514 + } 23.515 + 23.516 +#if DEBUG_SIG 23.517 + printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n", 23.518 + current->comm, current->pid, frame, regs->eip, frame->pretcode); 23.519 +#endif 23.520 + 23.521 + return; 23.522 + 23.523 +give_sigsegv: 23.524 + force_sigsegv(sig, current); 23.525 +} 23.526 + 23.527 +/* 23.528 + * OK, we're invoking a handler 23.529 + */ 23.530 + 23.531 +static void 23.532 +handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, 23.533 + sigset_t *oldset, struct pt_regs * regs) 23.534 +{ 23.535 + /* Are we from a system call? */ 23.536 + if (regs->orig_eax >= 0) { 23.537 + /* If so, check system call restarting.. */ 23.538 + switch (regs->eax) { 23.539 + case -ERESTART_RESTARTBLOCK: 23.540 + case -ERESTARTNOHAND: 23.541 + regs->eax = -EINTR; 23.542 + break; 23.543 + 23.544 + case -ERESTARTSYS: 23.545 + if (!(ka->sa.sa_flags & SA_RESTART)) { 23.546 + regs->eax = -EINTR; 23.547 + break; 23.548 + } 23.549 + /* fallthrough */ 23.550 + case -ERESTARTNOINTR: 23.551 + regs->eax = regs->orig_eax; 23.552 + regs->eip -= 2; 23.553 + } 23.554 + } 23.555 + 23.556 + /* Set up the stack frame */ 23.557 + if (ka->sa.sa_flags & SA_SIGINFO) 23.558 + setup_rt_frame(sig, ka, info, oldset, regs); 23.559 + else 23.560 + setup_frame(sig, ka, oldset, regs); 23.561 + 23.562 + if (!(ka->sa.sa_flags & SA_NODEFER)) { 23.563 + spin_lock_irq(¤t->sighand->siglock); 23.564 + sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); 23.565 + sigaddset(¤t->blocked,sig); 23.566 + recalc_sigpending(); 23.567 + spin_unlock_irq(¤t->sighand->siglock); 23.568 + } 23.569 +} 23.570 + 23.571 +/* 23.572 + * Note that 'init' is a special process: it doesn't get signals it doesn't 23.573 + * want to handle. Thus you cannot kill init even with a SIGKILL even by 23.574 + * mistake. 23.575 + */ 23.576 +int fastcall do_signal(struct pt_regs *regs, sigset_t *oldset) 23.577 +{ 23.578 + siginfo_t info; 23.579 + int signr; 23.580 + struct k_sigaction ka; 23.581 + 23.582 + /* 23.583 + * We want the common case to go fast, which 23.584 + * is why we may in certain cases get here from 23.585 + * kernel mode. Just return without doing anything 23.586 + * if so. 23.587 + */ 23.588 + if ((regs->xcs & 2) != 2) 23.589 + return 1; 23.590 + 23.591 + if (current->flags & PF_FREEZE) { 23.592 + refrigerator(0); 23.593 + goto no_signal; 23.594 + } 23.595 + 23.596 + if (!oldset) 23.597 + oldset = ¤t->blocked; 23.598 + 23.599 + signr = get_signal_to_deliver(&info, &ka, regs, NULL); 23.600 + if (signr > 0) { 23.601 + /* Reenable any watchpoints before delivering the 23.602 + * signal to user space. The processor register will 23.603 + * have been cleared if the watchpoint triggered 23.604 + * inside the kernel. 23.605 + */ 23.606 + if (unlikely(current->thread.debugreg[7])) { 23.607 + HYPERVISOR_set_debugreg(7, 23.608 + current->thread.debugreg[7]); 23.609 + } 23.610 + 23.611 + /* Whee! Actually deliver the signal. */ 23.612 + handle_signal(signr, &info, &ka, oldset, regs); 23.613 + return 1; 23.614 + } 23.615 + 23.616 + no_signal: 23.617 + /* Did we come from a system call? */ 23.618 + if (regs->orig_eax >= 0) { 23.619 + /* Restart the system call - no handlers present */ 23.620 + if (regs->eax == -ERESTARTNOHAND || 23.621 + regs->eax == -ERESTARTSYS || 23.622 + regs->eax == -ERESTARTNOINTR) { 23.623 + regs->eax = regs->orig_eax; 23.624 + regs->eip -= 2; 23.625 + } 23.626 + if (regs->eax == -ERESTART_RESTARTBLOCK){ 23.627 + regs->eax = __NR_restart_syscall; 23.628 + regs->eip -= 2; 23.629 + } 23.630 + } 23.631 + return 0; 23.632 +} 23.633 + 23.634 +/* 23.635 + * notification of userspace execution resumption 23.636 + * - triggered by current->work.notify_resume 23.637 + */ 23.638 +__attribute__((regparm(3))) 23.639 +void do_notify_resume(struct pt_regs *regs, sigset_t *oldset, 23.640 + __u32 thread_info_flags) 23.641 +{ 23.642 + /* Pending single-step? */ 23.643 + if (thread_info_flags & _TIF_SINGLESTEP) { 23.644 + regs->eflags |= TF_MASK; 23.645 + clear_thread_flag(TIF_SINGLESTEP); 23.646 + } 23.647 + /* deal with pending signal delivery */ 23.648 + if (thread_info_flags & _TIF_SIGPENDING) 23.649 + do_signal(regs,oldset); 23.650 + 23.651 + clear_thread_flag(TIF_IRET); 23.652 +}
24.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 24.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/time.c Fri Nov 19 23:17:26 2004 +0000 24.3 @@ -0,0 +1,733 @@ 24.4 +/* 24.5 + * linux/arch/i386/kernel/time.c 24.6 + * 24.7 + * Copyright (C) 1991, 1992, 1995 Linus Torvalds 24.8 + * 24.9 + * This file contains the PC-specific time handling details: 24.10 + * reading the RTC at bootup, etc.. 24.11 + * 1994-07-02 Alan Modra 24.12 + * fixed set_rtc_mmss, fixed time.year for >= 2000, new mktime 24.13 + * 1995-03-26 Markus Kuhn 24.14 + * fixed 500 ms bug at call to set_rtc_mmss, fixed DS12887 24.15 + * precision CMOS clock update 24.16 + * 1996-05-03 Ingo Molnar 24.17 + * fixed time warps in do_[slow|fast]_gettimeoffset() 24.18 + * 1997-09-10 Updated NTP code according to technical memorandum Jan '96 24.19 + * "A Kernel Model for Precision Timekeeping" by Dave Mills 24.20 + * 1998-09-05 (Various) 24.21 + * More robust do_fast_gettimeoffset() algorithm implemented 24.22 + * (works with APM, Cyrix 6x86MX and Centaur C6), 24.23 + * monotonic gettimeofday() with fast_get_timeoffset(), 24.24 + * drift-proof precision TSC calibration on boot 24.25 + * (C. Scott Ananian <cananian@alumni.princeton.edu>, Andrew D. 24.26 + * Balsa <andrebalsa@altern.org>, Philip Gladstone <philip@raptor.com>; 24.27 + * ported from 2.0.35 Jumbo-9 by Michael Krause <m.krause@tu-harburg.de>). 24.28 + * 1998-12-16 Andrea Arcangeli 24.29 + * Fixed Jumbo-9 code in 2.1.131: do_gettimeofday was missing 1 jiffy 24.30 + * because was not accounting lost_ticks. 24.31 + * 1998-12-24 Copyright (C) 1998 Andrea Arcangeli 24.32 + * Fixed a xtime SMP race (we need the xtime_lock rw spinlock to 24.33 + * serialize accesses to xtime/lost_ticks). 24.34 + */ 24.35 + 24.36 +#include <linux/errno.h> 24.37 +#include <linux/sched.h> 24.38 +#include <linux/kernel.h> 24.39 +#include <linux/param.h> 24.40 +#include <linux/string.h> 24.41 +#include <linux/mm.h> 24.42 +#include <linux/interrupt.h> 24.43 +#include <linux/time.h> 24.44 +#include <linux/delay.h> 24.45 +#include <linux/init.h> 24.46 +#include <linux/smp.h> 24.47 +#include <linux/module.h> 24.48 +#include <linux/sysdev.h> 24.49 +#include <linux/bcd.h> 24.50 +#include <linux/efi.h> 24.51 +#include <linux/sysctl.h> 24.52 + 24.53 +#include <asm/io.h> 24.54 +#include <asm/smp.h> 24.55 +#include <asm/irq.h> 24.56 +#include <asm/msr.h> 24.57 +#include <asm/delay.h> 24.58 +#include <asm/mpspec.h> 24.59 +#include <asm/uaccess.h> 24.60 +#include <asm/processor.h> 24.61 +#include <asm/timer.h> 24.62 + 24.63 +#include "mach_time.h" 24.64 + 24.65 +#include <linux/timex.h> 24.66 +#include <linux/config.h> 24.67 + 24.68 +#include <asm/hpet.h> 24.69 + 24.70 +#include <asm/arch_hooks.h> 24.71 + 24.72 +#include "io_ports.h" 24.73 + 24.74 +extern spinlock_t i8259A_lock; 24.75 +int pit_latch_buggy; /* extern */ 24.76 + 24.77 +u64 jiffies_64 = INITIAL_JIFFIES; 24.78 + 24.79 +EXPORT_SYMBOL(jiffies_64); 24.80 + 24.81 +unsigned long cpu_khz; /* Detected as we calibrate the TSC */ 24.82 + 24.83 +extern unsigned long wall_jiffies; 24.84 + 24.85 +spinlock_t rtc_lock = SPIN_LOCK_UNLOCKED; 24.86 + 24.87 +spinlock_t i8253_lock = SPIN_LOCK_UNLOCKED; 24.88 +EXPORT_SYMBOL(i8253_lock); 24.89 + 24.90 +extern struct init_timer_opts __initdata timer_tsc_init; 24.91 +extern struct timer_opts timer_tsc; 24.92 +struct timer_opts *cur_timer = &timer_tsc; 24.93 + 24.94 +/* These are peridically updated in shared_info, and then copied here. */ 24.95 +u32 shadow_tsc_stamp; 24.96 +u64 shadow_system_time; 24.97 +static u32 shadow_time_version; 24.98 +static struct timeval shadow_tv; 24.99 +extern u64 processed_system_time; 24.100 + 24.101 +/* 24.102 + * We use this to ensure that gettimeofday() is monotonically increasing. We 24.103 + * only break this guarantee if the wall clock jumps backwards "a long way". 24.104 + */ 24.105 +static struct timeval last_seen_tv = {0,0}; 24.106 + 24.107 +#ifdef CONFIG_XEN_PRIVILEGED_GUEST 24.108 +/* Periodically propagate synchronised time base to the RTC and to Xen. */ 24.109 +static long last_rtc_update, last_update_to_xen; 24.110 +#endif 24.111 + 24.112 +/* Periodically take synchronised time base from Xen, if we need it. */ 24.113 +static long last_update_from_xen; /* UTC seconds when last read Xen clock. */ 24.114 + 24.115 +/* Keep track of last time we did processing/updating of jiffies and xtime. */ 24.116 +u64 processed_system_time; /* System time (ns) at last processing. */ 24.117 + 24.118 +#define NS_PER_TICK (1000000000ULL/HZ) 24.119 + 24.120 +#define HANDLE_USEC_UNDERFLOW(_tv) do { \ 24.121 + while ((_tv).tv_usec < 0) { \ 24.122 + (_tv).tv_usec += USEC_PER_SEC; \ 24.123 + (_tv).tv_sec--; \ 24.124 + } \ 24.125 +} while (0) 24.126 +#define HANDLE_USEC_OVERFLOW(_tv) do { \ 24.127 + while ((_tv).tv_usec >= USEC_PER_SEC) { \ 24.128 + (_tv).tv_usec -= USEC_PER_SEC; \ 24.129 + (_tv).tv_sec++; \ 24.130 + } \ 24.131 +} while (0) 24.132 +static inline void __normalize_time(time_t *sec, s64 *nsec) 24.133 +{ 24.134 + while (*nsec >= NSEC_PER_SEC) { 24.135 + (*nsec) -= NSEC_PER_SEC; 24.136 + (*sec)++; 24.137 + } 24.138 + while (*nsec < 0) { 24.139 + (*nsec) += NSEC_PER_SEC; 24.140 + (*sec)--; 24.141 + } 24.142 +} 24.143 + 24.144 +/* Does this guest OS track Xen time, or set its wall clock independently? */ 24.145 +static int independent_wallclock = 0; 24.146 +static int __init __independent_wallclock(char *str) 24.147 +{ 24.148 + independent_wallclock = 1; 24.149 + return 1; 24.150 +} 24.151 +__setup("independent_wallclock", __independent_wallclock); 24.152 +#define INDEPENDENT_WALLCLOCK() \ 24.153 + (independent_wallclock || (xen_start_info.flags & SIF_INITDOMAIN)) 24.154 + 24.155 +/* 24.156 + * Reads a consistent set of time-base values from Xen, into a shadow data 24.157 + * area. Must be called with the xtime_lock held for writing. 24.158 + */ 24.159 +static void __get_time_values_from_xen(void) 24.160 +{ 24.161 + shared_info_t *s = HYPERVISOR_shared_info; 24.162 + 24.163 + do { 24.164 + shadow_time_version = s->time_version2; 24.165 + rmb(); 24.166 + shadow_tv.tv_sec = s->wc_sec; 24.167 + shadow_tv.tv_usec = s->wc_usec; 24.168 + shadow_tsc_stamp = (u32)s->tsc_timestamp; 24.169 + shadow_system_time = s->system_time; 24.170 + rmb(); 24.171 + } 24.172 + while (shadow_time_version != s->time_version1); 24.173 + 24.174 + cur_timer->mark_offset(); 24.175 +} 24.176 + 24.177 +#define TIME_VALUES_UP_TO_DATE \ 24.178 + ({ rmb(); (shadow_time_version == HYPERVISOR_shared_info->time_version2); }) 24.179 + 24.180 +/* 24.181 + * This version of gettimeofday has microsecond resolution 24.182 + * and better than microsecond precision on fast x86 machines with TSC. 24.183 + */ 24.184 +void do_gettimeofday(struct timeval *tv) 24.185 +{ 24.186 + unsigned long seq; 24.187 + unsigned long usec, sec; 24.188 + unsigned long max_ntp_tick; 24.189 + unsigned long flags; 24.190 + s64 nsec; 24.191 + 24.192 + do { 24.193 + unsigned long lost; 24.194 + 24.195 + seq = read_seqbegin(&xtime_lock); 24.196 + 24.197 + usec = cur_timer->get_offset(); 24.198 + lost = jiffies - wall_jiffies; 24.199 + 24.200 + /* 24.201 + * If time_adjust is negative then NTP is slowing the clock 24.202 + * so make sure not to go into next possible interval. 24.203 + * Better to lose some accuracy than have time go backwards.. 24.204 + */ 24.205 + if (unlikely(time_adjust < 0)) { 24.206 + max_ntp_tick = (USEC_PER_SEC / HZ) - tickadj; 24.207 + usec = min(usec, max_ntp_tick); 24.208 + 24.209 + if (lost) 24.210 + usec += lost * max_ntp_tick; 24.211 + } 24.212 + else if (unlikely(lost)) 24.213 + usec += lost * (USEC_PER_SEC / HZ); 24.214 + 24.215 + sec = xtime.tv_sec; 24.216 + usec += (xtime.tv_nsec / NSEC_PER_USEC); 24.217 + 24.218 + nsec = shadow_system_time - processed_system_time; 24.219 + __normalize_time(&sec, &nsec); 24.220 + usec += (long)nsec / NSEC_PER_USEC; 24.221 + 24.222 + if (unlikely(!TIME_VALUES_UP_TO_DATE)) { 24.223 + /* 24.224 + * We may have blocked for a long time, 24.225 + * rendering our calculations invalid 24.226 + * (e.g. the time delta may have 24.227 + * overflowed). Detect that and recalculate 24.228 + * with fresh values. 24.229 + */ 24.230 + write_seqlock_irqsave(&xtime_lock, flags); 24.231 + __get_time_values_from_xen(); 24.232 + write_sequnlock_irqrestore(&xtime_lock, flags); 24.233 + continue; 24.234 + } 24.235 + } while (read_seqretry(&xtime_lock, seq)); 24.236 + 24.237 + while (usec >= USEC_PER_SEC) { 24.238 + usec -= USEC_PER_SEC; 24.239 + sec++; 24.240 + } 24.241 + 24.242 + /* Ensure that time-of-day is monotonically increasing. */ 24.243 + if ((sec < last_seen_tv.tv_sec) || 24.244 + ((sec == last_seen_tv.tv_sec) && (usec < last_seen_tv.tv_usec))) { 24.245 + sec = last_seen_tv.tv_sec; 24.246 + usec = last_seen_tv.tv_usec; 24.247 + } else { 24.248 + last_seen_tv.tv_sec = sec; 24.249 + last_seen_tv.tv_usec = usec; 24.250 + } 24.251 + 24.252 + tv->tv_sec = sec; 24.253 + tv->tv_usec = usec; 24.254 +} 24.255 + 24.256 +EXPORT_SYMBOL(do_gettimeofday); 24.257 + 24.258 +int do_settimeofday(struct timespec *tv) 24.259 +{ 24.260 + time_t wtm_sec, sec = tv->tv_sec; 24.261 + long wtm_nsec; 24.262 + s64 nsec; 24.263 + struct timespec xentime; 24.264 + 24.265 + if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC) 24.266 + return -EINVAL; 24.267 + 24.268 + if (!INDEPENDENT_WALLCLOCK()) 24.269 + return 0; /* Silent failure? */ 24.270 + 24.271 + write_seqlock_irq(&xtime_lock); 24.272 + 24.273 + /* 24.274 + * Ensure we don't get blocked for a long time so that our time delta 24.275 + * overflows. If that were to happen then our shadow time values would 24.276 + * be stale, so we can retry with fresh ones. 24.277 + */ 24.278 + again: 24.279 + nsec = (s64)tv->tv_nsec - 24.280 + ((s64)cur_timer->get_offset() * (s64)NSEC_PER_USEC); 24.281 + if (unlikely(!TIME_VALUES_UP_TO_DATE)) { 24.282 + __get_time_values_from_xen(); 24.283 + goto again; 24.284 + } 24.285 + 24.286 + __normalize_time(&sec, &nsec); 24.287 + set_normalized_timespec(&xentime, sec, nsec); 24.288 + 24.289 + /* 24.290 + * This is revolting. We need to set "xtime" correctly. However, the 24.291 + * value in this location is the value at the most recent update of 24.292 + * wall time. Discover what correction gettimeofday() would have 24.293 + * made, and then undo it! 24.294 + */ 24.295 + nsec -= (jiffies - wall_jiffies) * TICK_NSEC; 24.296 + 24.297 + nsec -= (shadow_system_time - processed_system_time); 24.298 + 24.299 + __normalize_time(&sec, &nsec); 24.300 + wtm_sec = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec); 24.301 + wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec); 24.302 + 24.303 + set_normalized_timespec(&xtime, sec, nsec); 24.304 + set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec); 24.305 + 24.306 + time_adjust = 0; /* stop active adjtime() */ 24.307 + time_status |= STA_UNSYNC; 24.308 + time_maxerror = NTP_PHASE_LIMIT; 24.309 + time_esterror = NTP_PHASE_LIMIT; 24.310 + 24.311 + /* Reset all our running time counts. They make no sense now. */ 24.312 + last_seen_tv.tv_sec = 0; 24.313 + last_update_from_xen = 0; 24.314 + 24.315 +#ifdef CONFIG_XEN_PRIVILEGED_GUEST 24.316 + if (xen_start_info.flags & SIF_INITDOMAIN) { 24.317 + dom0_op_t op; 24.318 + last_rtc_update = last_update_to_xen = 0; 24.319 + op.cmd = DOM0_SETTIME; 24.320 + op.u.settime.secs = xentime.tv_sec; 24.321 + op.u.settime.usecs = xentime.tv_nsec / NSEC_PER_USEC; 24.322 + op.u.settime.system_time = shadow_system_time; 24.323 + write_sequnlock_irq(&xtime_lock); 24.324 + HYPERVISOR_dom0_op(&op); 24.325 + } else 24.326 +#endif 24.327 + write_sequnlock_irq(&xtime_lock); 24.328 + 24.329 + clock_was_set(); 24.330 + return 0; 24.331 +} 24.332 + 24.333 +EXPORT_SYMBOL(do_settimeofday); 24.334 + 24.335 +#ifdef CONFIG_XEN_PRIVILEGED_GUEST 24.336 +static int set_rtc_mmss(unsigned long nowtime) 24.337 +{ 24.338 + int retval; 24.339 + 24.340 + /* gets recalled with irq locally disabled */ 24.341 + spin_lock(&rtc_lock); 24.342 + if (efi_enabled) 24.343 + retval = efi_set_rtc_mmss(nowtime); 24.344 + else 24.345 + retval = mach_set_rtc_mmss(nowtime); 24.346 + spin_unlock(&rtc_lock); 24.347 + 24.348 + return retval; 24.349 +} 24.350 +#endif 24.351 + 24.352 +/* monotonic_clock(): returns # of nanoseconds passed since time_init() 24.353 + * Note: This function is required to return accurate 24.354 + * time even in the absence of multiple timer ticks. 24.355 + */ 24.356 +unsigned long long monotonic_clock(void) 24.357 +{ 24.358 + return cur_timer->monotonic_clock(); 24.359 +} 24.360 +EXPORT_SYMBOL(monotonic_clock); 24.361 + 24.362 +#if defined(CONFIG_SMP) && defined(CONFIG_FRAME_POINTER) 24.363 +unsigned long profile_pc(struct pt_regs *regs) 24.364 +{ 24.365 + unsigned long pc = instruction_pointer(regs); 24.366 + 24.367 + if (in_lock_functions(pc)) 24.368 + return *(unsigned long *)(regs->ebp + 4); 24.369 + 24.370 + return pc; 24.371 +} 24.372 +EXPORT_SYMBOL(profile_pc); 24.373 +#endif 24.374 + 24.375 +/* 24.376 + * timer_interrupt() needs to keep up the real-time clock, 24.377 + * as well as call the "do_timer()" routine every clocktick 24.378 + */ 24.379 +static inline void do_timer_interrupt(int irq, void *dev_id, 24.380 + struct pt_regs *regs) 24.381 +{ 24.382 + time_t wtm_sec, sec; 24.383 + s64 delta, nsec; 24.384 + long sec_diff, wtm_nsec; 24.385 + 24.386 + do { 24.387 + __get_time_values_from_xen(); 24.388 + 24.389 + delta = (s64)(shadow_system_time + 24.390 + ((s64)cur_timer->get_offset() * 24.391 + (s64)NSEC_PER_USEC) - 24.392 + processed_system_time); 24.393 + } 24.394 + while (!TIME_VALUES_UP_TO_DATE); 24.395 + 24.396 + if (unlikely(delta < 0)) { 24.397 + printk("Timer ISR: Time went backwards: %lld %lld %lld %lld\n", 24.398 + delta, shadow_system_time, 24.399 + ((s64)cur_timer->get_offset() * (s64)NSEC_PER_USEC), 24.400 + processed_system_time); 24.401 + return; 24.402 + } 24.403 + 24.404 + /* Process elapsed jiffies since last call. */ 24.405 + while (delta >= NS_PER_TICK) { 24.406 + delta -= NS_PER_TICK; 24.407 + processed_system_time += NS_PER_TICK; 24.408 + do_timer(regs); 24.409 +#ifndef CONFIG_SMP 24.410 + update_process_times(user_mode(regs)); 24.411 +#endif 24.412 + if (regs) 24.413 + profile_tick(CPU_PROFILING, regs); 24.414 + } 24.415 + 24.416 + /* 24.417 + * Take synchronised time from Xen once a minute if we're not 24.418 + * synchronised ourselves, and we haven't chosen to keep an independent 24.419 + * time base. 24.420 + */ 24.421 + if (!INDEPENDENT_WALLCLOCK() && 24.422 + ((time_status & STA_UNSYNC) != 0) && 24.423 + (xtime.tv_sec > (last_update_from_xen + 60))) { 24.424 + /* Adjust shadow for jiffies that haven't updated xtime yet. */ 24.425 + shadow_tv.tv_usec -= 24.426 + (jiffies - wall_jiffies) * (USEC_PER_SEC / HZ); 24.427 + HANDLE_USEC_UNDERFLOW(shadow_tv); 24.428 + 24.429 + /* 24.430 + * Reset our running time counts if they are invalidated by 24.431 + * a warp backwards of more than 500ms. 24.432 + */ 24.433 + sec_diff = xtime.tv_sec - shadow_tv.tv_sec; 24.434 + if (unlikely(abs(sec_diff) > 1) || 24.435 + unlikely(((sec_diff * USEC_PER_SEC) + 24.436 + (xtime.tv_nsec / NSEC_PER_USEC) - 24.437 + shadow_tv.tv_usec) > 500000)) { 24.438 +#ifdef CONFIG_XEN_PRIVILEGED_GUEST 24.439 + last_rtc_update = last_update_to_xen = 0; 24.440 +#endif 24.441 + last_seen_tv.tv_sec = 0; 24.442 + } 24.443 + 24.444 + /* Update our unsynchronised xtime appropriately. */ 24.445 + sec = shadow_tv.tv_sec; 24.446 + nsec = shadow_tv.tv_usec * NSEC_PER_USEC; 24.447 + 24.448 + __normalize_time(&sec, &nsec); 24.449 + wtm_sec = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec); 24.450 + wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec); 24.451 + 24.452 + set_normalized_timespec(&xtime, sec, nsec); 24.453 + set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec); 24.454 + 24.455 + last_update_from_xen = sec; 24.456 + } 24.457 + 24.458 +#ifdef CONFIG_XEN_PRIVILEGED_GUEST 24.459 + if (!(xen_start_info.flags & SIF_INITDOMAIN)) 24.460 + return; 24.461 + 24.462 + /* Send synchronised time to Xen approximately every minute. */ 24.463 + if (((time_status & STA_UNSYNC) == 0) && 24.464 + (xtime.tv_sec > (last_update_to_xen + 60))) { 24.465 + dom0_op_t op; 24.466 + struct timeval tv; 24.467 + 24.468 + tv.tv_sec = xtime.tv_sec; 24.469 + tv.tv_usec = xtime.tv_nsec / NSEC_PER_USEC; 24.470 + tv.tv_usec += (jiffies - wall_jiffies) * (USEC_PER_SEC/HZ); 24.471 + HANDLE_USEC_OVERFLOW(tv); 24.472 + 24.473 + op.cmd = DOM0_SETTIME; 24.474 + op.u.settime.secs = tv.tv_sec; 24.475 + op.u.settime.usecs = tv.tv_usec; 24.476 + op.u.settime.system_time = shadow_system_time; 24.477 + HYPERVISOR_dom0_op(&op); 24.478 + 24.479 + last_update_to_xen = xtime.tv_sec; 24.480 + } 24.481 + 24.482 + /* 24.483 + * If we have an externally synchronized Linux clock, then update 24.484 + * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be 24.485 + * called as close as possible to 500 ms before the new second starts. 24.486 + */ 24.487 + if ((time_status & STA_UNSYNC) == 0 && 24.488 + xtime.tv_sec > last_rtc_update + 660 && 24.489 + (xtime.tv_nsec / 1000) 24.490 + >= USEC_AFTER - ((unsigned) TICK_SIZE) / 2 && 24.491 + (xtime.tv_nsec / 1000) 24.492 + <= USEC_BEFORE + ((unsigned) TICK_SIZE) / 2) { 24.493 + /* horrible...FIXME */ 24.494 + if (efi_enabled) { 24.495 + if (efi_set_rtc_mmss(xtime.tv_sec) == 0) 24.496 + last_rtc_update = xtime.tv_sec; 24.497 + else 24.498 + last_rtc_update = xtime.tv_sec - 600; 24.499 + } else if (set_rtc_mmss(xtime.tv_sec) == 0) 24.500 + last_rtc_update = xtime.tv_sec; 24.501 + else 24.502 + last_rtc_update = xtime.tv_sec - 600; /* do it again in 60 s */ 24.503 + } 24.504 +#endif 24.505 +} 24.506 + 24.507 +/* 24.508 + * This is the same as the above, except we _also_ save the current 24.509 + * Time Stamp Counter value at the time of the timer interrupt, so that 24.510 + * we later on can estimate the time of day more exactly. 24.511 + */ 24.512 +irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) 24.513 +{ 24.514 + /* 24.515 + * Here we are in the timer irq handler. We just have irqs locally 24.516 + * disabled but we don't know if the timer_bh is running on the other 24.517 + * CPU. We need to avoid to SMP race with it. NOTE: we don' t need 24.518 + * the irq version of write_lock because as just said we have irq 24.519 + * locally disabled. -arca 24.520 + */ 24.521 + write_seqlock(&xtime_lock); 24.522 + do_timer_interrupt(irq, NULL, regs); 24.523 + write_sequnlock(&xtime_lock); 24.524 + return IRQ_HANDLED; 24.525 +} 24.526 + 24.527 +/* not static: needed by APM */ 24.528 +unsigned long get_cmos_time(void) 24.529 +{ 24.530 + unsigned long retval; 24.531 + 24.532 + spin_lock(&rtc_lock); 24.533 + 24.534 + if (efi_enabled) 24.535 + retval = efi_get_time(); 24.536 + else 24.537 + retval = mach_get_cmos_time(); 24.538 + 24.539 + spin_unlock(&rtc_lock); 24.540 + 24.541 + return retval; 24.542 +} 24.543 + 24.544 +static long clock_cmos_diff, sleep_start; 24.545 + 24.546 +static int timer_suspend(struct sys_device *dev, u32 state) 24.547 +{ 24.548 + /* 24.549 + * Estimate time zone so that set_time can update the clock 24.550 + */ 24.551 + clock_cmos_diff = -get_cmos_time(); 24.552 + clock_cmos_diff += get_seconds(); 24.553 + sleep_start = get_cmos_time(); 24.554 + return 0; 24.555 +} 24.556 + 24.557 +static int timer_resume(struct sys_device *dev) 24.558 +{ 24.559 + unsigned long flags; 24.560 + unsigned long sec; 24.561 + unsigned long sleep_length; 24.562 + 24.563 +#ifdef CONFIG_HPET_TIMER 24.564 + if (is_hpet_enabled()) 24.565 + hpet_reenable(); 24.566 +#endif 24.567 + sec = get_cmos_time() + clock_cmos_diff; 24.568 + sleep_length = get_cmos_time() - sleep_start; 24.569 + write_seqlock_irqsave(&xtime_lock, flags); 24.570 + xtime.tv_sec = sec; 24.571 + xtime.tv_nsec = 0; 24.572 + write_sequnlock_irqrestore(&xtime_lock, flags); 24.573 + jiffies += sleep_length * HZ; 24.574 + return 0; 24.575 +} 24.576 + 24.577 +static struct sysdev_class timer_sysclass = { 24.578 + .resume = timer_resume, 24.579 + .suspend = timer_suspend, 24.580 + set_kset_name("timer"), 24.581 +}; 24.582 + 24.583 + 24.584 +/* XXX this driverfs stuff should probably go elsewhere later -john */ 24.585 +static struct sys_device device_timer = { 24.586 + .id = 0, 24.587 + .cls = &timer_sysclass, 24.588 +}; 24.589 + 24.590 +static int time_init_device(void) 24.591 +{ 24.592 + int error = sysdev_class_register(&timer_sysclass); 24.593 + if (!error) 24.594 + error = sysdev_register(&device_timer); 24.595 + return error; 24.596 +} 24.597 + 24.598 +device_initcall(time_init_device); 24.599 + 24.600 +#ifdef CONFIG_HPET_TIMER 24.601 +extern void (*late_time_init)(void); 24.602 +/* Duplicate of time_init() below, with hpet_enable part added */ 24.603 +void __init hpet_time_init(void) 24.604 +{ 24.605 + xtime.tv_sec = get_cmos_time(); 24.606 + wall_to_monotonic.tv_sec = -xtime.tv_sec; 24.607 + xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ); 24.608 + wall_to_monotonic.tv_nsec = -xtime.tv_nsec; 24.609 + 24.610 + if (hpet_enable() >= 0) { 24.611 + printk("Using HPET for base-timer\n"); 24.612 + } 24.613 + 24.614 + cur_timer = select_timer(); 24.615 + printk(KERN_INFO "Using %s for high-res timesource\n",cur_timer->name); 24.616 + 24.617 + time_init_hook(); 24.618 +} 24.619 +#endif 24.620 + 24.621 +/* Dynamically-mapped IRQ. */ 24.622 +static int TIMER_IRQ; 24.623 + 24.624 +static struct irqaction irq_timer = { 24.625 + timer_interrupt, SA_INTERRUPT, CPU_MASK_NONE, "timer", 24.626 + NULL, NULL 24.627 +}; 24.628 + 24.629 +void __init time_init(void) 24.630 +{ 24.631 +#ifdef CONFIG_HPET_TIMER 24.632 + if (is_hpet_capable()) { 24.633 + /* 24.634 + * HPET initialization needs to do memory-mapped io. So, let 24.635 + * us do a late initialization after mem_init(). 24.636 + */ 24.637 + late_time_init = hpet_time_init; 24.638 + return; 24.639 + } 24.640 +#endif 24.641 + __get_time_values_from_xen(); 24.642 + xtime.tv_sec = shadow_tv.tv_sec; 24.643 + wall_to_monotonic.tv_sec = -xtime.tv_sec; 24.644 + xtime.tv_nsec = shadow_tv.tv_usec * NSEC_PER_USEC; 24.645 + wall_to_monotonic.tv_nsec = -xtime.tv_nsec; 24.646 + processed_system_time = shadow_system_time; 24.647 + 24.648 + if (timer_tsc_init.init(NULL) != 0) 24.649 + BUG(); 24.650 + printk(KERN_INFO "Using %s for high-res timesource\n",cur_timer->name); 24.651 + 24.652 + TIMER_IRQ = bind_virq_to_irq(VIRQ_TIMER); 24.653 + 24.654 + (void)setup_irq(TIMER_IRQ, &irq_timer); 24.655 +} 24.656 + 24.657 +/* Convert jiffies to system time. Call with xtime_lock held for reading. */ 24.658 +static inline u64 __jiffies_to_st(unsigned long j) 24.659 +{ 24.660 + return processed_system_time + ((j - jiffies) * NS_PER_TICK); 24.661 +} 24.662 + 24.663 +/* 24.664 + * This function works out when the the next timer function has to be 24.665 + * executed (by looking at the timer list) and sets the Xen one-shot 24.666 + * domain timer to the appropriate value. This is typically called in 24.667 + * cpu_idle() before the domain blocks. 24.668 + * 24.669 + * The function returns a non-0 value on error conditions. 24.670 + * 24.671 + * It must be called with interrupts disabled. 24.672 + */ 24.673 +int set_timeout_timer(void) 24.674 +{ 24.675 + u64 alarm = 0; 24.676 + int ret = 0; 24.677 + 24.678 + /* 24.679 + * This is safe against long blocking (since calculations are 24.680 + * not based on TSC deltas). It is also safe against warped 24.681 + * system time since suspend-resume is cooperative and we 24.682 + * would first get locked out. It is safe against normal 24.683 + * updates of jiffies since interrupts are off. 24.684 + */ 24.685 + alarm = __jiffies_to_st(next_timer_interrupt()); 24.686 + 24.687 + /* Failure is pretty bad, but we'd best soldier on. */ 24.688 + if ( HYPERVISOR_set_timer_op(alarm) != 0 ) 24.689 + ret = -1; 24.690 + 24.691 + return ret; 24.692 +} 24.693 + 24.694 +void time_suspend(void) 24.695 +{ 24.696 + /* nothing */ 24.697 +} 24.698 + 24.699 +/* No locking required. We are only CPU running, and interrupts are off. */ 24.700 +void time_resume(void) 24.701 +{ 24.702 + if (timer_tsc_init.init(NULL) != 0) 24.703 + BUG(); 24.704 + 24.705 + /* Get timebases for new environment. */ 24.706 + __get_time_values_from_xen(); 24.707 + 24.708 + /* Reset our own concept of passage of system time. */ 24.709 + processed_system_time = shadow_system_time; 24.710 + 24.711 + /* Accept a warp in UTC (wall-clock) time. */ 24.712 + last_seen_tv.tv_sec = 0; 24.713 + 24.714 + /* Make sure we resync UTC time with Xen on next timer interrupt. */ 24.715 + last_update_from_xen = 0; 24.716 +} 24.717 + 24.718 +/* 24.719 + * /proc/sys/xen: This really belongs in another file. It can stay here for 24.720 + * now however. 24.721 + */ 24.722 +static ctl_table xen_subtable[] = { 24.723 + {1, "independent_wallclock", &independent_wallclock, 24.724 + sizeof(independent_wallclock), 0644, NULL, proc_dointvec}, 24.725 + {0} 24.726 +}; 24.727 +static ctl_table xen_table[] = { 24.728 + {123, "xen", NULL, 0, 0555, xen_subtable}, 24.729 + {0} 24.730 +}; 24.731 +static int __init xen_sysctl_init(void) 24.732 +{ 24.733 + (void)register_sysctl_table(xen_table, 0); 24.734 + return 0; 24.735 +} 24.736 +__initcall(xen_sysctl_init);
25.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 25.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/timers/Makefile Fri Nov 19 23:17:26 2004 +0000 25.3 @@ -0,0 +1,17 @@ 25.4 +# 25.5 +# Makefile for x86 timers 25.6 +# 25.7 + 25.8 +XENARCH := $(subst ",,$(CONFIG_XENARCH)) 25.9 + 25.10 +obj-y := timer_tsc.o 25.11 +c-obj-y := 25.12 + 25.13 +c-link := 25.14 + 25.15 +$(patsubst %.o,$(obj)/%.c,$(c-obj-y) $(c-link)): 25.16 + @ln -fsn $(srctree)/arch/i386/kernel/timers/$(notdir $@) $@ 25.17 + 25.18 +obj-y += $(c-obj-y) 25.19 + 25.20 +clean-files += $(patsubst %.o,%.c,$(c-obj-y) $(c-obj-) $(c-link))
26.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 26.2 +++ b/linux-2.6.10-rc2-xen-sparse/arch/xen/i386/kernel/timers/timer_tsc.c Fri Nov 19 23:17:26 2004 +0000 26.3 @@ -0,0 +1,379 @@ 26.4 +/* 26.5 + * This code largely moved from arch/i386/kernel/time.c. 26.6 + * See comments there for proper credits. 26.7 + */ 26.8 + 26.9 +#include <linux/spinlock.h> 26.10 +#include <linux/init.h> 26.11 +#include <linux/timex.h> 26.12 +#include <linux/errno.h> 26.13 +#include <linux/cpufreq.h> 26.14 +#include <linux/string.h> 26.15 +#include <linux/jiffies.h> 26.16 + 26.17 +#include <asm/timer.h> 26.18 +#include <asm/io.h> 26.19 +/* processor.h for distable_tsc flag */ 26.20 +#include <asm/processor.h> 26.21 + 26.22 +#include "io_ports.h" 26.23 +#include "mach_timer.h" 26.24 + 26.25 +#include <asm/hpet.h> 26.26 + 26.27 +#ifdef CONFIG_HPET_TIMER 26.28 +static unsigned long hpet_usec_quotient; 26.29 +static unsigned long hpet_last; 26.30 +static struct timer_opts timer_tsc; 26.31 +#endif 26.32 + 26.33 +static inline void cpufreq_delayed_get(void); 26.34 + 26.35 +int tsc_disable __initdata = 0; 26.36 + 26.37 +extern spinlock_t i8253_lock; 26.38 + 26.39 +static int use_tsc; 26.40 + 26.41 +static unsigned long long monotonic_base; 26.42 +static u32 monotonic_offset; 26.43 +static seqlock_t monotonic_lock = SEQLOCK_UNLOCKED; 26.44