ia64/xen-unstable
changeset 235:d7d0a23b2e07
bitkeeper revision 1.93 (3e5a4e6bkPheUp3x1uufN2MS3LAB7A)
Latest and Greatest version of XenoLinux based on the Linux-2.4.21-pre4
kernel.
Latest and Greatest version of XenoLinux based on the Linux-2.4.21-pre4
kernel.
line diff
1.1 --- a/.bk-to-hg Mon Feb 24 15:50:12 2003 +0000 1.2 +++ b/.bk-to-hg Mon Feb 24 16:55:07 2003 +0000 1.3 @@ -1,6 +1,6 @@ 1.4 #!/bin/sh -x 1.5 set -e 1.6 -test -L xenolinux-2.4.16-sparse/include/asm-xeno/hypervisor-ifs 1.7 -rm xenolinux-2.4.16-sparse/include/asm-xeno/hypervisor-ifs 1.8 +test -L old/xenolinux-2.4.16-sparse/include/asm-xeno/hypervisor-ifs 1.9 +rm old/xenolinux-2.4.16-sparse/include/asm-xeno/hypervisor-ifs 1.10 (find -depth -type d -print | xargs -r rmdir 2>/dev/null) || true 1.11 exit 0
2.1 --- a/.hg-to-bk Mon Feb 24 15:50:12 2003 +0000 2.2 +++ b/.hg-to-bk Mon Feb 24 16:55:07 2003 +0000 2.3 @@ -1,8 +1,9 @@ 2.4 #!/bin/sh -x 2.5 set -e 2.6 -mkdir -p xenolinux-2.4.16-sparse 2.7 -mkdir -p xenolinux-2.4.16-sparse/include 2.8 -mkdir -p xenolinux-2.4.16-sparse/include/asm-xeno 2.9 -ln -s ../../../xen-2.4.16/include/hypervisor-ifs xenolinux-2.4.16-sparse/include/asm-xeno/hypervisor-ifs 2.10 +mkdir -p old 2.11 +mkdir -p old/xenolinux-2.4.16-sparse 2.12 +mkdir -p old/xenolinux-2.4.16-sparse/include 2.13 +mkdir -p old/xenolinux-2.4.16-sparse/include/asm-xeno 2.14 +ln -s ../../../xen-2.4.16/include/hypervisor-ifs old/xenolinux-2.4.16-sparse/include/asm-xeno/hypervisor-ifs 2.15 (find -depth -type d -print | xargs -r rmdir 2>/dev/null) || true 2.16 exit 0
3.1 --- a/.rootkeys Mon Feb 24 15:50:12 2003 +0000 3.2 +++ b/.rootkeys Mon Feb 24 16:55:07 2003 +0000 3.3 @@ -1,6 +1,181 @@ 3.4 3ddb6b0bKlMz_dz-M59a1mkUa1lASw BitKeeper/etc/config 3.5 3ddb6b0buTaC5zg1_a8FoAR9FWi_mw BitKeeper/etc/ignore 3.6 3ddb79c9_hgSp-gsQm8HqWM_9W3B_A BitKeeper/etc/logging_ok 3.7 +3ddb79bbYMXGmQTsr5BeGS_RuZ5f_w old/xenolinux-2.4.16-sparse/Makefile 3.8 +3ddb79b7e0ssyz3Q1GoqjDds-x1PLQ old/xenolinux-2.4.16-sparse/arch/xeno/Makefile 3.9 +3ddb79b7_rLvYZU3tOY6Wwuw_Sg3_w old/xenolinux-2.4.16-sparse/arch/xeno/boot/Makefile 3.10 +3ddb79b8L4xnwrcvWk6nAbgKVbNkSA old/xenolinux-2.4.16-sparse/arch/xeno/config.in 3.11 +3ddb79b7v_Be34as7_mlzFlw65hOjQ old/xenolinux-2.4.16-sparse/arch/xeno/defconfig 3.12 +3ddb79b7KUvtx0knQJoRaBDZQeNidg old/xenolinux-2.4.16-sparse/arch/xeno/drivers/block/Makefile 3.13 +3e4a8cb7JECr--r1ipnrkd7NKdbUqQ old/xenolinux-2.4.16-sparse/arch/xeno/drivers/block/xl_block.c 3.14 +3e4a8cb7SLWsLTXQjv7ng6-3hL4pCA old/xenolinux-2.4.16-sparse/arch/xeno/drivers/block/xl_block_test.c 3.15 +3ddb79b7LLVJBGynxHSOh9A9l97sug old/xenolinux-2.4.16-sparse/arch/xeno/drivers/console/Makefile 3.16 +3ddb79b7UG2QiRAU-Wvc1Y_BLigu1Q old/xenolinux-2.4.16-sparse/arch/xeno/drivers/console/console.c 3.17 +3ddb79b75eo4PRXkT6Th9popt_SJhg old/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/Makefile 3.18 +3e4a8cb79dT0F4q5T4GEqMj4CtAquQ old/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_block.c 3.19 +3ddb79b7Xyaoep6U0kLvx6Kx7OauDw old/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_core.c 3.20 +3df9ce13K7qSLBtHV-01QHPW62649Q old/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_memory.c 3.21 +3ddb79b7PulSkF9m3c7K5MkxHRf4hA old/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_ops.h 3.22 +3ddba759XOjcl_OF-52dOYq7sgMykQ old/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/vfr.c 3.23 +3ddb79b7s7yYBioHidSkIoHtQxYmOw old/xenolinux-2.4.16-sparse/arch/xeno/drivers/network/Makefile 3.24 +3ddb79b7CpLL98ScdpbKkVBktlbCtQ old/xenolinux-2.4.16-sparse/arch/xeno/drivers/network/network.c 3.25 +3ddb79b7hqi9krq6h98lnpONHGzvEA old/xenolinux-2.4.16-sparse/arch/xeno/kernel/Makefile 3.26 +3ddb79b7eyEv5bsN8EQkjIG0y11Q1A old/xenolinux-2.4.16-sparse/arch/xeno/kernel/entry.S 3.27 +3ddb79b70XAg9bJwp0-DWHe0LtzlBw old/xenolinux-2.4.16-sparse/arch/xeno/kernel/head.S 3.28 +3ddb79b7dDsKjU22VxQ-C5BMFaMUmw old/xenolinux-2.4.16-sparse/arch/xeno/kernel/hypervisor.c 3.29 +3ddb79b7xzwEc8-lo1vu3BxB-gBURQ old/xenolinux-2.4.16-sparse/arch/xeno/kernel/i386_ksyms.c 3.30 +3ddb79b7i7pfPEcy_zjDfW9JHD305g old/xenolinux-2.4.16-sparse/arch/xeno/kernel/i387.c 3.31 +3ddb79b7Ti2i5ztQzM-w67zN-cJD8A old/xenolinux-2.4.16-sparse/arch/xeno/kernel/init_task.c 3.32 +3ddb79b7MEQGMZrsF94atNJZ4-OGzA old/xenolinux-2.4.16-sparse/arch/xeno/kernel/ioport.c 3.33 +3ddb79b7DOz-Mz5jsjRd5W8jN0XbPw old/xenolinux-2.4.16-sparse/arch/xeno/kernel/irq.c 3.34 +3ddb79b7bOAPk_YAUUsruhVGO2GOOg old/xenolinux-2.4.16-sparse/arch/xeno/kernel/ldt.c 3.35 +3ddb79b7qf2WK6vMKcmOLIeKN5GSjg old/xenolinux-2.4.16-sparse/arch/xeno/kernel/process.c 3.36 +3ddb79b7HdaBR7yk_u51auihbr31aQ old/xenolinux-2.4.16-sparse/arch/xeno/kernel/ptrace.c 3.37 +3ddb79b7yJunvnrgWD2VTy6yot0PMg old/xenolinux-2.4.16-sparse/arch/xeno/kernel/semaphore.c 3.38 +3ddb79b7BIitpVygiksiMBQYvh5Z2A old/xenolinux-2.4.16-sparse/arch/xeno/kernel/setup.c 3.39 +3ddb79b7DTevmwhNla67jZxjBSIKFg old/xenolinux-2.4.16-sparse/arch/xeno/kernel/signal.c 3.40 +3ddb79b76mCf-gZPR4KLjL8ktZ37GA old/xenolinux-2.4.16-sparse/arch/xeno/kernel/sys_i386.c 3.41 +3ddb79b7xDsEKErRFeqcSm6eRrTEIg old/xenolinux-2.4.16-sparse/arch/xeno/kernel/time.c 3.42 +3ddb79b7V4dv_KAQu4Msa2Ebhd0aKw old/xenolinux-2.4.16-sparse/arch/xeno/kernel/traps.c 3.43 +3ddb79b8oUnwncDaZuRWF3-n3jPsIA old/xenolinux-2.4.16-sparse/arch/xeno/lib/Makefile 3.44 +3ddb79b8BMxi8qW3_NT44SSd1uMD3Q old/xenolinux-2.4.16-sparse/arch/xeno/lib/checksum.S 3.45 +3ddb79b8WcWel2g9zU9pBJb-yA8jBw old/xenolinux-2.4.16-sparse/arch/xeno/lib/dec_and_lock.c 3.46 +3ddb79b8oxeiaIW6Au95OM0GlsMrMw old/xenolinux-2.4.16-sparse/arch/xeno/lib/delay.c 3.47 +3ddb79b8XPasnRhvK-_6xYksf3S6qA old/xenolinux-2.4.16-sparse/arch/xeno/lib/getuser.S 3.48 +3ddb79b8HFLUh8mwcl4X44ta-ny1KA old/xenolinux-2.4.16-sparse/arch/xeno/lib/iodebug.c 3.49 +3ddb79b879qeoLlarHXvNIDEva6ssA old/xenolinux-2.4.16-sparse/arch/xeno/lib/memcpy.c 3.50 +3ddb79b869CY_yr4HymV6k98pfpMgg old/xenolinux-2.4.16-sparse/arch/xeno/lib/mmx.c 3.51 +3ddb79b8S77yf1--Qa4C0ZYmqKXCww old/xenolinux-2.4.16-sparse/arch/xeno/lib/old-checksum.c 3.52 +3ddb79b8ffZ79cU2ZzfA2ekeo6pqeg old/xenolinux-2.4.16-sparse/arch/xeno/lib/strstr.c 3.53 +3ddb79b82kQ5oIXpxq3TUmlgxsLzLg old/xenolinux-2.4.16-sparse/arch/xeno/lib/usercopy.c 3.54 +3ddb79b8qdD_svLCCAja_oP2w4Tn8Q old/xenolinux-2.4.16-sparse/arch/xeno/mm/Makefile 3.55 +3ddb79b8ukY8dsPYmR8eNk-aCzFPsQ old/xenolinux-2.4.16-sparse/arch/xeno/mm/extable.c 3.56 +3ddb79b856Zta9b3s0bgUCGbG1blvQ old/xenolinux-2.4.16-sparse/arch/xeno/mm/fault.c 3.57 +3df9ce13dZ6UGDjZbUeZfyH4Hy6aCA old/xenolinux-2.4.16-sparse/arch/xeno/mm/get_unmapped_area.c 3.58 +3ddb79b85fpsKT8A9WYnuJg03b715g old/xenolinux-2.4.16-sparse/arch/xeno/mm/hypervisor.c 3.59 +3ddb79b83Zj7Xn2QVhU4HeMuAC9FjA old/xenolinux-2.4.16-sparse/arch/xeno/mm/init.c 3.60 +3df9ce13TRWIv0Mawm15zESP7jcT7A old/xenolinux-2.4.16-sparse/arch/xeno/mm/mmu_context.c 3.61 +3ddb79b7aKdTkbr3u6aze8tVwGh_TQ old/xenolinux-2.4.16-sparse/arch/xeno/vmlinux.lds 3.62 +3e4a8cb7lpFFwT1Iu9zXWc8Ew4klFA old/xenolinux-2.4.16-sparse/drivers/block/Config.in 3.63 +3ddb79bbx682YH6vR2zbVOXwg73ULg old/xenolinux-2.4.16-sparse/drivers/block/ll_rw_blk.c 3.64 +3ddb79bcJfHdwrPsjqgI33_OsGdVCg old/xenolinux-2.4.16-sparse/drivers/block/rd.c 3.65 +3ddb79bcpVu-IbnqwQqpRqsEbLpsuw old/xenolinux-2.4.16-sparse/drivers/char/tty_io.c 3.66 +3e15d5273gfR2fbcYe05kqBSAvCX_w old/xenolinux-2.4.16-sparse/fs/exec.c 3.67 +3ddb79b8VFtfWSCrXKPN2K21zd_vtw old/xenolinux-2.4.16-sparse/include/asm-xeno/a.out.h 3.68 +3ddb79b8Zzi13p3OAPV25QgiC3THAQ old/xenolinux-2.4.16-sparse/include/asm-xeno/apic.h 3.69 +3ddb79baZDlsdV_m6C5CXnWMl15p1g old/xenolinux-2.4.16-sparse/include/asm-xeno/apicdef.h 3.70 +3ddb79baZM88u4CnriVA8ZXBdnMNvg old/xenolinux-2.4.16-sparse/include/asm-xeno/atomic.h 3.71 +3ddb79baYHyZsDCiXiq8Y8_XxHE-jQ old/xenolinux-2.4.16-sparse/include/asm-xeno/bitops.h 3.72 +3ddb79b8vFGtGb6pg3GZFXSiwOZfcg old/xenolinux-2.4.16-sparse/include/asm-xeno/boot.h 3.73 +3ddb79baW8tf6PiBQUF50QQM5nY9sw old/xenolinux-2.4.16-sparse/include/asm-xeno/bugs.h 3.74 +3ddb79b80msOlzTZRoVudYdemzgOlA old/xenolinux-2.4.16-sparse/include/asm-xeno/byteorder.h 3.75 +3ddb79b8brNSUEujnq8f_zr8kA-cUg old/xenolinux-2.4.16-sparse/include/asm-xeno/cache.h 3.76 +3ddb79bayhr6C6prVhAYlFRChhf3wg old/xenolinux-2.4.16-sparse/include/asm-xeno/checksum.h 3.77 +3ddb79b8RNUaDbpPjdVVwKAsbiTBKQ old/xenolinux-2.4.16-sparse/include/asm-xeno/cpufeature.h 3.78 +3ddb79b8pJe4aNsUKkfHEoBT9Y-UMA old/xenolinux-2.4.16-sparse/include/asm-xeno/current.h 3.79 +3ddb79b8KL7icUfxKRoWDIkHkLQ1kQ old/xenolinux-2.4.16-sparse/include/asm-xeno/debugreg.h 3.80 +3ddb79baDUP_cRdFgqaH0rXUvMxx4A old/xenolinux-2.4.16-sparse/include/asm-xeno/delay.h 3.81 +3ddb79b89CgBTFsS3joEJ1ZniSHEgA old/xenolinux-2.4.16-sparse/include/asm-xeno/desc.h 3.82 +3ddb79ba6xyT4mJOYSp1Fg2l0ta93A old/xenolinux-2.4.16-sparse/include/asm-xeno/div64.h 3.83 +3ddb79b80Z4ZUIqbD1Xu_t4OCuEHeQ old/xenolinux-2.4.16-sparse/include/asm-xeno/dma.h 3.84 +3ddb79bac26NkKcPIEsfxETc5Snyag old/xenolinux-2.4.16-sparse/include/asm-xeno/elf.h 3.85 +3ddb79ba722pCJ_g_xI8ebsE31IK-Q old/xenolinux-2.4.16-sparse/include/asm-xeno/errno.h 3.86 +3ddb79b8vIpUpgaSNEneFkg5hYSvNg old/xenolinux-2.4.16-sparse/include/asm-xeno/fcntl.h 3.87 +3e53dbfb9mmyM-y5NuBBTDJvQkDzjA old/xenolinux-2.4.16-sparse/include/asm-xeno/fixmap.h 3.88 +3ddb79b8780YvqvK1g5KPIWzQ6P15w old/xenolinux-2.4.16-sparse/include/asm-xeno/floppy.h 3.89 +3ddb79bas-nFywnmilbUeT34PEAA0g old/xenolinux-2.4.16-sparse/include/asm-xeno/hardirq.h 3.90 +3ddb79batzR40ZFY9dvgs5f1aM9I6g old/xenolinux-2.4.16-sparse/include/asm-xeno/hdreg.h 3.91 +3ddb79b90xBgbeYgCcImS2ZxJakxBA old/xenolinux-2.4.16-sparse/include/asm-xeno/highmem.h 3.92 +3ddb79baXLZV3dUKQI2gIYpAy67RuA old/xenolinux-2.4.16-sparse/include/asm-xeno/hw_irq.h 3.93 +3e00b957iYsdTI1x6THRwMoWSPIW2Q old/xenolinux-2.4.16-sparse/include/asm-xeno/hypervisor-ifs 3.94 +3ddb79bapQ9Z9ewa5O1pqAVaNBTazg old/xenolinux-2.4.16-sparse/include/asm-xeno/hypervisor.h 3.95 +3ddb79baL-pjPI8hg5xjPgd4__SlOA old/xenolinux-2.4.16-sparse/include/asm-xeno/i387.h 3.96 +3ddb79ba66TwvG7HpbBo04fRhmj3KQ old/xenolinux-2.4.16-sparse/include/asm-xeno/ide.h 3.97 +3ddb79bahFfCuRcmd9kBYA-CuGtCSg old/xenolinux-2.4.16-sparse/include/asm-xeno/init.h 3.98 +3ddb79ba3wnwflaNW6QheYvxoj5S8Q old/xenolinux-2.4.16-sparse/include/asm-xeno/io.h 3.99 +3ddb79ba1MhHpElCXFlijej2zWVk4g old/xenolinux-2.4.16-sparse/include/asm-xeno/io_apic.h 3.100 +3ddb79baiyfcZN9rJwhq0UeFjI6GkQ old/xenolinux-2.4.16-sparse/include/asm-xeno/ioctl.h 3.101 +3ddb79badReKYSok3yHShb4jg0vA-A old/xenolinux-2.4.16-sparse/include/asm-xeno/ioctls.h 3.102 +3ddb79b9iuIxteTXg8_myIsrWF5uxg old/xenolinux-2.4.16-sparse/include/asm-xeno/ipc.h 3.103 +3ddb79baw5Dxo78880UMSanDV70WdA old/xenolinux-2.4.16-sparse/include/asm-xeno/ipcbuf.h 3.104 +3ddb79ban9FUBuEaznRZvPfry3xnHQ old/xenolinux-2.4.16-sparse/include/asm-xeno/irq.h 3.105 +3ddb79banJ5r-mqE7LZ8nPGTADaGBA old/xenolinux-2.4.16-sparse/include/asm-xeno/kdb.h 3.106 +3ddb79baoaoHGTW0oiBXFPUg4KWydw old/xenolinux-2.4.16-sparse/include/asm-xeno/kdbprivate.h 3.107 +3ddb79bam2K6c7tS2HX6jis2Bqx71w old/xenolinux-2.4.16-sparse/include/asm-xeno/keyboard.h 3.108 +3ddb79baQ8gGrZm2Jlo3I1ntD0H5HA old/xenolinux-2.4.16-sparse/include/asm-xeno/kmap_types.h 3.109 +3ddb79b9MeQEYrafy-Mx9OoeVFM_uw old/xenolinux-2.4.16-sparse/include/asm-xeno/ldt.h 3.110 +3ddb79baAsy5W-cJ9ML_w9chqqUh4A old/xenolinux-2.4.16-sparse/include/asm-xeno/linux_logo.h 3.111 +3ddb79b9uhsumPVE0wGgarfIkYDSFA old/xenolinux-2.4.16-sparse/include/asm-xeno/locks.h 3.112 +3ddb79b954ISbF9e68hB0WTulCJRgg old/xenolinux-2.4.16-sparse/include/asm-xeno/math_emu.h 3.113 +3ddb79b9EZDlC6RGn_y0OYr0nyQWlw old/xenolinux-2.4.16-sparse/include/asm-xeno/mc146818rtc.h 3.114 +3ddb79b9M6pTF4maDgh8TYbg_HHUbw old/xenolinux-2.4.16-sparse/include/asm-xeno/mca_dma.h 3.115 +3ddb79baA7dlps8FkicOUEXKEQuQsA old/xenolinux-2.4.16-sparse/include/asm-xeno/mman.h 3.116 +3ddb79baKfF36-eRvkxnEvMRQRai-w old/xenolinux-2.4.16-sparse/include/asm-xeno/mmu.h 3.117 +3ddb79baQyKbT5U4EmZNePY9Txp-tA old/xenolinux-2.4.16-sparse/include/asm-xeno/mmu_context.h 3.118 +3ddb79bberC3Ghs4vy-06Pu-LSiWtw old/xenolinux-2.4.16-sparse/include/asm-xeno/mmx.h 3.119 +3ddb79bbsJLF10xQcKDoV8f_7gcOXg old/xenolinux-2.4.16-sparse/include/asm-xeno/module.h 3.120 +3ddb79bbY5RffJ8_F1oC4VI7q3Eejg old/xenolinux-2.4.16-sparse/include/asm-xeno/mpspec.h 3.121 +3ddb79b90vB4Vzzy_wL6SYXQMy9N9Q old/xenolinux-2.4.16-sparse/include/asm-xeno/msgbuf.h 3.122 +3ddb79bbZ5a_vTk0xcgOHuPokaqwMw old/xenolinux-2.4.16-sparse/include/asm-xeno/msr.h 3.123 +3ddb79b9y1xAKaPiBd79MBcCopNNYw old/xenolinux-2.4.16-sparse/include/asm-xeno/mtrr.h 3.124 +3ddb79b90hX0QBJlWQN_VsHtX5Ijkw old/xenolinux-2.4.16-sparse/include/asm-xeno/namei.h 3.125 +3ddb79bbG2p9MNq7tuISz8md1Oj2lg old/xenolinux-2.4.16-sparse/include/asm-xeno/page.h 3.126 +3ddb79bb_iUa2piFSwaB8YPw-rB5SQ old/xenolinux-2.4.16-sparse/include/asm-xeno/param.h 3.127 +3ddb79b9Y8UU0S9AoDznoqqcYxg9-A old/xenolinux-2.4.16-sparse/include/asm-xeno/parport.h 3.128 +3ddb79b9K9_edWxBHS7TdCpyDmfp6g old/xenolinux-2.4.16-sparse/include/asm-xeno/pgalloc.h 3.129 +3ddb79bahaS_P3UYp9VEU6kHxXbajA old/xenolinux-2.4.16-sparse/include/asm-xeno/pgtable-2level.h 3.130 +3ddb79b9MjXUB_rk29GJgaNY24feCw old/xenolinux-2.4.16-sparse/include/asm-xeno/pgtable-3level.h 3.131 +3ddb79bbPF2ENpNHBru8K3hyYVPmkQ old/xenolinux-2.4.16-sparse/include/asm-xeno/pgtable.h 3.132 +3ddb79b9t9xKrOf8aP3X5jEit9tj-w old/xenolinux-2.4.16-sparse/include/asm-xeno/poll.h 3.133 +3ddb79b9xHtTDWFaI9ncAtxyUth0Yg old/xenolinux-2.4.16-sparse/include/asm-xeno/posix_types.h 3.134 +3ddb79b9VwZ9YsSpA7CkJmYXVadrCA old/xenolinux-2.4.16-sparse/include/asm-xeno/processor.h 3.135 +3ddb79bbKaOkHrGG9j05AGlii-voaQ old/xenolinux-2.4.16-sparse/include/asm-xeno/ptrace.h 3.136 +3ddb79bbVpJCVTXmc2yNf1rsC00YEg old/xenolinux-2.4.16-sparse/include/asm-xeno/resource.h 3.137 +3ddb79bbtU0Kh27NbNpqKAIhshJvXQ old/xenolinux-2.4.16-sparse/include/asm-xeno/rwlock.h 3.138 +3ddb79b97LhdmW6hYmybQOPDkK6plg old/xenolinux-2.4.16-sparse/include/asm-xeno/rwsem.h 3.139 +3ddb79bbgRzM1NoXYbLoOCbZt8s5NA old/xenolinux-2.4.16-sparse/include/asm-xeno/scatterlist.h 3.140 +3ddb79b9xCi3F80Z6xxx6nzkCAo8vQ old/xenolinux-2.4.16-sparse/include/asm-xeno/segment.h 3.141 +3ddb79b9WxySbCKDoMgTgPtn1G3BFw old/xenolinux-2.4.16-sparse/include/asm-xeno/semaphore.h 3.142 +3ddb79b9gNK3dtgXONloSBaNgZPjAg old/xenolinux-2.4.16-sparse/include/asm-xeno/sembuf.h 3.143 +3ddb79bb2UTDgfwju2J3weDXemw3LA old/xenolinux-2.4.16-sparse/include/asm-xeno/serial.h 3.144 +3ddb79bbAPFyA_n4dNVCRoee8obOKA old/xenolinux-2.4.16-sparse/include/asm-xeno/setup.h 3.145 +3ddb79b9XTOB5DwWBGzPLLR4rNEkDQ old/xenolinux-2.4.16-sparse/include/asm-xeno/shmbuf.h 3.146 +3ddb79b9-_jDlAj3qVZe4opi3zectQ old/xenolinux-2.4.16-sparse/include/asm-xeno/shmparam.h 3.147 +3ddb79b9AW75ErwlTRX4McxO15sEaQ old/xenolinux-2.4.16-sparse/include/asm-xeno/sigcontext.h 3.148 +3ddb79b9NBJW-KAI3mgveUCr7sIOwA old/xenolinux-2.4.16-sparse/include/asm-xeno/siginfo.h 3.149 +3ddb79bbj0i8tUVNMKtZVrLJqv3Nsw old/xenolinux-2.4.16-sparse/include/asm-xeno/signal.h 3.150 +3ddb79bbfAmpotdy-No2dwGez2fnIg old/xenolinux-2.4.16-sparse/include/asm-xeno/smp.h 3.151 +3ddb79b9pDERXiqSumFWMTFJ1X9xIw old/xenolinux-2.4.16-sparse/include/asm-xeno/smplock.h 3.152 +3ddb79bbuCOIWTlWEHgOTexEBbdDow old/xenolinux-2.4.16-sparse/include/asm-xeno/socket.h 3.153 +3ddb79b9ExeUznVBlSn1e2nvOCrJ4A old/xenolinux-2.4.16-sparse/include/asm-xeno/sockios.h 3.154 +3ddb79b9kL3xvucBb-Gmg4_vo-99vw old/xenolinux-2.4.16-sparse/include/asm-xeno/softirq.h 3.155 +3ddb79b9rJ8AfSzGzA0arI8mazYLlQ old/xenolinux-2.4.16-sparse/include/asm-xeno/spinlock.h 3.156 +3ddb79bbXaA_zUHNPkAKRNz1h0gIJw old/xenolinux-2.4.16-sparse/include/asm-xeno/stat.h 3.157 +3ddb79b9G004IlCplrjWgF1aXbp8dA old/xenolinux-2.4.16-sparse/include/asm-xeno/statfs.h 3.158 +3ddb79bbRsy3GlCFrQEbVMVp--xlwQ old/xenolinux-2.4.16-sparse/include/asm-xeno/string-486.h 3.159 +3ddb79bb4xug4cDph6ODLQFQIan_sg old/xenolinux-2.4.16-sparse/include/asm-xeno/string.h 3.160 +3ddb79b9JhjJtJUO3g5LmrHPkdxgKg old/xenolinux-2.4.16-sparse/include/asm-xeno/system.h 3.161 +3ddb79b9tbjCU9zSbqKbbv4m8tijlg old/xenolinux-2.4.16-sparse/include/asm-xeno/termbits.h 3.162 +3ddb79bbi0mW10tH4xX1_KHXKM_xPg old/xenolinux-2.4.16-sparse/include/asm-xeno/termios.h 3.163 +3ddb79b9JuR1VvNzlkyMlA-Dnlmy9Q old/xenolinux-2.4.16-sparse/include/asm-xeno/timex.h 3.164 +3ddb79b9Bofq-p3sCTF0ELVuf_iBYA old/xenolinux-2.4.16-sparse/include/asm-xeno/tlb.h 3.165 +3ddb79b9tpBUqS8-S6euSqyk2hFkKg old/xenolinux-2.4.16-sparse/include/asm-xeno/types.h 3.166 +3ddb79bb5bkAaEzD7pdqQZdWyA_0eQ old/xenolinux-2.4.16-sparse/include/asm-xeno/uaccess.h 3.167 +3ddb79bbiDIz1dxgFixHKyGuqRqfDQ old/xenolinux-2.4.16-sparse/include/asm-xeno/ucontext.h 3.168 +3ddb79ba_Smn-GiYtr5ZTMaZXn-AHg old/xenolinux-2.4.16-sparse/include/asm-xeno/unaligned.h 3.169 +3ddb79bb3cMSs_k2X5Oq2hOIBvmPYA old/xenolinux-2.4.16-sparse/include/asm-xeno/unistd.h 3.170 +3ddb79ba2qYtIQAT_-vCFkkZUXu_UQ old/xenolinux-2.4.16-sparse/include/asm-xeno/user.h 3.171 +3ddb79bbqhb9X9qWOz5Bv4wOzrkITg old/xenolinux-2.4.16-sparse/include/asm-xeno/vga.h 3.172 +3ddb79bbA52x94o6uwDYsbzrH2hjzA old/xenolinux-2.4.16-sparse/include/asm-xeno/xor.h 3.173 +3e4a8cb7ON8EclY3NN3YPXyMT941hA old/xenolinux-2.4.16-sparse/include/linux/blk.h 3.174 +3e4a8cb7GJrKD0z7EF0VZOhdEa01Mw old/xenolinux-2.4.16-sparse/include/linux/major.h 3.175 +3ddb79bb_7YG4U75ZmEic9YXWTW7Vw old/xenolinux-2.4.16-sparse/include/linux/sunrpc/debug.h 3.176 +3e4a8cb7j05wwb1uPZgY16s68o7qAw old/xenolinux-2.4.16-sparse/init/main.c 3.177 +3ddb79bcxkVPfWlZ1PQKvDrfArzOVw old/xenolinux-2.4.16-sparse/kernel/panic.c 3.178 +3ddb79bbP31im-mx2NbfthSeqty1Dg old/xenolinux-2.4.16-sparse/mk 3.179 +3e15d52e0_j129JPvo7xfYGndVFpwQ old/xenolinux-2.4.16-sparse/mm/memory.c 3.180 +3e15d535DLvpzTrLRUIerB69LpJD1g old/xenolinux-2.4.16-sparse/mm/mremap.c 3.181 +3e15d531m1Y1_W8ki64AFOU_ua4C4w old/xenolinux-2.4.16-sparse/mm/swapfile.c 3.182 3e4d00468-FN2VDeEHo96zxrMHK_mA tools/domain_builder/Makefile 3.183 3e4d0046SPau_y0sw2WLJz8QkqNoRA tools/domain_builder/README 3.184 3e4d0046bbdH0GsI9J_1Eb4ZQHfIiQ tools/domain_builder/dom0_defs.h 3.185 @@ -283,178 +458,177 @@ 3ddb79c4NSDwiQ-AmrYdxcRAwLPzwQ xen-2.4.1 3.186 3ddb79c4TZj1wXPKQt36O72SddtBNQ xen-2.4.16/net/skbuff.c 3.187 3ddb79c4x8dvwPtzclghWAKFWpEBFA xen-2.4.16/tools/Makefile 3.188 3ddb79c4yGZ7_22QAFFwPzqP4NSHwA xen-2.4.16/tools/elf-reloc.c 3.189 -3ddb79bbYMXGmQTsr5BeGS_RuZ5f_w xenolinux-2.4.16-sparse/Makefile 3.190 -3ddb79b7e0ssyz3Q1GoqjDds-x1PLQ xenolinux-2.4.16-sparse/arch/xeno/Makefile 3.191 -3ddb79b7_rLvYZU3tOY6Wwuw_Sg3_w xenolinux-2.4.16-sparse/arch/xeno/boot/Makefile 3.192 -3ddb79b8L4xnwrcvWk6nAbgKVbNkSA xenolinux-2.4.16-sparse/arch/xeno/config.in 3.193 -3ddb79b7v_Be34as7_mlzFlw65hOjQ xenolinux-2.4.16-sparse/arch/xeno/defconfig 3.194 -3ddb79b7KUvtx0knQJoRaBDZQeNidg xenolinux-2.4.16-sparse/arch/xeno/drivers/block/Makefile 3.195 -3e4a8cb7JECr--r1ipnrkd7NKdbUqQ xenolinux-2.4.16-sparse/arch/xeno/drivers/block/xl_block.c 3.196 -3e4a8cb7SLWsLTXQjv7ng6-3hL4pCA xenolinux-2.4.16-sparse/arch/xeno/drivers/block/xl_block_test.c 3.197 -3ddb79b7LLVJBGynxHSOh9A9l97sug xenolinux-2.4.16-sparse/arch/xeno/drivers/console/Makefile 3.198 -3ddb79b7UG2QiRAU-Wvc1Y_BLigu1Q xenolinux-2.4.16-sparse/arch/xeno/drivers/console/console.c 3.199 -3ddb79b75eo4PRXkT6Th9popt_SJhg xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/Makefile 3.200 -3e4a8cb79dT0F4q5T4GEqMj4CtAquQ xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_block.c 3.201 -3ddb79b7Xyaoep6U0kLvx6Kx7OauDw xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_core.c 3.202 -3df9ce13K7qSLBtHV-01QHPW62649Q xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_memory.c 3.203 -3ddb79b7PulSkF9m3c7K5MkxHRf4hA xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_ops.h 3.204 -3ddba759XOjcl_OF-52dOYq7sgMykQ xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/vfr.c 3.205 -3ddb79b7s7yYBioHidSkIoHtQxYmOw xenolinux-2.4.16-sparse/arch/xeno/drivers/network/Makefile 3.206 -3ddb79b7CpLL98ScdpbKkVBktlbCtQ xenolinux-2.4.16-sparse/arch/xeno/drivers/network/network.c 3.207 -3ddb79b7hqi9krq6h98lnpONHGzvEA xenolinux-2.4.16-sparse/arch/xeno/kernel/Makefile 3.208 -3ddb79b7eyEv5bsN8EQkjIG0y11Q1A xenolinux-2.4.16-sparse/arch/xeno/kernel/entry.S 3.209 -3ddb79b70XAg9bJwp0-DWHe0LtzlBw xenolinux-2.4.16-sparse/arch/xeno/kernel/head.S 3.210 -3ddb79b7dDsKjU22VxQ-C5BMFaMUmw xenolinux-2.4.16-sparse/arch/xeno/kernel/hypervisor.c 3.211 -3ddb79b7xzwEc8-lo1vu3BxB-gBURQ xenolinux-2.4.16-sparse/arch/xeno/kernel/i386_ksyms.c 3.212 -3ddb79b7i7pfPEcy_zjDfW9JHD305g xenolinux-2.4.16-sparse/arch/xeno/kernel/i387.c 3.213 -3ddb79b7Ti2i5ztQzM-w67zN-cJD8A xenolinux-2.4.16-sparse/arch/xeno/kernel/init_task.c 3.214 -3ddb79b7MEQGMZrsF94atNJZ4-OGzA xenolinux-2.4.16-sparse/arch/xeno/kernel/ioport.c 3.215 -3ddb79b7DOz-Mz5jsjRd5W8jN0XbPw xenolinux-2.4.16-sparse/arch/xeno/kernel/irq.c 3.216 -3ddb79b7bOAPk_YAUUsruhVGO2GOOg xenolinux-2.4.16-sparse/arch/xeno/kernel/ldt.c 3.217 -3ddb79b7qf2WK6vMKcmOLIeKN5GSjg xenolinux-2.4.16-sparse/arch/xeno/kernel/process.c 3.218 -3ddb79b7HdaBR7yk_u51auihbr31aQ xenolinux-2.4.16-sparse/arch/xeno/kernel/ptrace.c 3.219 -3ddb79b7yJunvnrgWD2VTy6yot0PMg xenolinux-2.4.16-sparse/arch/xeno/kernel/semaphore.c 3.220 -3ddb79b7BIitpVygiksiMBQYvh5Z2A xenolinux-2.4.16-sparse/arch/xeno/kernel/setup.c 3.221 -3ddb79b7DTevmwhNla67jZxjBSIKFg xenolinux-2.4.16-sparse/arch/xeno/kernel/signal.c 3.222 -3ddb79b76mCf-gZPR4KLjL8ktZ37GA xenolinux-2.4.16-sparse/arch/xeno/kernel/sys_i386.c 3.223 -3ddb79b7xDsEKErRFeqcSm6eRrTEIg xenolinux-2.4.16-sparse/arch/xeno/kernel/time.c 3.224 -3ddb79b7V4dv_KAQu4Msa2Ebhd0aKw xenolinux-2.4.16-sparse/arch/xeno/kernel/traps.c 3.225 -3ddb79b8oUnwncDaZuRWF3-n3jPsIA xenolinux-2.4.16-sparse/arch/xeno/lib/Makefile 3.226 -3ddb79b8BMxi8qW3_NT44SSd1uMD3Q xenolinux-2.4.16-sparse/arch/xeno/lib/checksum.S 3.227 -3ddb79b8WcWel2g9zU9pBJb-yA8jBw xenolinux-2.4.16-sparse/arch/xeno/lib/dec_and_lock.c 3.228 -3ddb79b8oxeiaIW6Au95OM0GlsMrMw xenolinux-2.4.16-sparse/arch/xeno/lib/delay.c 3.229 -3ddb79b8XPasnRhvK-_6xYksf3S6qA xenolinux-2.4.16-sparse/arch/xeno/lib/getuser.S 3.230 -3ddb79b8HFLUh8mwcl4X44ta-ny1KA xenolinux-2.4.16-sparse/arch/xeno/lib/iodebug.c 3.231 -3ddb79b879qeoLlarHXvNIDEva6ssA xenolinux-2.4.16-sparse/arch/xeno/lib/memcpy.c 3.232 -3ddb79b869CY_yr4HymV6k98pfpMgg xenolinux-2.4.16-sparse/arch/xeno/lib/mmx.c 3.233 -3ddb79b8S77yf1--Qa4C0ZYmqKXCww xenolinux-2.4.16-sparse/arch/xeno/lib/old-checksum.c 3.234 -3ddb79b8ffZ79cU2ZzfA2ekeo6pqeg xenolinux-2.4.16-sparse/arch/xeno/lib/strstr.c 3.235 -3ddb79b82kQ5oIXpxq3TUmlgxsLzLg xenolinux-2.4.16-sparse/arch/xeno/lib/usercopy.c 3.236 -3ddb79b8qdD_svLCCAja_oP2w4Tn8Q xenolinux-2.4.16-sparse/arch/xeno/mm/Makefile 3.237 -3ddb79b8ukY8dsPYmR8eNk-aCzFPsQ xenolinux-2.4.16-sparse/arch/xeno/mm/extable.c 3.238 -3ddb79b856Zta9b3s0bgUCGbG1blvQ xenolinux-2.4.16-sparse/arch/xeno/mm/fault.c 3.239 -3df9ce13dZ6UGDjZbUeZfyH4Hy6aCA xenolinux-2.4.16-sparse/arch/xeno/mm/get_unmapped_area.c 3.240 -3ddb79b85fpsKT8A9WYnuJg03b715g xenolinux-2.4.16-sparse/arch/xeno/mm/hypervisor.c 3.241 -3ddb79b83Zj7Xn2QVhU4HeMuAC9FjA xenolinux-2.4.16-sparse/arch/xeno/mm/init.c 3.242 -3df9ce13TRWIv0Mawm15zESP7jcT7A xenolinux-2.4.16-sparse/arch/xeno/mm/mmu_context.c 3.243 -3ddb79b7aKdTkbr3u6aze8tVwGh_TQ xenolinux-2.4.16-sparse/arch/xeno/vmlinux.lds 3.244 -3e4a8cb7lpFFwT1Iu9zXWc8Ew4klFA xenolinux-2.4.16-sparse/drivers/block/Config.in 3.245 -3ddb79bbx682YH6vR2zbVOXwg73ULg xenolinux-2.4.16-sparse/drivers/block/ll_rw_blk.c 3.246 -3ddb79bcJfHdwrPsjqgI33_OsGdVCg xenolinux-2.4.16-sparse/drivers/block/rd.c 3.247 -3ddb79bcpVu-IbnqwQqpRqsEbLpsuw xenolinux-2.4.16-sparse/drivers/char/tty_io.c 3.248 -3e15d5273gfR2fbcYe05kqBSAvCX_w xenolinux-2.4.16-sparse/fs/exec.c 3.249 -3ddb79b8VFtfWSCrXKPN2K21zd_vtw xenolinux-2.4.16-sparse/include/asm-xeno/a.out.h 3.250 -3ddb79b8Zzi13p3OAPV25QgiC3THAQ xenolinux-2.4.16-sparse/include/asm-xeno/apic.h 3.251 -3ddb79baZDlsdV_m6C5CXnWMl15p1g xenolinux-2.4.16-sparse/include/asm-xeno/apicdef.h 3.252 -3ddb79baZM88u4CnriVA8ZXBdnMNvg xenolinux-2.4.16-sparse/include/asm-xeno/atomic.h 3.253 -3ddb79baYHyZsDCiXiq8Y8_XxHE-jQ xenolinux-2.4.16-sparse/include/asm-xeno/bitops.h 3.254 -3ddb79b8vFGtGb6pg3GZFXSiwOZfcg xenolinux-2.4.16-sparse/include/asm-xeno/boot.h 3.255 -3ddb79baW8tf6PiBQUF50QQM5nY9sw xenolinux-2.4.16-sparse/include/asm-xeno/bugs.h 3.256 -3ddb79b80msOlzTZRoVudYdemzgOlA xenolinux-2.4.16-sparse/include/asm-xeno/byteorder.h 3.257 -3ddb79b8brNSUEujnq8f_zr8kA-cUg xenolinux-2.4.16-sparse/include/asm-xeno/cache.h 3.258 -3ddb79bayhr6C6prVhAYlFRChhf3wg xenolinux-2.4.16-sparse/include/asm-xeno/checksum.h 3.259 -3ddb79b8RNUaDbpPjdVVwKAsbiTBKQ xenolinux-2.4.16-sparse/include/asm-xeno/cpufeature.h 3.260 -3ddb79b8pJe4aNsUKkfHEoBT9Y-UMA xenolinux-2.4.16-sparse/include/asm-xeno/current.h 3.261 -3ddb79b8KL7icUfxKRoWDIkHkLQ1kQ xenolinux-2.4.16-sparse/include/asm-xeno/debugreg.h 3.262 -3ddb79baDUP_cRdFgqaH0rXUvMxx4A xenolinux-2.4.16-sparse/include/asm-xeno/delay.h 3.263 -3ddb79b89CgBTFsS3joEJ1ZniSHEgA xenolinux-2.4.16-sparse/include/asm-xeno/desc.h 3.264 -3ddb79ba6xyT4mJOYSp1Fg2l0ta93A xenolinux-2.4.16-sparse/include/asm-xeno/div64.h 3.265 -3ddb79b80Z4ZUIqbD1Xu_t4OCuEHeQ xenolinux-2.4.16-sparse/include/asm-xeno/dma.h 3.266 -3ddb79bac26NkKcPIEsfxETc5Snyag xenolinux-2.4.16-sparse/include/asm-xeno/elf.h 3.267 -3ddb79ba722pCJ_g_xI8ebsE31IK-Q xenolinux-2.4.16-sparse/include/asm-xeno/errno.h 3.268 -3ddb79b8vIpUpgaSNEneFkg5hYSvNg xenolinux-2.4.16-sparse/include/asm-xeno/fcntl.h 3.269 -3e53dbfb9mmyM-y5NuBBTDJvQkDzjA xenolinux-2.4.16-sparse/include/asm-xeno/fixmap.h 3.270 -3ddb79b8780YvqvK1g5KPIWzQ6P15w xenolinux-2.4.16-sparse/include/asm-xeno/floppy.h 3.271 -3ddb79bas-nFywnmilbUeT34PEAA0g xenolinux-2.4.16-sparse/include/asm-xeno/hardirq.h 3.272 -3ddb79batzR40ZFY9dvgs5f1aM9I6g xenolinux-2.4.16-sparse/include/asm-xeno/hdreg.h 3.273 -3ddb79b90xBgbeYgCcImS2ZxJakxBA xenolinux-2.4.16-sparse/include/asm-xeno/highmem.h 3.274 -3ddb79baXLZV3dUKQI2gIYpAy67RuA xenolinux-2.4.16-sparse/include/asm-xeno/hw_irq.h 3.275 -3e00b957iYsdTI1x6THRwMoWSPIW2Q xenolinux-2.4.16-sparse/include/asm-xeno/hypervisor-ifs 3.276 -3ddb79bapQ9Z9ewa5O1pqAVaNBTazg xenolinux-2.4.16-sparse/include/asm-xeno/hypervisor.h 3.277 -3ddb79baL-pjPI8hg5xjPgd4__SlOA xenolinux-2.4.16-sparse/include/asm-xeno/i387.h 3.278 -3ddb79ba66TwvG7HpbBo04fRhmj3KQ xenolinux-2.4.16-sparse/include/asm-xeno/ide.h 3.279 -3ddb79bahFfCuRcmd9kBYA-CuGtCSg xenolinux-2.4.16-sparse/include/asm-xeno/init.h 3.280 -3ddb79ba3wnwflaNW6QheYvxoj5S8Q xenolinux-2.4.16-sparse/include/asm-xeno/io.h 3.281 -3ddb79ba1MhHpElCXFlijej2zWVk4g xenolinux-2.4.16-sparse/include/asm-xeno/io_apic.h 3.282 -3ddb79baiyfcZN9rJwhq0UeFjI6GkQ xenolinux-2.4.16-sparse/include/asm-xeno/ioctl.h 3.283 -3ddb79badReKYSok3yHShb4jg0vA-A xenolinux-2.4.16-sparse/include/asm-xeno/ioctls.h 3.284 -3ddb79b9iuIxteTXg8_myIsrWF5uxg xenolinux-2.4.16-sparse/include/asm-xeno/ipc.h 3.285 -3ddb79baw5Dxo78880UMSanDV70WdA xenolinux-2.4.16-sparse/include/asm-xeno/ipcbuf.h 3.286 -3ddb79ban9FUBuEaznRZvPfry3xnHQ xenolinux-2.4.16-sparse/include/asm-xeno/irq.h 3.287 -3ddb79banJ5r-mqE7LZ8nPGTADaGBA xenolinux-2.4.16-sparse/include/asm-xeno/kdb.h 3.288 -3ddb79baoaoHGTW0oiBXFPUg4KWydw xenolinux-2.4.16-sparse/include/asm-xeno/kdbprivate.h 3.289 -3ddb79bam2K6c7tS2HX6jis2Bqx71w xenolinux-2.4.16-sparse/include/asm-xeno/keyboard.h 3.290 -3ddb79baQ8gGrZm2Jlo3I1ntD0H5HA xenolinux-2.4.16-sparse/include/asm-xeno/kmap_types.h 3.291 -3ddb79b9MeQEYrafy-Mx9OoeVFM_uw xenolinux-2.4.16-sparse/include/asm-xeno/ldt.h 3.292 -3ddb79baAsy5W-cJ9ML_w9chqqUh4A xenolinux-2.4.16-sparse/include/asm-xeno/linux_logo.h 3.293 -3ddb79b9uhsumPVE0wGgarfIkYDSFA xenolinux-2.4.16-sparse/include/asm-xeno/locks.h 3.294 -3ddb79b954ISbF9e68hB0WTulCJRgg xenolinux-2.4.16-sparse/include/asm-xeno/math_emu.h 3.295 -3ddb79b9EZDlC6RGn_y0OYr0nyQWlw xenolinux-2.4.16-sparse/include/asm-xeno/mc146818rtc.h 3.296 -3ddb79b9M6pTF4maDgh8TYbg_HHUbw xenolinux-2.4.16-sparse/include/asm-xeno/mca_dma.h 3.297 -3ddb79baA7dlps8FkicOUEXKEQuQsA xenolinux-2.4.16-sparse/include/asm-xeno/mman.h 3.298 -3ddb79baKfF36-eRvkxnEvMRQRai-w xenolinux-2.4.16-sparse/include/asm-xeno/mmu.h 3.299 -3ddb79baQyKbT5U4EmZNePY9Txp-tA xenolinux-2.4.16-sparse/include/asm-xeno/mmu_context.h 3.300 -3ddb79bberC3Ghs4vy-06Pu-LSiWtw xenolinux-2.4.16-sparse/include/asm-xeno/mmx.h 3.301 -3ddb79bbsJLF10xQcKDoV8f_7gcOXg xenolinux-2.4.16-sparse/include/asm-xeno/module.h 3.302 -3ddb79bbY5RffJ8_F1oC4VI7q3Eejg xenolinux-2.4.16-sparse/include/asm-xeno/mpspec.h 3.303 -3ddb79b90vB4Vzzy_wL6SYXQMy9N9Q xenolinux-2.4.16-sparse/include/asm-xeno/msgbuf.h 3.304 -3ddb79bbZ5a_vTk0xcgOHuPokaqwMw xenolinux-2.4.16-sparse/include/asm-xeno/msr.h 3.305 -3ddb79b9y1xAKaPiBd79MBcCopNNYw xenolinux-2.4.16-sparse/include/asm-xeno/mtrr.h 3.306 -3ddb79b90hX0QBJlWQN_VsHtX5Ijkw xenolinux-2.4.16-sparse/include/asm-xeno/namei.h 3.307 -3ddb79bbG2p9MNq7tuISz8md1Oj2lg xenolinux-2.4.16-sparse/include/asm-xeno/page.h 3.308 -3ddb79bb_iUa2piFSwaB8YPw-rB5SQ xenolinux-2.4.16-sparse/include/asm-xeno/param.h 3.309 -3ddb79b9Y8UU0S9AoDznoqqcYxg9-A xenolinux-2.4.16-sparse/include/asm-xeno/parport.h 3.310 -3ddb79b9K9_edWxBHS7TdCpyDmfp6g xenolinux-2.4.16-sparse/include/asm-xeno/pgalloc.h 3.311 -3ddb79bahaS_P3UYp9VEU6kHxXbajA xenolinux-2.4.16-sparse/include/asm-xeno/pgtable-2level.h 3.312 -3ddb79b9MjXUB_rk29GJgaNY24feCw xenolinux-2.4.16-sparse/include/asm-xeno/pgtable-3level.h 3.313 -3ddb79bbPF2ENpNHBru8K3hyYVPmkQ xenolinux-2.4.16-sparse/include/asm-xeno/pgtable.h 3.314 -3ddb79b9t9xKrOf8aP3X5jEit9tj-w xenolinux-2.4.16-sparse/include/asm-xeno/poll.h 3.315 -3ddb79b9xHtTDWFaI9ncAtxyUth0Yg xenolinux-2.4.16-sparse/include/asm-xeno/posix_types.h 3.316 -3ddb79b9VwZ9YsSpA7CkJmYXVadrCA xenolinux-2.4.16-sparse/include/asm-xeno/processor.h 3.317 -3ddb79bbKaOkHrGG9j05AGlii-voaQ xenolinux-2.4.16-sparse/include/asm-xeno/ptrace.h 3.318 -3ddb79bbVpJCVTXmc2yNf1rsC00YEg xenolinux-2.4.16-sparse/include/asm-xeno/resource.h 3.319 -3ddb79bbtU0Kh27NbNpqKAIhshJvXQ xenolinux-2.4.16-sparse/include/asm-xeno/rwlock.h 3.320 -3ddb79b97LhdmW6hYmybQOPDkK6plg xenolinux-2.4.16-sparse/include/asm-xeno/rwsem.h 3.321 -3ddb79bbgRzM1NoXYbLoOCbZt8s5NA xenolinux-2.4.16-sparse/include/asm-xeno/scatterlist.h 3.322 -3ddb79b9xCi3F80Z6xxx6nzkCAo8vQ xenolinux-2.4.16-sparse/include/asm-xeno/segment.h 3.323 -3ddb79b9WxySbCKDoMgTgPtn1G3BFw xenolinux-2.4.16-sparse/include/asm-xeno/semaphore.h 3.324 -3ddb79b9gNK3dtgXONloSBaNgZPjAg xenolinux-2.4.16-sparse/include/asm-xeno/sembuf.h 3.325 -3ddb79bb2UTDgfwju2J3weDXemw3LA xenolinux-2.4.16-sparse/include/asm-xeno/serial.h 3.326 -3ddb79bbAPFyA_n4dNVCRoee8obOKA xenolinux-2.4.16-sparse/include/asm-xeno/setup.h 3.327 -3ddb79b9XTOB5DwWBGzPLLR4rNEkDQ xenolinux-2.4.16-sparse/include/asm-xeno/shmbuf.h 3.328 -3ddb79b9-_jDlAj3qVZe4opi3zectQ xenolinux-2.4.16-sparse/include/asm-xeno/shmparam.h 3.329 -3ddb79b9AW75ErwlTRX4McxO15sEaQ xenolinux-2.4.16-sparse/include/asm-xeno/sigcontext.h 3.330 -3ddb79b9NBJW-KAI3mgveUCr7sIOwA xenolinux-2.4.16-sparse/include/asm-xeno/siginfo.h 3.331 -3ddb79bbj0i8tUVNMKtZVrLJqv3Nsw xenolinux-2.4.16-sparse/include/asm-xeno/signal.h 3.332 -3ddb79bbfAmpotdy-No2dwGez2fnIg xenolinux-2.4.16-sparse/include/asm-xeno/smp.h 3.333 -3ddb79b9pDERXiqSumFWMTFJ1X9xIw xenolinux-2.4.16-sparse/include/asm-xeno/smplock.h 3.334 -3ddb79bbuCOIWTlWEHgOTexEBbdDow xenolinux-2.4.16-sparse/include/asm-xeno/socket.h 3.335 -3ddb79b9ExeUznVBlSn1e2nvOCrJ4A xenolinux-2.4.16-sparse/include/asm-xeno/sockios.h 3.336 -3ddb79b9kL3xvucBb-Gmg4_vo-99vw xenolinux-2.4.16-sparse/include/asm-xeno/softirq.h 3.337 -3ddb79b9rJ8AfSzGzA0arI8mazYLlQ xenolinux-2.4.16-sparse/include/asm-xeno/spinlock.h 3.338 -3ddb79bbXaA_zUHNPkAKRNz1h0gIJw xenolinux-2.4.16-sparse/include/asm-xeno/stat.h 3.339 -3ddb79b9G004IlCplrjWgF1aXbp8dA xenolinux-2.4.16-sparse/include/asm-xeno/statfs.h 3.340 -3ddb79bbRsy3GlCFrQEbVMVp--xlwQ xenolinux-2.4.16-sparse/include/asm-xeno/string-486.h 3.341 -3ddb79bb4xug4cDph6ODLQFQIan_sg xenolinux-2.4.16-sparse/include/asm-xeno/string.h 3.342 -3ddb79b9JhjJtJUO3g5LmrHPkdxgKg xenolinux-2.4.16-sparse/include/asm-xeno/system.h 3.343 -3ddb79b9tbjCU9zSbqKbbv4m8tijlg xenolinux-2.4.16-sparse/include/asm-xeno/termbits.h 3.344 -3ddb79bbi0mW10tH4xX1_KHXKM_xPg xenolinux-2.4.16-sparse/include/asm-xeno/termios.h 3.345 -3ddb79b9JuR1VvNzlkyMlA-Dnlmy9Q xenolinux-2.4.16-sparse/include/asm-xeno/timex.h 3.346 -3ddb79b9Bofq-p3sCTF0ELVuf_iBYA xenolinux-2.4.16-sparse/include/asm-xeno/tlb.h 3.347 -3ddb79b9tpBUqS8-S6euSqyk2hFkKg xenolinux-2.4.16-sparse/include/asm-xeno/types.h 3.348 -3ddb79bb5bkAaEzD7pdqQZdWyA_0eQ xenolinux-2.4.16-sparse/include/asm-xeno/uaccess.h 3.349 -3ddb79bbiDIz1dxgFixHKyGuqRqfDQ xenolinux-2.4.16-sparse/include/asm-xeno/ucontext.h 3.350 -3ddb79ba_Smn-GiYtr5ZTMaZXn-AHg xenolinux-2.4.16-sparse/include/asm-xeno/unaligned.h 3.351 -3ddb79bb3cMSs_k2X5Oq2hOIBvmPYA xenolinux-2.4.16-sparse/include/asm-xeno/unistd.h 3.352 -3ddb79ba2qYtIQAT_-vCFkkZUXu_UQ xenolinux-2.4.16-sparse/include/asm-xeno/user.h 3.353 -3ddb79bbqhb9X9qWOz5Bv4wOzrkITg xenolinux-2.4.16-sparse/include/asm-xeno/vga.h 3.354 -3ddb79bbA52x94o6uwDYsbzrH2hjzA xenolinux-2.4.16-sparse/include/asm-xeno/xor.h 3.355 -3e4a8cb7ON8EclY3NN3YPXyMT941hA xenolinux-2.4.16-sparse/include/linux/blk.h 3.356 -3e4a8cb7GJrKD0z7EF0VZOhdEa01Mw xenolinux-2.4.16-sparse/include/linux/major.h 3.357 -3ddb79bb_7YG4U75ZmEic9YXWTW7Vw xenolinux-2.4.16-sparse/include/linux/sunrpc/debug.h 3.358 -3e4a8cb7j05wwb1uPZgY16s68o7qAw xenolinux-2.4.16-sparse/init/main.c 3.359 -3ddb79bcxkVPfWlZ1PQKvDrfArzOVw xenolinux-2.4.16-sparse/kernel/panic.c 3.360 -3ddb79bbP31im-mx2NbfthSeqty1Dg xenolinux-2.4.16-sparse/mk 3.361 -3e15d52e0_j129JPvo7xfYGndVFpwQ xenolinux-2.4.16-sparse/mm/memory.c 3.362 -3e15d535DLvpzTrLRUIerB69LpJD1g xenolinux-2.4.16-sparse/mm/mremap.c 3.363 -3e15d531m1Y1_W8ki64AFOU_ua4C4w xenolinux-2.4.16-sparse/mm/swapfile.c 3.364 +3e5a4e6589G-U42lFKs43plskXoFxQ xenolinux-2.4.21-pre4-sparse/Makefile 3.365 +3e5a4e65IEPjnWPZ5w3TxS5scV8Ewg xenolinux-2.4.21-pre4-sparse/arch/xeno/Makefile 3.366 +3e5a4e65n-KhsEAs-A4ULiStBp-r6w xenolinux-2.4.21-pre4-sparse/arch/xeno/boot/Makefile 3.367 +3e5a4e65OV_j_DBtjzt5vej771AJsA xenolinux-2.4.21-pre4-sparse/arch/xeno/config.in 3.368 +3e5a4e65TNEycLeXqPSXQJQm_xGecA xenolinux-2.4.21-pre4-sparse/arch/xeno/defconfig 3.369 +3e5a4e65iHEuC5sjFhj42XALYbLVRw xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/Makefile 3.370 +3e5a4e65pP5spJErBW69pJxSSdK9RA xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_block.c 3.371 +3e5a4e65GtI9JZRAjuRdXaxt_4ohyQ xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_block_test.c 3.372 +3e5a4e65G3e2s0ghPMgiJ-gBTUJ0uQ xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/console/Makefile 3.373 +3e5a4e651TH-SXHoufurnWjgl5bfOA xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/console/console.c 3.374 +3e5a4e656nfFISThfbyXQOA6HN6YHw xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/Makefile 3.375 +3e5a4e65Cc7io-vynYob10SlqXTjAQ xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/dom0_block.c 3.376 +3e5a4e65BXtftInNHUC2PjDfPhdZZA xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/dom0_core.c 3.377 +3e5a4e65uXAx05p6B1-HU2tijuw8qA xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/dom0_memory.c 3.378 +3e5a4e65EOOLlPwXnhSuX-iVdWLmnA xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/dom0_ops.h 3.379 +3e5a4e65gfn_ltB8ujHMVFApnTTNRQ xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/vfr.c 3.380 +3e5a4e65gZBRBB6RsSVg1c9iahigAw xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/network/Makefile 3.381 +3e5a4e65ZxKrbFetVB84JhrTyZ1YuQ xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/network/network.c 3.382 +3e5a4e65lWzkiPXsZdzPt2RNnJGG1g xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/Makefile 3.383 +3e5a4e65_hqfuxtGG8IUy6wRM86Ecg xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/entry.S 3.384 +3e5a4e65Hy_1iUvMTPsNqGNXd9uFpg xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/head.S 3.385 +3e5a4e65ibVQmwlOn0j3sVH_j_6hAg xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/hypervisor.c 3.386 +3e5a4e65RMGcuA-HCn3-wNx3fFQwdg xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/i386_ksyms.c 3.387 +3e5a4e65JfSHwduNJO6j-upYnjoWLA xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/i387.c 3.388 +3e5a4e65tzCYKTX26zdI8rk2m48BDA xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/init_task.c 3.389 +3e5a4e65MEvZhlr070sK5JsfAQlv7Q xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/ioport.c 3.390 +3e5a4e653U6cELGv528IxOLHvCq8iA xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/irq.c 3.391 +3e5a4e65muT6SU3ck47IP87Q7Ti5hA xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/ldt.c 3.392 +3e5a4e65IGt3WwQDNiL4h-gYWgNTWQ xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/process.c 3.393 +3e5a4e65vXUggUHe9b_D9q0CNcZmQg xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/ptrace.c 3.394 +3e5a4e66StFP0OPSNngVwPJ4cJDy4g xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/semaphore.c 3.395 +3e5a4e66tR-qJMLj3MppcKqmvuI2XQ xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/setup.c 3.396 +3e5a4e66fWSTagLGU2P8BGFGRjhDiw xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/signal.c 3.397 +3e5a4e66Id8AWFANwLRFP4mKJgIFQw xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/sys_i386.c 3.398 +3e5a4e66N__lUXNwzQ-eADRzK9LXuQ xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/time.c 3.399 +3e5a4e66aHCbQ_F5QZ8VeyikLmuRZQ xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/traps.c 3.400 +3e5a4e66-9_NczrVMbuQkoSLyXckIw xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/Makefile 3.401 +3e5a4e66pZtp3RawntDpdofnJEvHIg xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/checksum.S 3.402 +3e5a4e660Zju423CmC6q_-ZdObYhuA xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/dec_and_lock.c 3.403 +3e5a4e6637ZDk0BvFEC-aFQs599-ng xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/delay.c 3.404 +3e5a4e66Cf-sjHkzP95oIJ6hBC1pOA xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/getuser.S 3.405 +3e5a4e66s_LxC8VI5vqmr-TPOdJYsw xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/iodebug.c 3.406 +3e5a4e667pxnNndXVcVxVNBvZezxhw xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/memcpy.c 3.407 +3e5a4e66MHYcXyO9DndD8k0DDBovYw xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/mmx.c 3.408 +3e5a4e669xZJQRPtO8oiRIqMwChrLg xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/old-checksum.c 3.409 +3e5a4e66RzO4JzKOAraCe2dnQ5m-yw xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/strstr.c 3.410 +3e5a4e66us6VmRaduHUnWiKcAONyLA xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/usercopy.c 3.411 +3e5a4e66croVgpcJyJuF2ycQw0HuJw xenolinux-2.4.21-pre4-sparse/arch/xeno/mm/Makefile 3.412 +3e5a4e661LP_6AdxThMuysfcYtOexA xenolinux-2.4.21-pre4-sparse/arch/xeno/mm/extable.c 3.413 +3e5a4e66l8Q5Tv-6B3lQIRmaVbFPzg xenolinux-2.4.21-pre4-sparse/arch/xeno/mm/fault.c 3.414 +3e5a4e66TyNNUEXkr5RxqvQhXK1MQA xenolinux-2.4.21-pre4-sparse/arch/xeno/mm/get_unmapped_area.c 3.415 +3e5a4e668SE9rixq4ahho9rNhLUUFQ xenolinux-2.4.21-pre4-sparse/arch/xeno/mm/hypervisor.c 3.416 +3e5a4e661gLzzff25pJooKIIWe7IWg xenolinux-2.4.21-pre4-sparse/arch/xeno/mm/init.c 3.417 +3e5a4e66U45cAIoHmxg0y1e1XhzVCA xenolinux-2.4.21-pre4-sparse/arch/xeno/mm/mmu_context.c 3.418 +3e5a4e66_jLCqAOBvqAy5N4mP7hmBA xenolinux-2.4.21-pre4-sparse/arch/xeno/mm/pageattr.c 3.419 +3e5a4e66qRlSTcjafidMB6ulECADvg xenolinux-2.4.21-pre4-sparse/arch/xeno/vmlinux.lds 3.420 +3e5a4e668yELUdtr3HiJZBIqxqUyuA xenolinux-2.4.21-pre4-sparse/drivers/block/Config.in 3.421 +3e5a4e66mrtlmV75L1tjKDg8RaM5gA xenolinux-2.4.21-pre4-sparse/drivers/block/ll_rw_blk.c 3.422 +3e5a4e66rw65CxyolW9PKz4GG42RcA xenolinux-2.4.21-pre4-sparse/drivers/char/tty_io.c 3.423 +3e5a4e669uzIE54VwucPYtGwXLAbzA xenolinux-2.4.21-pre4-sparse/fs/exec.c 3.424 +3e5a4e66HUJwJfJBBOilIN7LeL0twg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/a.out.h 3.425 +3e5a4e66nv3Esm5N8FS5r0qs-l7A0w xenolinux-2.4.21-pre4-sparse/include/asm-xeno/apic.h 3.426 +3e5a4e66BHReK8U7xl4qqZMXvFXihQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/apicdef.h 3.427 +3e5a4e668V7Eo08_6qmVoevzFrlxGQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/atomic.h 3.428 +3e5a4e66FNm4qKYGsIMdX6DGJ1pI1g xenolinux-2.4.21-pre4-sparse/include/asm-xeno/bitops.h 3.429 +3e5a4e66zkP-aEQkEtznyyp-e7tUGA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/boot.h 3.430 +3e5a4e66wbeCpsJgVf_U8Jde-CNcsA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/bugs.h 3.431 +3e5a4e66wTE9HEEjsnOHrijDB8iXrQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/byteorder.h 3.432 +3e5a4e66VqboK-qHV-HxmSflMh4VqQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/cache.h 3.433 +3e5a4e66bTVzeqJUJQiu67FWoHM5iw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/checksum.h 3.434 +3e5a4e66JVArkZ-0_pav3AsvKbftdw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/cpufeature.h 3.435 +3e5a4e66cCx28DaXo1U_nKvVX-5Y5w xenolinux-2.4.21-pre4-sparse/include/asm-xeno/current.h 3.436 +3e5a4e66o7NZjoJZjzJa-Z7XcGmGqg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/debugreg.h 3.437 +3e5a4e66rpzD2c7pNKF0XLbHzxb24A xenolinux-2.4.21-pre4-sparse/include/asm-xeno/delay.h 3.438 +3e5a4e66HdSkvIV6SJ1evG_xmTmXHA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/desc.h 3.439 +3e5a4e66GP6AL7wpHyxcsHOH4cJ4BQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/div64.h 3.440 +3e5a4e66wJ9hmUtY2rLWliznHdjWaw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/dma.h 3.441 +3e5a4e667P_1mO6v1YFRZ-ocfpiyVQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/elf.h 3.442 +3e5a4e66qeYk1odm2esnGypmiMcxqw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/errno.h 3.443 +3e5a4e663pDK4oQnfbuT38CR04cXDQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/fcntl.h 3.444 +3e5a4e66SYp_UpAVcF8Lc1wa3Qtgzw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/fixmap.h 3.445 +3e5a4e67fsayUJFE3A24CKZoUDI88A xenolinux-2.4.21-pre4-sparse/include/asm-xeno/floppy.h 3.446 +3e5a4e67uPmwPbjvF7YGsG2hX-3oBQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hardirq.h 3.447 +3e5a4e67P_6RRoCzUiQt_gyx6lmyWw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hdreg.h 3.448 +3e5a4e67w_DWgjIJ17Tlossu1LGujQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/highmem.h 3.449 +3e5a4e67YtcyDLQsShhCfQwPSELfvA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hw_irq.h 3.450 +3e5a4e67ASLV411RBbSd1tsCc1Dobg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs/block.h 3.451 +3e5a4e675NGZazUEJ9DDEbTzK3PuDQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs/hypervisor-if.h 3.452 +3e5a4e67poqyxiAz_921VNzba90kmw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs/network.h 3.453 +3e5a4e677VBavzM1UZIEcH1B-RlXMA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor.h 3.454 +3e5a4e679TYbXAUiURvTeX4cFb1RlQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/i387.h 3.455 +3e5a4e672eNAzAKUZsefsPdmsH19hA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ide.h 3.456 +3e5a4e67XHl6b9C1Oqv79FiE1T3ybg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/init.h 3.457 +3e5a4e67Ulv-Ll8Zp4j2GwMwQ8aAXQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/io.h 3.458 +3e5a4e67cWGE9V1O6DSwvj5KtkY04g xenolinux-2.4.21-pre4-sparse/include/asm-xeno/io_apic.h 3.459 +3e5a4e67-vXNELtSK-qDSYyK55febg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ioctl.h 3.460 +3e5a4e67iqnkteX3g1IFQ-0Hf-vyuA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ioctls.h 3.461 +3e5a4e674l2NZF3klG30JX_auXUBgA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ipc.h 3.462 +3e5a4e678dxUg9lvKOXvH1s5a9GNsA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ipcbuf.h 3.463 +3e5a4e673p7PEOyHFm3nHkYX6HQYBg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/irq.h 3.464 +3e5a4e67nfnw10Wsugp5ZeMYFO_Eeg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/keyboard.h 3.465 +3e5a4e67FbgZ92JO9Vp2CKlW6z7wjA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/kmap_types.h 3.466 +3e5a4e674VIvXJxlOtz7LjtNAJttAA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ldt.h 3.467 +3e5a4e67X2GwDXstxQeuIyr65hdOig xenolinux-2.4.21-pre4-sparse/include/asm-xeno/linux_logo.h 3.468 +3e5a4e67mLXkDcU-aaeMByYb1-3v7Q xenolinux-2.4.21-pre4-sparse/include/asm-xeno/locks.h 3.469 +3e5a4e67g8B4DjzsIajoy1_mlxlvLg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/math_emu.h 3.470 +3e5a4e67J6JsiPWb0AwWZzQcOLbKKw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/mc146818rtc.h 3.471 +3e5a4e67otTxTEz6CA4vVHE-CFLGkQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/mca_dma.h 3.472 +3e5a4e67hSfhasW1McVONBMITBY28g xenolinux-2.4.21-pre4-sparse/include/asm-xeno/mman.h 3.473 +3e5a4e67zoNch27qYhEBpr2k6SABOg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/mmu.h 3.474 +3e5a4e678ddsQOpbSiRdy1GRcDc9WA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/mmu_context.h 3.475 +3e5a4e67YQ_cLDcJjIsd8XTCk3w4rg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/mmx.h 3.476 +3e5a4e67Zv1yObwNLd_9AYbyGTTvSw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/module.h 3.477 +3e5a4e67C-czbgW6YxgEbJG1e9aPGg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/mpspec.h 3.478 +3e5a4e67swa8teSCnQDQvpV90xYiZQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/msgbuf.h 3.479 +3e5a4e67U1TsB9azleujfFZm3E5i3w xenolinux-2.4.21-pre4-sparse/include/asm-xeno/msr.h 3.480 +3e5a4e67f6dvHFEisaZ4wCR2t3a0yw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/mtrr.h 3.481 +3e5a4e67Kd-KWcgJON9dfcJEQD9hdg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/namei.h 3.482 +3e5a4e67mnQfh-R8KcQCaVo2Oho6yg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/page.h 3.483 +3e5a4e67IYaS0RnLo3SntreGd59gMA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/param.h 3.484 +3e5a4e67nvdHRk38knQeDl-0Z2j6_Q xenolinux-2.4.21-pre4-sparse/include/asm-xeno/parport.h 3.485 +3e5a4e67uTYU5oEnIDjxuaez8njjqg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/pgalloc.h 3.486 +3e5a4e67X7JyupgdYkgDX19Huj2sAw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/pgtable-2level.h 3.487 +3e5a4e67w3ckNdrTEgqiSiYYAYMwOQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/pgtable-3level.h 3.488 +3e5a4e67gr4NLGtQ5CvSLimMYZlkOA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/pgtable.h 3.489 +3e5a4e671OnIMxuFE59yynI-qvwKCA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/poll.h 3.490 +3e5a4e67o7FLcNPHjwyw5vb01EQTCg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/posix_types.h 3.491 +3e5a4e676uK4xErTBDH6XJREn9LSyg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/processor.h 3.492 +3e5a4e67AJPjW-zL7p-xWuA6IVeH1g xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ptrace.h 3.493 +3e5a4e67tIfXJYRQFxfRbcpZ25vqfw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/resource.h 3.494 +3e5a4e68E-U7HbKdTBaYoo3ZISdxuQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/rwlock.h 3.495 +3e5a4e68unR4ktSClycraOPanwxvTg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/rwsem.h 3.496 +3e5a4e68DATgqBYbF9W2Pkw5fGZBRg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/scatterlist.h 3.497 +3e5a4e68uJz-xI0IBVMD7xRLQKJDFg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/segment.h 3.498 +3e5a4e68Ug8hqChUpD2m_IDQSiu8jw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/semaphore.h 3.499 +3e5a4e68uFNNH3YQvZS1EnL0v_E6ew xenolinux-2.4.21-pre4-sparse/include/asm-xeno/sembuf.h 3.500 +3e5a4e689R_c0pr8Ycb-w6zveleWEw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/serial.h 3.501 +3e5a4e682D6yseOVKoJIx6HafkEKJw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/setup.h 3.502 +3e5a4e680_gLjMSi1Ql0nUnqCoQSyQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/shmbuf.h 3.503 +3e5a4e68PFVCbzUszQ4anRN8iZ1DUg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/shmparam.h 3.504 +3e5a4e689rAyWPwrwdvtJEkrtVw1rA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/sigcontext.h 3.505 +3e5a4e68D7dXWzciOKbyG1G3l3yt0w xenolinux-2.4.21-pre4-sparse/include/asm-xeno/siginfo.h 3.506 +3e5a4e68soo0VsYXn1HYv2XeUnlxgw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/signal.h 3.507 +3e5a4e68Nfdh6QcOKUTGCaYkf2LmYA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/smp.h 3.508 +3e5a4e688pv8zI1Z3wciLUik3c2iEw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/smplock.h 3.509 +3e5a4e68jaQZMOApQVZiq7T_gGPZhw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/socket.h 3.510 +3e5a4e68wlnX8Huhsl0gd7VgmiA8uA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/sockios.h 3.511 +3e5a4e68tuqUkZ3kyZGk6BZ1hrkXyw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/softirq.h 3.512 +3e5a4e68viR5sAz1SvKnPNrpKmlAZA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/spinlock.h 3.513 +3e5a4e68nUxBYfOOLm0_cZN7XM-3LQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/stat.h 3.514 +3e5a4e68my8BhpsHYBD63VUrxLXRCg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/statfs.h 3.515 +3e5a4e68W6piFzx4c4kiqwNB-h8PbQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/string-486.h 3.516 +3e5a4e68gFzDdQZEy91vkcdKWubf2g xenolinux-2.4.21-pre4-sparse/include/asm-xeno/string.h 3.517 +3e5a4e68mTr0zcp9SXDbnd-XLrrfxw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/system.h 3.518 +3e5a4e686Tful7frKeVbjeeWZ4S0nA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/termbits.h 3.519 +3e5a4e68fZcskF52zTGHdiF_yoVBiw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/termios.h 3.520 +3e5a4e68t8oGxTdC3i40nPjFwW00_g xenolinux-2.4.21-pre4-sparse/include/asm-xeno/timex.h 3.521 +3e5a4e685uCbimBjS_2iGxUqptPYiQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/tlb.h 3.522 +3e5a4e68Elybq23T6RnEt6vopg3mxg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/types.h 3.523 +3e5a4e68NeADbbaqoo4emjpU5xcaqA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/uaccess.h 3.524 +3e5a4e68HMMGyb6iBvG-qVbd9hODaQ xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ucontext.h 3.525 +3e5a4e68m2MrAb54gFw8n-ZGNEu-Fw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/unaligned.h 3.526 +3e5a4e68vggReonfTJ1gdzYjFaOSKw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/unistd.h 3.527 +3e5a4e68QPC4T0aOA61QgK2SGDPVVA xenolinux-2.4.21-pre4-sparse/include/asm-xeno/user.h 3.528 +3e5a4e68g2boOp0d45bjtwugxQ8zNw xenolinux-2.4.21-pre4-sparse/include/asm-xeno/vga.h 3.529 +3e5a4e68AB-TTHj1oXtqVJvUo9jzIg xenolinux-2.4.21-pre4-sparse/include/asm-xeno/xor.h 3.530 +3e5a4e68-X9_qn9HYcRvUFNc8htBSw xenolinux-2.4.21-pre4-sparse/include/linux/blk.h 3.531 +3e5a4e68WLX3B8owTvktP3HHOtznPQ xenolinux-2.4.21-pre4-sparse/include/linux/major.h 3.532 +3e5a4e686V0nioX2ZpFf056sgvdiQw xenolinux-2.4.21-pre4-sparse/include/linux/sunrpc/debug.h 3.533 +3e5a4e68W_hpMlM3u_-QOKMp3gzcwQ xenolinux-2.4.21-pre4-sparse/init/do_mounts.c 3.534 +3e5a4e68TJJavrunYwTAnLRSBxSYqQ xenolinux-2.4.21-pre4-sparse/kernel/panic.c 3.535 +3e5a4e68GxCIaFH4sy01v1wjapetaA xenolinux-2.4.21-pre4-sparse/mm/memory.c 3.536 +3e5a4e681xMPdF9xCMwpyfuYMySU5g xenolinux-2.4.21-pre4-sparse/mm/mremap.c 3.537 +3e5a4e683HKVU-sxtagrDasRB8eBVw xenolinux-2.4.21-pre4-sparse/mm/swapfile.c
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 4.2 +++ b/old/xenolinux-2.4.16-sparse/Makefile Mon Feb 24 16:55:07 2003 +0000 4.3 @@ -0,0 +1,583 @@ 4.4 +VERSION = 2 4.5 +PATCHLEVEL = 4 4.6 +SUBLEVEL = 16 4.7 +EXTRAVERSION = -kdb-xeno 4.8 + 4.9 +KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) 4.10 + 4.11 +HW_ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) 4.12 +ifndef ARCH 4.13 +ARCH := $(HW_ARCH) 4.14 +endif 4.15 + 4.16 +ARCH=xeno 4.17 + 4.18 +KERNELPATH=kernel-$(shell echo $(KERNELRELEASE) | sed -e "s/-//") 4.19 + 4.20 +CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ 4.21 + else if [ -x /bin/bash ]; then echo /bin/bash; \ 4.22 + else echo sh; fi ; fi) 4.23 +TOPDIR := $(shell /bin/pwd) 4.24 + 4.25 +HPATH = $(TOPDIR)/include 4.26 +FINDHPATH = $(HPATH)/asm $(HPATH)/linux $(HPATH)/scsi $(HPATH)/net 4.27 + 4.28 +HOSTCC = gcc 4.29 +HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer 4.30 + 4.31 +CROSS_COMPILE = 4.32 + 4.33 +# 4.34 +# Include the make variables (CC, etc...) 4.35 +# 4.36 + 4.37 +AS = $(CROSS_COMPILE)as 4.38 +LD = $(CROSS_COMPILE)ld 4.39 +CC = $(CROSS_COMPILE)gcc 4.40 +CPP = $(CC) -E 4.41 +AR = $(CROSS_COMPILE)ar 4.42 +NM = $(CROSS_COMPILE)nm 4.43 +STRIP = $(CROSS_COMPILE)strip 4.44 +OBJCOPY = $(CROSS_COMPILE)objcopy 4.45 +OBJDUMP = $(CROSS_COMPILE)objdump 4.46 +MAKEFILES = $(TOPDIR)/.config 4.47 +GENKSYMS = /sbin/genksyms 4.48 +DEPMOD = /sbin/depmod 4.49 +KALLSYMS = /sbin/kallsyms 4.50 +MODFLAGS = -DMODULE 4.51 +CFLAGS_KERNEL = 4.52 +PERL = perl 4.53 +AWK = awk 4.54 +TMPPREFIX = 4.55 + 4.56 +export VERSION PATCHLEVEL SUBLEVEL EXTRAVERSION KERNELRELEASE ARCH \ 4.57 + CONFIG_SHELL TOPDIR HPATH HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC \ 4.58 + CPP AR NM STRIP OBJCOPY OBJDUMP MAKE MAKEFILES GENKSYMS MODFLAGS PERL AWK 4.59 + 4.60 +all: do-it-all 4.61 + 4.62 +# 4.63 +# Make "config" the default target if there is no configuration file or 4.64 +# "depend" the target if there is no top-level dependency information. 4.65 +# 4.66 + 4.67 +ifeq (.config,$(wildcard .config)) 4.68 +include .config 4.69 +ifeq (.depend,$(wildcard .depend)) 4.70 +include .depend 4.71 +do-it-all: Version vmlinux 4.72 +else 4.73 +CONFIGURATION = depend 4.74 +do-it-all: depend 4.75 +endif 4.76 +else 4.77 +CONFIGURATION = config 4.78 +do-it-all: config 4.79 +endif 4.80 + 4.81 +# 4.82 +# INSTALL_PATH specifies where to place the updated kernel and system map 4.83 +# images. Uncomment if you want to place them anywhere other than root. 4.84 +# 4.85 + 4.86 +#export INSTALL_PATH=/boot 4.87 + 4.88 +# 4.89 +# INSTALL_MOD_PATH specifies a prefix to MODLIB for module directory 4.90 +# relocations required by build roots. This is not defined in the 4.91 +# makefile but the arguement can be passed to make if needed. 4.92 +# 4.93 + 4.94 +MODLIB := $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE) 4.95 +export MODLIB 4.96 + 4.97 +# 4.98 +# standard CFLAGS 4.99 +# 4.100 + 4.101 +CPPFLAGS := -D__KERNEL__ -I$(HPATH) 4.102 +CPPFLAGS += $(patsubst %,-I%,$(CROSS_COMPILE_INC)) 4.103 + 4.104 +CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes -Wno-trigraphs -O2 \ 4.105 + -fno-strict-aliasing -fno-common 4.106 +ifndef CONFIG_FRAME_POINTER 4.107 +CFLAGS += -fomit-frame-pointer 4.108 +endif 4.109 +AFLAGS := -D__ASSEMBLY__ $(CPPFLAGS) 4.110 + 4.111 +# 4.112 +# ROOT_DEV specifies the default root-device when making the image. 4.113 +# This can be either FLOPPY, CURRENT, /dev/xxxx or empty, in which case 4.114 +# the default of FLOPPY is used by 'build'. 4.115 +# This is i386 specific. 4.116 +# 4.117 + 4.118 +export ROOT_DEV = CURRENT 4.119 + 4.120 +# 4.121 +# If you want to preset the SVGA mode, uncomment the next line and 4.122 +# set SVGA_MODE to whatever number you want. 4.123 +# Set it to -DSVGA_MODE=NORMAL_VGA if you just want the EGA/VGA mode. 4.124 +# The number is the same as you would ordinarily press at bootup. 4.125 +# This is i386 specific. 4.126 +# 4.127 + 4.128 +export SVGA_MODE = -DSVGA_MODE=NORMAL_VGA 4.129 + 4.130 +# 4.131 +# If you want the RAM disk device, define this to be the size in blocks. 4.132 +# This is i386 specific. 4.133 +# 4.134 + 4.135 +#export RAMDISK = -DRAMDISK=512 4.136 + 4.137 +CORE_FILES =kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o 4.138 +NETWORKS =net/network.o 4.139 + 4.140 +LIBS =$(TOPDIR)/lib/lib.a 4.141 +SUBDIRS =kernel drivers mm fs net ipc lib 4.142 + 4.143 +ifeq ($(CONFIG_KDB),y) 4.144 +CORE_FILES += kdb/kdb.o 4.145 +SUBDIRS += kdb 4.146 +endif 4.147 + 4.148 +DRIVERS-n := 4.149 +DRIVERS-y := 4.150 +DRIVERS-m := 4.151 +DRIVERS- := 4.152 + 4.153 +DRIVERS-$(CONFIG_ACPI) += drivers/acpi/acpi.o 4.154 +DRIVERS-$(CONFIG_PARPORT) += drivers/parport/driver.o 4.155 +DRIVERS-y += drivers/char/char.o \ 4.156 + drivers/block/block.o \ 4.157 + drivers/misc/misc.o \ 4.158 + drivers/net/net.o \ 4.159 + drivers/media/media.o 4.160 +DRIVERS-$(CONFIG_AGP) += drivers/char/agp/agp.o 4.161 +DRIVERS-$(CONFIG_DRM) += drivers/char/drm/drm.o 4.162 +DRIVERS-$(CONFIG_NUBUS) += drivers/nubus/nubus.a 4.163 +DRIVERS-$(CONFIG_ISDN) += drivers/isdn/isdn.a 4.164 +DRIVERS-$(CONFIG_NET_FC) += drivers/net/fc/fc.o 4.165 +DRIVERS-$(CONFIG_APPLETALK) += drivers/net/appletalk/appletalk.o 4.166 +DRIVERS-$(CONFIG_TR) += drivers/net/tokenring/tr.o 4.167 +DRIVERS-$(CONFIG_WAN) += drivers/net/wan/wan.o 4.168 +DRIVERS-$(CONFIG_ARCNET) += drivers/net/arcnet/arcnetdrv.o 4.169 +DRIVERS-$(CONFIG_ATM) += drivers/atm/atm.o 4.170 +DRIVERS-$(CONFIG_IDE) += drivers/ide/idedriver.o 4.171 +DRIVERS-$(CONFIG_FC4) += drivers/fc4/fc4.a 4.172 +DRIVERS-$(CONFIG_SCSI) += drivers/scsi/scsidrv.o 4.173 +DRIVERS-$(CONFIG_FUSION_BOOT) += drivers/message/fusion/fusion.o 4.174 +DRIVERS-$(CONFIG_IEEE1394) += drivers/ieee1394/ieee1394drv.o 4.175 + 4.176 +ifneq ($(CONFIG_CD_NO_IDESCSI)$(CONFIG_BLK_DEV_IDECD)$(CONFIG_BLK_DEV_SR)$(CONFIG_PARIDE_PCD),) 4.177 +DRIVERS-y += drivers/cdrom/driver.o 4.178 +endif 4.179 + 4.180 +DRIVERS-$(CONFIG_SOUND) += drivers/sound/sounddrivers.o 4.181 +DRIVERS-$(CONFIG_PCI) += drivers/pci/driver.o 4.182 +DRIVERS-$(CONFIG_MTD) += drivers/mtd/mtdlink.o 4.183 +DRIVERS-$(CONFIG_PCMCIA) += drivers/pcmcia/pcmcia.o 4.184 +DRIVERS-$(CONFIG_NET_PCMCIA) += drivers/net/pcmcia/pcmcia_net.o 4.185 +DRIVERS-$(CONFIG_NET_WIRELESS) += drivers/net/wireless/wireless_net.o 4.186 +DRIVERS-$(CONFIG_PCMCIA_CHRDEV) += drivers/char/pcmcia/pcmcia_char.o 4.187 +DRIVERS-$(CONFIG_DIO) += drivers/dio/dio.a 4.188 +DRIVERS-$(CONFIG_SBUS) += drivers/sbus/sbus_all.o 4.189 +DRIVERS-$(CONFIG_ZORRO) += drivers/zorro/driver.o 4.190 +DRIVERS-$(CONFIG_FC4) += drivers/fc4/fc4.a 4.191 +DRIVERS-$(CONFIG_ALL_PPC) += drivers/macintosh/macintosh.o 4.192 +DRIVERS-$(CONFIG_MAC) += drivers/macintosh/macintosh.o 4.193 +DRIVERS-$(CONFIG_ISAPNP) += drivers/pnp/pnp.o 4.194 +DRIVERS-$(CONFIG_SGI_IP22) += drivers/sgi/sgi.a 4.195 +DRIVERS-$(CONFIG_VT) += drivers/video/video.o 4.196 +DRIVERS-$(CONFIG_PARIDE) += drivers/block/paride/paride.a 4.197 +DRIVERS-$(CONFIG_HAMRADIO) += drivers/net/hamradio/hamradio.o 4.198 +DRIVERS-$(CONFIG_TC) += drivers/tc/tc.a 4.199 +DRIVERS-$(CONFIG_USB) += drivers/usb/usbdrv.o 4.200 +DRIVERS-$(CONFIG_INPUT) += drivers/input/inputdrv.o 4.201 +DRIVERS-$(CONFIG_I2O) += drivers/message/i2o/i2o.o 4.202 +DRIVERS-$(CONFIG_IRDA) += drivers/net/irda/irda.o 4.203 +DRIVERS-$(CONFIG_I2C) += drivers/i2c/i2c.o 4.204 +DRIVERS-$(CONFIG_PHONE) += drivers/telephony/telephony.o 4.205 +DRIVERS-$(CONFIG_MD) += drivers/md/mddev.o 4.206 +DRIVERS-$(CONFIG_BLUEZ) += drivers/bluetooth/bluetooth.o 4.207 +DRIVERS-$(CONFIG_HOTPLUG_PCI) += drivers/hotplug/vmlinux-obj.o 4.208 + 4.209 +DRIVERS := $(DRIVERS-y) 4.210 + 4.211 + 4.212 +# files removed with 'make clean' 4.213 +CLEAN_FILES = \ 4.214 + kernel/ksyms.lst include/linux/compile.h \ 4.215 + vmlinux System.map \ 4.216 + $(TMPPREFIX).tmp* \ 4.217 + drivers/char/consolemap_deftbl.c drivers/video/promcon_tbl.c \ 4.218 + drivers/char/conmakehash \ 4.219 + drivers/char/drm/*-mod.c \ 4.220 + drivers/pci/devlist.h drivers/pci/classlist.h drivers/pci/gen-devlist \ 4.221 + drivers/zorro/devlist.h drivers/zorro/gen-devlist \ 4.222 + drivers/sound/bin2hex drivers/sound/hex2hex \ 4.223 + drivers/atm/fore200e_mkfirm drivers/atm/{pca,sba}*{.bin,.bin1,.bin2} \ 4.224 + drivers/scsi/aic7xxx/aicasm/aicasm_gram.c \ 4.225 + drivers/scsi/aic7xxx/aicasm/aicasm_scan.c \ 4.226 + drivers/scsi/aic7xxx/aicasm/y.tab.h \ 4.227 + drivers/scsi/aic7xxx/aicasm/aicasm \ 4.228 + drivers/scsi/53c700-mem.c \ 4.229 + net/khttpd/make_times_h \ 4.230 + net/khttpd/times.h \ 4.231 + submenu* 4.232 +# directories removed with 'make clean' 4.233 +CLEAN_DIRS = \ 4.234 + modules 4.235 + 4.236 +# files removed with 'make mrproper' 4.237 +MRPROPER_FILES = \ 4.238 + include/linux/autoconf.h include/linux/version.h \ 4.239 + drivers/net/hamradio/soundmodem/sm_tbl_{afsk1200,afsk2666,fsk9600}.h \ 4.240 + drivers/net/hamradio/soundmodem/sm_tbl_{hapn4800,psk4800}.h \ 4.241 + drivers/net/hamradio/soundmodem/sm_tbl_{afsk2400_7,afsk2400_8}.h \ 4.242 + drivers/net/hamradio/soundmodem/gentbl \ 4.243 + drivers/sound/*_boot.h drivers/sound/.*.boot \ 4.244 + drivers/sound/msndinit.c \ 4.245 + drivers/sound/msndperm.c \ 4.246 + drivers/sound/pndsperm.c \ 4.247 + drivers/sound/pndspini.c \ 4.248 + drivers/atm/fore200e_*_fw.c drivers/atm/.fore200e_*.fw \ 4.249 + .version .config* config.in config.old \ 4.250 + scripts/tkparse scripts/kconfig.tk scripts/kconfig.tmp \ 4.251 + scripts/lxdialog/*.o scripts/lxdialog/lxdialog \ 4.252 + .menuconfig.log \ 4.253 + include/asm \ 4.254 + kdb/gen-kdb_cmds.c \ 4.255 + .hdepend scripts/mkdep scripts/split-include scripts/docproc \ 4.256 + $(TOPDIR)/include/linux/modversions.h \ 4.257 + kernel.spec 4.258 + 4.259 +# directories removed with 'make mrproper' 4.260 +MRPROPER_DIRS = \ 4.261 + include/config \ 4.262 + $(TOPDIR)/include/linux/modules 4.263 + 4.264 + 4.265 +include arch/$(ARCH)/Makefile 4.266 + 4.267 +export CPPFLAGS CFLAGS CFLAGS_KERNEL AFLAGS AFLAGS_KERNEL 4.268 + 4.269 +export NETWORKS DRIVERS LIBS HEAD LDFLAGS LINKFLAGS MAKEBOOT ASFLAGS 4.270 + 4.271 +.S.s: 4.272 + $(CPP) $(AFLAGS) $(AFLAGS_KERNEL) -traditional -o $*.s $< 4.273 +.S.o: 4.274 + $(CC) $(AFLAGS) $(AFLAGS_KERNEL) -traditional -c -o $*.o $< 4.275 + 4.276 +Version: dummy 4.277 + @rm -f include/linux/compile.h 4.278 + 4.279 +boot: vmlinux 4.280 + @$(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" -C arch/$(ARCH)/boot 4.281 + 4.282 +LD_VMLINUX := $(LD) $(LINKFLAGS) $(HEAD) init/main.o init/version.o \ 4.283 + --start-group \ 4.284 + $(CORE_FILES) \ 4.285 + $(DRIVERS) \ 4.286 + $(NETWORKS) \ 4.287 + $(LIBS) \ 4.288 + --end-group 4.289 +ifeq ($(CONFIG_KALLSYMS),y) 4.290 +LD_VMLINUX_KALLSYMS := $(TMPPREFIX).tmp_kallsyms3.o 4.291 +else 4.292 +LD_VMLINUX_KALLSYMS := 4.293 +endif 4.294 + 4.295 +vmlinux: include/linux/version.h $(CONFIGURATION) init/main.o init/version.o linuxsubdirs 4.296 + @$(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" kallsyms 4.297 + 4.298 +.PHONY: kallsyms 4.299 + 4.300 +kallsyms: 4.301 +ifeq ($(CONFIG_KALLSYMS),y) 4.302 + @echo kallsyms pass 1 4.303 + $(LD_VMLINUX) -o $(TMPPREFIX).tmp_vmlinux1 4.304 + @$(KALLSYMS) $(TMPPREFIX).tmp_vmlinux1 > $(TMPPREFIX).tmp_kallsyms1.o 4.305 + @echo kallsyms pass 2 4.306 + @$(LD_VMLINUX) $(TMPPREFIX).tmp_kallsyms1.o -o $(TMPPREFIX).tmp_vmlinux2 4.307 + @$(KALLSYMS) $(TMPPREFIX).tmp_vmlinux2 > $(TMPPREFIX).tmp_kallsyms2.o 4.308 + @echo kallsyms pass 3 4.309 + @$(LD_VMLINUX) $(TMPPREFIX).tmp_kallsyms2.o -o $(TMPPREFIX).tmp_vmlinux3 4.310 + @$(KALLSYMS) $(TMPPREFIX).tmp_vmlinux3 > $(TMPPREFIX).tmp_kallsyms3.o 4.311 +endif 4.312 + $(LD_VMLINUX) $(LD_VMLINUX_KALLSYMS) -o $(TMPPREFIX)vmlinux 4.313 +ifneq ($(TMPPREFIX),) 4.314 + mv $(TMPPREFIX)vmlinux vmlinux 4.315 +endif 4.316 + $(NM) vmlinux | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map 4.317 + @rm -f $(TMPPREFIX).tmp_vmlinux* $(TMPPREFIX).tmp_kallsyms* 4.318 + 4.319 +symlinks: 4.320 + rm -f include/asm 4.321 + ( cd include ; ln -sf asm-$(ARCH) asm) 4.322 + @if [ ! -d include/linux/modules ]; then \ 4.323 + mkdir include/linux/modules; \ 4.324 + fi 4.325 + 4.326 +oldconfig: symlinks 4.327 + $(CONFIG_SHELL) scripts/Configure -d arch/$(ARCH)/config.in 4.328 + 4.329 +xconfig: symlinks 4.330 + $(MAKE) -C scripts kconfig.tk 4.331 + wish -f scripts/kconfig.tk 4.332 + 4.333 +menuconfig: include/linux/version.h symlinks 4.334 + $(MAKE) -C scripts/lxdialog all 4.335 + $(CONFIG_SHELL) scripts/Menuconfig arch/$(ARCH)/config.in 4.336 + 4.337 +config: symlinks 4.338 + $(CONFIG_SHELL) scripts/Configure arch/$(ARCH)/config.in 4.339 + 4.340 +include/config/MARKER: scripts/split-include include/linux/autoconf.h 4.341 + scripts/split-include include/linux/autoconf.h include/config 4.342 + @ touch include/config/MARKER 4.343 + 4.344 +linuxsubdirs: $(patsubst %, _dir_%, $(SUBDIRS)) 4.345 + 4.346 +$(patsubst %, _dir_%, $(SUBDIRS)) : dummy include/linux/version.h include/config/MARKER 4.347 + $(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" -C $(patsubst _dir_%, %, $@) 4.348 + 4.349 +$(TOPDIR)/include/linux/version.h: include/linux/version.h 4.350 +$(TOPDIR)/include/linux/compile.h: include/linux/compile.h 4.351 + 4.352 +newversion: 4.353 + . scripts/mkversion > .tmpversion 4.354 + @mv -f .tmpversion .version 4.355 + 4.356 +include/linux/compile.h: $(CONFIGURATION) include/linux/version.h newversion 4.357 + @echo -n \#define UTS_VERSION \"\#`cat .version` > .ver 4.358 + @if [ -n "$(CONFIG_SMP)" ] ; then echo -n " SMP" >> .ver; fi 4.359 + @if [ -f .name ]; then echo -n \-`cat .name` >> .ver; fi 4.360 + @echo ' '`date`'"' >> .ver 4.361 + @echo \#define LINUX_COMPILE_TIME \"`date +%T`\" >> .ver 4.362 + @echo \#define LINUX_COMPILE_BY \"`whoami`\" >> .ver 4.363 + @echo \#define LINUX_COMPILE_HOST \"`hostname`\" >> .ver 4.364 + @if [ -x /bin/dnsdomainname ]; then \ 4.365 + echo \#define LINUX_COMPILE_DOMAIN \"`dnsdomainname`\"; \ 4.366 + elif [ -x /bin/domainname ]; then \ 4.367 + echo \#define LINUX_COMPILE_DOMAIN \"`domainname`\"; \ 4.368 + else \ 4.369 + echo \#define LINUX_COMPILE_DOMAIN ; \ 4.370 + fi >> .ver 4.371 + @echo \#define LINUX_COMPILER \"`$(CC) $(CFLAGS) -v 2>&1 | tail -1`\" >> .ver 4.372 + @mv -f .ver $@ 4.373 + 4.374 +include/linux/version.h: ./Makefile 4.375 + @echo \#define UTS_RELEASE \"$(KERNELRELEASE)\" > .ver 4.376 + @echo \#define LINUX_VERSION_CODE `expr $(VERSION) \\* 65536 + $(PATCHLEVEL) \\* 256 + $(SUBLEVEL)` >> .ver 4.377 + @echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))' >>.ver 4.378 + @mv -f .ver $@ 4.379 + 4.380 +init/version.o: init/version.c include/linux/compile.h include/config/MARKER 4.381 + $(CC) $(CFLAGS) $(CFLAGS_KERNEL) -DUTS_MACHINE='"$(HW_ARCH)"' -c -o init/version.o init/version.c 4.382 + 4.383 +init/main.o: init/main.c include/config/MARKER 4.384 + $(CC) $(CFLAGS) $(CFLAGS_KERNEL) $(PROFILING) -c -o $*.o $< 4.385 + 4.386 +fs lib mm ipc kernel drivers net: dummy 4.387 + $(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" $(subst $@, _dir_$@, $@) 4.388 + 4.389 +TAGS: dummy 4.390 + etags `find include/asm-$(ARCH) -name '*.h'` 4.391 + find include -type d \( -name "asm-*" -o -name config \) -prune -o -name '*.h' -print | xargs etags -a 4.392 + find $(SUBDIRS) init -name '*.[ch]' | xargs etags -a 4.393 + 4.394 +# Exuberant ctags works better with -I 4.395 +tags: dummy 4.396 + CTAGSF=`ctags --version | grep -i exuberant >/dev/null && echo "-I __initdata,__exitdata,EXPORT_SYMBOL,EXPORT_SYMBOL_NOVERS"`; \ 4.397 + ctags $$CTAGSF `find include/asm-$(ARCH) -name '*.h'` && \ 4.398 + find include -type d \( -name "asm-*" -o -name config \) -prune -o -name '*.h' -print | xargs ctags $$CTAGSF -a && \ 4.399 + find $(SUBDIRS) init -name '*.[ch]' | xargs ctags $$CTAGSF -a 4.400 + 4.401 +ifdef CONFIG_MODULES 4.402 +ifdef CONFIG_MODVERSIONS 4.403 +MODFLAGS += -DMODVERSIONS -include $(HPATH)/linux/modversions.h 4.404 +endif 4.405 + 4.406 +.PHONY: modules 4.407 +modules: $(patsubst %, _mod_%, $(SUBDIRS)) 4.408 + 4.409 +.PHONY: $(patsubst %, _mod_%, $(SUBDIRS)) 4.410 +$(patsubst %, _mod_%, $(SUBDIRS)) : include/linux/version.h include/config/MARKER 4.411 + $(MAKE) -C $(patsubst _mod_%, %, $@) CFLAGS="$(CFLAGS) $(MODFLAGS)" MAKING_MODULES=1 modules 4.412 + 4.413 +.PHONY: modules_install 4.414 +modules_install: _modinst_ $(patsubst %, _modinst_%, $(SUBDIRS)) _modinst_post 4.415 + 4.416 +.PHONY: _modinst_ 4.417 +_modinst_: 4.418 + @rm -rf $(MODLIB)/kernel 4.419 + @rm -f $(MODLIB)/build 4.420 + @mkdir -p $(MODLIB)/kernel 4.421 + @ln -s $(TOPDIR) $(MODLIB)/build 4.422 + 4.423 +# If System.map exists, run depmod. This deliberately does not have a 4.424 +# dependency on System.map since that would run the dependency tree on 4.425 +# vmlinux. This depmod is only for convenience to give the initial 4.426 +# boot a modules.dep even before / is mounted read-write. However the 4.427 +# boot script depmod is the master version. 4.428 +ifeq "$(strip $(INSTALL_MOD_PATH))" "" 4.429 +depmod_opts := 4.430 +else 4.431 +depmod_opts := -b $(INSTALL_MOD_PATH) -r 4.432 +endif 4.433 +.PHONY: _modinst_post 4.434 +_modinst_post: _modinst_post_pcmcia 4.435 +# if [ -r System.map ]; then $(DEPMOD) -ae -F System.map $(depmod_opts) $(KERNELRELEASE); fi 4.436 + 4.437 +# Backwards compatibilty symlinks for people still using old versions 4.438 +# of pcmcia-cs with hard coded pathnames on insmod. Remove 4.439 +# _modinst_post_pcmcia for kernel 2.4.1. 4.440 +.PHONY: _modinst_post_pcmcia 4.441 +_modinst_post_pcmcia: 4.442 + cd $(MODLIB); \ 4.443 + mkdir -p pcmcia; \ 4.444 + find kernel -path '*/pcmcia/*' -name '*.o' | xargs -i -r ln -sf ../{} pcmcia 4.445 + 4.446 +.PHONY: $(patsubst %, _modinst_%, $(SUBDIRS)) 4.447 +$(patsubst %, _modinst_%, $(SUBDIRS)) : 4.448 + $(MAKE) -C $(patsubst _modinst_%, %, $@) modules_install 4.449 + 4.450 +# modules disabled.... 4.451 + 4.452 +else 4.453 +modules modules_install: dummy 4.454 + @echo 4.455 + @echo "The present kernel configuration has modules disabled." 4.456 + @echo "Type 'make config' and enable loadable module support." 4.457 + @echo "Then build a kernel with module support enabled." 4.458 + @echo 4.459 + @exit 1 4.460 +endif 4.461 + 4.462 +clean: archclean 4.463 + find . \( -name '*.[oas]' -o -name core -o -name '.*.flags' \) -type f -print \ 4.464 + | grep -v lxdialog/ | xargs rm -f 4.465 + rm -f $(CLEAN_FILES) 4.466 + rm -rf $(CLEAN_DIRS) 4.467 + $(MAKE) -C Documentation/DocBook clean 4.468 + 4.469 +mrproper: clean archmrproper 4.470 + find . \( -size 0 -o -name .depend \) -type f -print | xargs rm -f 4.471 + rm -f $(MRPROPER_FILES) 4.472 + rm -rf $(MRPROPER_DIRS) 4.473 + $(MAKE) -C Documentation/DocBook mrproper 4.474 + 4.475 +distclean: mrproper 4.476 + rm -f core `find . \( -not -type d \) -and \ 4.477 + \( -name '*.orig' -o -name '*.rej' -o -name '*~' \ 4.478 + -o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \ 4.479 + -o -name '.*.rej' -o -name '.SUMS' -o -size 0 \) -type f -print` TAGS tags 4.480 + 4.481 +backup: mrproper 4.482 + cd .. && tar cf - linux/ | gzip -9 > backup.gz 4.483 + sync 4.484 + 4.485 +sgmldocs: 4.486 + chmod 755 $(TOPDIR)/scripts/docgen 4.487 + chmod 755 $(TOPDIR)/scripts/gen-all-syms 4.488 + chmod 755 $(TOPDIR)/scripts/kernel-doc 4.489 + $(MAKE) -C $(TOPDIR)/Documentation/DocBook books 4.490 + 4.491 +psdocs: sgmldocs 4.492 + $(MAKE) -C Documentation/DocBook ps 4.493 + 4.494 +pdfdocs: sgmldocs 4.495 + $(MAKE) -C Documentation/DocBook pdf 4.496 + 4.497 +htmldocs: sgmldocs 4.498 + $(MAKE) -C Documentation/DocBook html 4.499 + 4.500 +sums: 4.501 + find . -type f -print | sort | xargs sum > .SUMS 4.502 + 4.503 +dep-files: scripts/mkdep archdep include/linux/version.h 4.504 + scripts/mkdep -- init/*.c > .depend 4.505 + scripts/mkdep -- `find $(FINDHPATH) -name SCCS -prune -o -follow -name \*.h ! -name modversions.h -print` > .hdepend 4.506 + $(MAKE) $(patsubst %,_sfdep_%,$(SUBDIRS)) _FASTDEP_ALL_SUB_DIRS="$(SUBDIRS)" 4.507 +ifdef CONFIG_MODVERSIONS 4.508 + $(MAKE) update-modverfile 4.509 +endif 4.510 + 4.511 +ifdef CONFIG_MODVERSIONS 4.512 +MODVERFILE := $(TOPDIR)/include/linux/modversions.h 4.513 +else 4.514 +MODVERFILE := 4.515 +endif 4.516 +export MODVERFILE 4.517 + 4.518 +depend dep: dep-files 4.519 + 4.520 +checkconfig: 4.521 + find * -name '*.[hcS]' -type f -print | sort | xargs $(PERL) -w scripts/checkconfig.pl 4.522 + 4.523 +checkhelp: 4.524 + find * -name [cC]onfig.in -print | sort | xargs $(PERL) -w scripts/checkhelp.pl 4.525 + 4.526 +checkincludes: 4.527 + find * -name '*.[hcS]' -type f -print | sort | xargs $(PERL) -w scripts/checkincludes.pl 4.528 + 4.529 +ifdef CONFIGURATION 4.530 +..$(CONFIGURATION): 4.531 + @echo 4.532 + @echo "You have a bad or nonexistent" .$(CONFIGURATION) ": running 'make" $(CONFIGURATION)"'" 4.533 + @echo 4.534 + $(MAKE) $(CONFIGURATION) 4.535 + @echo 4.536 + @echo "Successful. Try re-making (ignore the error that follows)" 4.537 + @echo 4.538 + exit 1 4.539 + 4.540 +#dummy: ..$(CONFIGURATION) 4.541 +dummy: 4.542 + 4.543 +else 4.544 + 4.545 +dummy: 4.546 + 4.547 +endif 4.548 + 4.549 +include Rules.make 4.550 + 4.551 +# 4.552 +# This generates dependencies for the .h files. 4.553 +# 4.554 + 4.555 +scripts/mkdep: scripts/mkdep.c 4.556 + $(HOSTCC) $(HOSTCFLAGS) -o scripts/mkdep scripts/mkdep.c 4.557 + 4.558 +scripts/split-include: scripts/split-include.c 4.559 + $(HOSTCC) $(HOSTCFLAGS) -o scripts/split-include scripts/split-include.c 4.560 + 4.561 +# 4.562 +# RPM target 4.563 +# 4.564 +# If you do a make spec before packing the tarball you can rpm -ta it 4.565 +# 4.566 +spec: 4.567 + . scripts/mkspec >kernel.spec 4.568 + 4.569 +# 4.570 +# Build a tar ball, generate an rpm from it and pack the result 4.571 +# There arw two bits of magic here 4.572 +# 1) The use of /. to avoid tar packing just the symlink 4.573 +# 2) Removing the .dep files as they have source paths in them that 4.574 +# will become invalid 4.575 +# 4.576 +rpm: clean spec 4.577 + find . \( -size 0 -o -name .depend -o -name .hdepend \) -type f -print | xargs rm -f 4.578 + set -e; \ 4.579 + cd $(TOPDIR)/.. ; \ 4.580 + ln -sf $(TOPDIR) $(KERNELPATH) ; \ 4.581 + tar -cvz --exclude CVS -f $(KERNELPATH).tar.gz $(KERNELPATH)/. ; \ 4.582 + rm $(KERNELPATH) ; \ 4.583 + cd $(TOPDIR) ; \ 4.584 + . scripts/mkversion > .version ; \ 4.585 + rpm -ta $(TOPDIR)/../$(KERNELPATH).tar.gz ; \ 4.586 + rm $(TOPDIR)/../$(KERNELPATH).tar.gz
5.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 5.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/Makefile Mon Feb 24 16:55:07 2003 +0000 5.3 @@ -0,0 +1,98 @@ 5.4 +# 5.5 +# xeno/Makefile 5.6 +# 5.7 +# This file is included by the global makefile so that you can add your own 5.8 +# architecture-specific flags and dependencies. Remember to do have actions 5.9 +# for "archclean" and "archdep" for cleaning up and making dependencies for 5.10 +# this architecture 5.11 +# 5.12 +# This file is subject to the terms and conditions of the GNU General Public 5.13 +# License. See the file "COPYING" in the main directory of this archive 5.14 +# for more details. 5.15 +# 5.16 +# Copyright (C) 1994 by Linus Torvalds 5.17 +# 5.18 +# 19990713 Artur Skawina <skawina@geocities.com> 5.19 +# Added '-march' and '-mpreferred-stack-boundary' support 5.20 +# 5.21 + 5.22 +LD=$(CROSS_COMPILE)ld -m elf_i386 5.23 +OBJCOPY=$(CROSS_COMPILE)objcopy -O binary -R .note -R .comment -S 5.24 +LDFLAGS=-e stext 5.25 +LINKFLAGS =-T $(TOPDIR)/arch/xeno/vmlinux.lds $(LDFLAGS) 5.26 + 5.27 +CFLAGS += -pipe 5.28 + 5.29 +# prevent gcc from keeping the stack 16 byte aligned 5.30 +CFLAGS += $(shell if $(CC) -mpreferred-stack-boundary=2 -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-mpreferred-stack-boundary=2"; fi) 5.31 + 5.32 +ifdef CONFIG_M686 5.33 +CFLAGS += -march=i686 5.34 +endif 5.35 + 5.36 +ifdef CONFIG_MPENTIUMIII 5.37 +CFLAGS += -march=i686 5.38 +endif 5.39 + 5.40 +ifdef CONFIG_MPENTIUM4 5.41 +CFLAGS += -march=i686 5.42 +endif 5.43 + 5.44 +ifdef CONFIG_MK7 5.45 +CFLAGS += $(shell if $(CC) -march=athlon -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-march=athlon"; else echo "-march=i686 -malign-functions=4"; fi) 5.46 +endif 5.47 + 5.48 +HEAD := arch/xeno/kernel/head.o arch/xeno/kernel/init_task.o 5.49 + 5.50 +SUBDIRS += arch/xeno/kernel arch/xeno/mm arch/xeno/lib 5.51 +SUBDIRS += arch/xeno/drivers/console arch/xeno/drivers/network 5.52 +SUBDIRS += arch/xeno/drivers/dom0 arch/xeno/drivers/block 5.53 + 5.54 +CORE_FILES += arch/xeno/kernel/kernel.o arch/xeno/mm/mm.o 5.55 +CORE_FILES += arch/xeno/drivers/console/con.o 5.56 +CORE_FILES += arch/xeno/drivers/block/blk.o 5.57 +CORE_FILES += arch/xeno/drivers/network/net.o 5.58 +CORE_FILES += arch/xeno/drivers/dom0/dom0.o 5.59 +LIBS := $(TOPDIR)/arch/xeno/lib/lib.a $(LIBS) $(TOPDIR)/arch/xeno/lib/lib.a 5.60 + 5.61 +arch/xeno/kernel: dummy 5.62 + $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/kernel 5.63 + 5.64 +arch/xeno/mm: dummy 5.65 + $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/mm 5.66 + 5.67 +arch/xeno/drivers/console: dummy 5.68 + $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/drivers/console 5.69 + 5.70 +arch/xeno/drivers/network: dummy 5.71 + $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/drivers/network 5.72 + 5.73 +arch/xeno/drivers/block: dummy 5.74 + $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/drivers/block 5.75 + 5.76 +arch/xeno/drivers/dom0: dummy 5.77 + $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/drivers/dom0 5.78 + 5.79 +ifdef CONFIG_KDB 5.80 +arch/xeno/kdb: dummy 5.81 + $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/kdb 5.82 +endif 5.83 + 5.84 +MAKEBOOT = $(MAKE) -C arch/$(ARCH)/boot 5.85 + 5.86 +vmlinux: arch/xeno/vmlinux.lds 5.87 + 5.88 +FORCE: ; 5.89 + 5.90 +.PHONY: bzImage compressed clean archclean archmrproper archdep 5.91 + 5.92 +bzImage: vmlinux 5.93 + @$(MAKEBOOT) image.gz 5.94 + 5.95 +archclean: 5.96 + @$(MAKEBOOT) clean 5.97 + 5.98 +archmrproper: 5.99 + 5.100 +archdep: 5.101 + @$(MAKEBOOT) dep
6.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 6.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/boot/Makefile Mon Feb 24 16:55:07 2003 +0000 6.3 @@ -0,0 +1,22 @@ 6.4 +# 6.5 +# arch/xeno/boot/Makefile 6.6 +# 6.7 + 6.8 +image.gz: image 6.9 + gzip -f -9 < $< > $@ 6.10 + 6.11 +image: $(TOPDIR)/vmlinux 6.12 + # Guest OS header -- first 8 bytes are identifier 'XenoGues'. 6.13 + echo -e -n 'XenoGues' >$@ 6.14 + # Guest OS header -- next 4 bytes are load address (0xC0000000). 6.15 + echo -e -n '\000\000\000\300' >>$@ 6.16 + $(OBJCOPY) $< image.body 6.17 + # Guest OS header is immediately followed by raw OS image. 6.18 + # Start address must be at byte 0. 6.19 + cat image.body >>$@ 6.20 + rm -f image.body 6.21 + 6.22 +dep: 6.23 + 6.24 +clean: 6.25 + rm -f image image.gz
7.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 7.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/config.in Mon Feb 24 16:55:07 2003 +0000 7.3 @@ -0,0 +1,135 @@ 7.4 +# 7.5 +# For a description of the syntax of this configuration file, 7.6 +# see Documentation/kbuild/config-language.txt. 7.7 +# 7.8 +mainmenu_name "Linux Kernel Configuration" 7.9 + 7.10 +define_bool CONFIG_XENO y 7.11 + 7.12 +define_bool CONFIG_X86 y 7.13 +define_bool CONFIG_ISA y 7.14 +define_bool CONFIG_SBUS n 7.15 + 7.16 +define_bool CONFIG_UID16 y 7.17 + 7.18 +mainmenu_option next_comment 7.19 +comment 'Code maturity level options' 7.20 +bool 'Prompt for development and/or incomplete code/drivers' CONFIG_EXPERIMENTAL 7.21 +endmenu 7.22 + 7.23 +mainmenu_option next_comment 7.24 +comment 'Loadable module support' 7.25 +bool 'Enable loadable module support' CONFIG_MODULES 7.26 +if [ "$CONFIG_MODULES" = "y" ]; then 7.27 + bool ' Set version information on all module symbols' CONFIG_MODVERSIONS 7.28 + bool ' Kernel module loader' CONFIG_KMOD 7.29 +fi 7.30 +endmenu 7.31 + 7.32 +mainmenu_option next_comment 7.33 +comment 'Processor type and features' 7.34 +choice 'Processor family' \ 7.35 + "Pentium-Pro/Celeron/Pentium-II CONFIG_M686 \ 7.36 + Pentium-III/Celeron(Coppermine) CONFIG_MPENTIUMIII \ 7.37 + Pentium-4 CONFIG_MPENTIUM4 \ 7.38 + Athlon/Duron/K7 CONFIG_MK7" Pentium-Pro 7.39 + 7.40 + define_bool CONFIG_X86_WP_WORKS_OK y 7.41 + define_bool CONFIG_X86_INVLPG y 7.42 + define_bool CONFIG_X86_CMPXCHG y 7.43 + define_bool CONFIG_X86_XADD y 7.44 + define_bool CONFIG_X86_BSWAP y 7.45 + define_bool CONFIG_X86_POPAD_OK y 7.46 + define_bool CONFIG_RWSEM_GENERIC_SPINLOCK n 7.47 + define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM y 7.48 + 7.49 + define_bool CONFIG_X86_GOOD_APIC y 7.50 + define_bool CONFIG_X86_PGE y 7.51 + define_bool CONFIG_X86_USE_PPRO_CHECKSUM y 7.52 + define_bool CONFIG_X86_TSC y 7.53 + 7.54 +if [ "$CONFIG_M686" = "y" ]; then 7.55 + define_int CONFIG_X86_L1_CACHE_SHIFT 5 7.56 +fi 7.57 +if [ "$CONFIG_MPENTIUMIII" = "y" ]; then 7.58 + define_int CONFIG_X86_L1_CACHE_SHIFT 5 7.59 +fi 7.60 +if [ "$CONFIG_MPENTIUM4" = "y" ]; then 7.61 + define_int CONFIG_X86_L1_CACHE_SHIFT 7 7.62 +fi 7.63 +if [ "$CONFIG_MK7" = "y" ]; then 7.64 + define_int CONFIG_X86_L1_CACHE_SHIFT 6 7.65 + define_bool CONFIG_X86_USE_3DNOW y 7.66 +fi 7.67 + 7.68 +choice 'High Memory Support' \ 7.69 + "off CONFIG_NOHIGHMEM \ 7.70 + 4GB CONFIG_HIGHMEM4G \ 7.71 + 64GB CONFIG_HIGHMEM64G" off 7.72 +if [ "$CONFIG_HIGHMEM4G" = "y" ]; then 7.73 + define_bool CONFIG_HIGHMEM y 7.74 +fi 7.75 +if [ "$CONFIG_HIGHMEM64G" = "y" ]; then 7.76 + define_bool CONFIG_HIGHMEM y 7.77 + define_bool CONFIG_X86_PAE y 7.78 +fi 7.79 + 7.80 +#bool 'Symmetric multi-processing support' CONFIG_SMP 7.81 +#if [ "$CONFIG_SMP" = "y" -a "$CONFIG_X86_CMPXCHG" = "y" ]; then 7.82 +# define_bool CONFIG_HAVE_DEC_LOCK y 7.83 +#fi 7.84 +endmenu 7.85 + 7.86 +mainmenu_option next_comment 7.87 +comment 'General setup' 7.88 + 7.89 +bool 'Networking support' CONFIG_NET 7.90 + 7.91 +bool 'System V IPC' CONFIG_SYSVIPC 7.92 +bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT 7.93 +bool 'Sysctl support' CONFIG_SYSCTL 7.94 +if [ "$CONFIG_PROC_FS" = "y" ]; then 7.95 + choice 'Kernel core (/proc/kcore) format' \ 7.96 + "ELF CONFIG_KCORE_ELF \ 7.97 + A.OUT CONFIG_KCORE_AOUT" ELF 7.98 +fi 7.99 +tristate 'Kernel support for a.out binaries' CONFIG_BINFMT_AOUT 7.100 +tristate 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF 7.101 +tristate 'Kernel support for MISC binaries' CONFIG_BINFMT_MISC 7.102 + 7.103 +endmenu 7.104 + 7.105 +if [ "$CONFIG_NET" = "y" ]; then 7.106 + source net/Config.in 7.107 +fi 7.108 + 7.109 +source drivers/block/Config.in 7.110 +define_bool CONFIG_BLK_DEV_IDE_MODES n 7.111 +define_bool CONFIG_BLK_DEV_HD n 7.112 + 7.113 +source fs/Config.in 7.114 + 7.115 +mainmenu_option next_comment 7.116 +comment 'Kernel hacking' 7.117 + 7.118 +bool 'Kernel debugging' CONFIG_DEBUG_KERNEL 7.119 +if [ "$CONFIG_DEBUG_KERNEL" != "n" ]; then 7.120 + bool ' Debug high memory support' CONFIG_DEBUG_HIGHMEM 7.121 + bool ' Debug memory allocations' CONFIG_DEBUG_SLAB 7.122 + bool ' Memory mapped I/O debugging' CONFIG_DEBUG_IOVIRT 7.123 + bool ' Magic SysRq key' CONFIG_MAGIC_SYSRQ 7.124 + bool ' Spinlock debugging' CONFIG_DEBUG_SPINLOCK 7.125 + bool ' Verbose BUG() reporting (adds 70K)' CONFIG_DEBUG_BUGVERBOSE 7.126 + bool ' Built-in Kernel Debugger support' CONFIG_KDB 7.127 + dep_tristate ' KDB modules' CONFIG_KDB_MODULES $CONFIG_KDB 7.128 + if [ "$CONFIG_KDB" = "y" ]; then 7.129 + bool ' KDB off by default' CONFIG_KDB_OFF 7.130 + comment ' Load all symbols for debugging is required for KDB' 7.131 + define_bool CONFIG_KALLSYMS y 7.132 + else 7.133 + bool ' Load all symbols for debugging' CONFIG_KALLSYMS 7.134 + fi 7.135 + bool ' Compile the kernel with frame pointers' CONFIG_FRAME_POINTER 7.136 +fi 7.137 + 7.138 +endmenu
8.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 8.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/defconfig Mon Feb 24 16:55:07 2003 +0000 8.3 @@ -0,0 +1,392 @@ 8.4 +# 8.5 +# Automatically generated make config: don't edit 8.6 +# 8.7 +CONFIG_X86=y 8.8 +CONFIG_ISA=y 8.9 +# CONFIG_SBUS is not set 8.10 +CONFIG_UID16=y 8.11 + 8.12 +# 8.13 +# Code maturity level options 8.14 +# 8.15 +# CONFIG_EXPERIMENTAL is not set 8.16 + 8.17 +# 8.18 +# Loadable module support 8.19 +# 8.20 +CONFIG_MODULES=y 8.21 +CONFIG_MODVERSIONS=y 8.22 +CONFIG_KMOD=y 8.23 + 8.24 +# 8.25 +# Processor type and features 8.26 +# 8.27 +# CONFIG_M386 is not set 8.28 +# CONFIG_M486 is not set 8.29 +# CONFIG_M586 is not set 8.30 +# CONFIG_M586TSC is not set 8.31 +# CONFIG_M586MMX is not set 8.32 +CONFIG_M686=y 8.33 +# CONFIG_MPENTIUMIII is not set 8.34 +# CONFIG_MPENTIUM4 is not set 8.35 +# CONFIG_MK6 is not set 8.36 +# CONFIG_MK7 is not set 8.37 +# CONFIG_MCRUSOE is not set 8.38 +# CONFIG_MWINCHIPC6 is not set 8.39 +# CONFIG_MWINCHIP2 is not set 8.40 +# CONFIG_MWINCHIP3D is not set 8.41 +# CONFIG_MCYRIXIII is not set 8.42 +CONFIG_X86_WP_WORKS_OK=y 8.43 +CONFIG_X86_INVLPG=y 8.44 +CONFIG_X86_CMPXCHG=y 8.45 +CONFIG_X86_XADD=y 8.46 +CONFIG_X86_BSWAP=y 8.47 +CONFIG_X86_POPAD_OK=y 8.48 +# CONFIG_RWSEM_GENERIC_SPINLOCK is not set 8.49 +CONFIG_RWSEM_XCHGADD_ALGORITHM=y 8.50 +CONFIG_X86_L1_CACHE_SHIFT=5 8.51 +CONFIG_X86_TSC=y 8.52 +CONFIG_X86_GOOD_APIC=y 8.53 +CONFIG_X86_PGE=y 8.54 +CONFIG_X86_USE_PPRO_CHECKSUM=y 8.55 +# CONFIG_TOSHIBA is not set 8.56 +# CONFIG_I8K is not set 8.57 +# CONFIG_MICROCODE is not set 8.58 +# CONFIG_X86_MSR is not set 8.59 +# CONFIG_X86_CPUID is not set 8.60 +CONFIG_NOHIGHMEM=y 8.61 +# CONFIG_HIGHMEM4G is not set 8.62 +# CONFIG_HIGHMEM64G is not set 8.63 +# CONFIG_MATH_EMULATION is not set 8.64 +# CONFIG_MTRR is not set 8.65 +# CONFIG_SMP is not set 8.66 +# CONFIG_X86_UP_APIC is not set 8.67 + 8.68 +# 8.69 +# General setup 8.70 +# 8.71 +CONFIG_NET=y 8.72 +# CONFIG_PCI is not set 8.73 +# CONFIG_EISA is not set 8.74 +# CONFIG_MCA is not set 8.75 +# CONFIG_HOTPLUG is not set 8.76 +# CONFIG_PCMCIA is not set 8.77 +# CONFIG_HOTPLUG_PCI is not set 8.78 +CONFIG_SYSVIPC=y 8.79 +# CONFIG_BSD_PROCESS_ACCT is not set 8.80 +CONFIG_SYSCTL=y 8.81 +CONFIG_KCORE_ELF=y 8.82 +# CONFIG_KCORE_AOUT is not set 8.83 +CONFIG_BINFMT_AOUT=y 8.84 +CONFIG_BINFMT_ELF=y 8.85 +# CONFIG_BINFMT_MISC is not set 8.86 +# CONFIG_PM is not set 8.87 +# CONFIG_APM_IGNORE_USER_SUSPEND is not set 8.88 +# CONFIG_APM_DO_ENABLE is not set 8.89 +# CONFIG_APM_CPU_IDLE is not set 8.90 +# CONFIG_APM_DISPLAY_BLANK is not set 8.91 +# CONFIG_APM_RTC_IS_GMT is not set 8.92 +# CONFIG_APM_ALLOW_INTS is not set 8.93 +# CONFIG_APM_REAL_MODE_POWER_OFF is not set 8.94 + 8.95 +# 8.96 +# Memory Technology Devices (MTD) 8.97 +# 8.98 +# CONFIG_MTD is not set 8.99 + 8.100 +# 8.101 +# Parallel port support 8.102 +# 8.103 +# CONFIG_PARPORT is not set 8.104 + 8.105 +# 8.106 +# Plug and Play configuration 8.107 +# 8.108 +# CONFIG_PNP is not set 8.109 + 8.110 +# 8.111 +# Block devices 8.112 +# 8.113 +# CONFIG_BLK_DEV_FD is not set 8.114 +# CONFIG_BLK_DEV_XD is not set 8.115 +CONFIG_BLK_DEV_LOOP=y 8.116 +CONFIG_BLK_DEV_NBD=y 8.117 +CONFIG_BLK_DEV_RAM=y 8.118 +CONFIG_BLK_DEV_RAM_SIZE=4096 8.119 +# CONFIG_BLK_DEV_INITRD is not set 8.120 +CONFIG_XENOLINUX_BLOCK=y 8.121 + 8.122 +# 8.123 +# Multi-device support (RAID and LVM) 8.124 +# 8.125 +# CONFIG_MD is not set 8.126 + 8.127 +# 8.128 +# Networking options 8.129 +# 8.130 +CONFIG_PACKET=y 8.131 +CONFIG_PACKET_MMAP=y 8.132 +CONFIG_NETLINK=y 8.133 +CONFIG_RTNETLINK=y 8.134 +# CONFIG_NETLINK_DEV is not set 8.135 +# CONFIG_NETFILTER is not set 8.136 +CONFIG_FILTER=y 8.137 +CONFIG_UNIX=y 8.138 +CONFIG_INET=y 8.139 +# CONFIG_IP_MULTICAST is not set 8.140 +# CONFIG_IP_ADVANCED_ROUTER is not set 8.141 +CONFIG_IP_PNP=y 8.142 +# CONFIG_IP_PNP_DHCP is not set 8.143 +# CONFIG_IP_PNP_BOOTP is not set 8.144 +# CONFIG_IP_PNP_RARP is not set 8.145 +# CONFIG_NET_IPIP is not set 8.146 +# CONFIG_NET_IPGRE is not set 8.147 +# CONFIG_INET_ECN is not set 8.148 +# CONFIG_SYN_COOKIES is not set 8.149 + 8.150 +# 8.151 +# 8.152 +# 8.153 +# CONFIG_IPX is not set 8.154 +# CONFIG_ATALK is not set 8.155 +# CONFIG_DECNET is not set 8.156 +# CONFIG_BRIDGE is not set 8.157 + 8.158 +# 8.159 +# QoS and/or fair queueing 8.160 +# 8.161 +# CONFIG_NET_SCHED is not set 8.162 + 8.163 +# 8.164 +# Telephony Support 8.165 +# 8.166 +# CONFIG_PHONE is not set 8.167 + 8.168 +# 8.169 +# ATA/IDE/MFM/RLL support 8.170 +# 8.171 +# CONFIG_IDE is not set 8.172 +# CONFIG_BLK_DEV_IDE_MODES is not set 8.173 +# CONFIG_BLK_DEV_HD is not set 8.174 + 8.175 +# 8.176 +# SCSI support 8.177 +# 8.178 +# CONFIG_SCSI is not set 8.179 + 8.180 +# 8.181 +# Fusion MPT device support 8.182 +# 8.183 +# CONFIG_FUSION_BOOT is not set 8.184 +# CONFIG_FUSION_ISENSE is not set 8.185 +# CONFIG_FUSION_CTL is not set 8.186 +# CONFIG_FUSION_LAN is not set 8.187 + 8.188 +# 8.189 +# I2O device support 8.190 +# 8.191 +# CONFIG_I2O is not set 8.192 + 8.193 +# 8.194 +# Network device support 8.195 +# 8.196 +# CONFIG_NETDEVICES is not set 8.197 + 8.198 +# 8.199 +# Amateur Radio support 8.200 +# 8.201 +# CONFIG_HAMRADIO is not set 8.202 + 8.203 +# 8.204 +# IrDA (infrared) support 8.205 +# 8.206 +# CONFIG_IRDA is not set 8.207 + 8.208 +# 8.209 +# ISDN subsystem 8.210 +# 8.211 +# CONFIG_ISDN is not set 8.212 + 8.213 +# 8.214 +# Old CD-ROM drivers (not SCSI, not IDE) 8.215 +# 8.216 +# CONFIG_CD_NO_IDESCSI is not set 8.217 + 8.218 +# 8.219 +# Input core support 8.220 +# 8.221 +# CONFIG_INPUT is not set 8.222 +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 8.223 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 8.224 + 8.225 +# 8.226 +# Character devices 8.227 +# 8.228 +# CONFIG_VT is not set 8.229 +# CONFIG_SERIAL is not set 8.230 +# CONFIG_SERIAL_NONSTANDARD is not set 8.231 +# CONFIG_UNIX98_PTYS is not set 8.232 + 8.233 +# 8.234 +# I2C support 8.235 +# 8.236 +# CONFIG_I2C is not set 8.237 + 8.238 +# 8.239 +# Mice 8.240 +# 8.241 +# CONFIG_BUSMOUSE is not set 8.242 +# CONFIG_MOUSE is not set 8.243 + 8.244 +# 8.245 +# Joysticks 8.246 +# 8.247 +# CONFIG_INPUT_GAMEPORT is not set 8.248 + 8.249 +# 8.250 +# Input core support is needed for gameports 8.251 +# 8.252 + 8.253 +# 8.254 +# Input core support is needed for joysticks 8.255 +# 8.256 +# CONFIG_QIC02_TAPE is not set 8.257 + 8.258 +# 8.259 +# Watchdog Cards 8.260 +# 8.261 +# CONFIG_WATCHDOG is not set 8.262 +# CONFIG_NVRAM is not set 8.263 +# CONFIG_RTC is not set 8.264 +# CONFIG_DTLK is not set 8.265 +# CONFIG_R3964 is not set 8.266 +# CONFIG_APPLICOM is not set 8.267 + 8.268 +# 8.269 +# Ftape, the floppy tape device driver 8.270 +# 8.271 +# CONFIG_FTAPE is not set 8.272 +# CONFIG_AGP is not set 8.273 +# CONFIG_DRM is not set 8.274 +# CONFIG_MWAVE is not set 8.275 + 8.276 +# 8.277 +# Multimedia devices 8.278 +# 8.279 +# CONFIG_VIDEO_DEV is not set 8.280 + 8.281 +# 8.282 +# File systems 8.283 +# 8.284 +# CONFIG_QUOTA is not set 8.285 +CONFIG_AUTOFS_FS=y 8.286 +CONFIG_AUTOFS4_FS=y 8.287 +CONFIG_EXT3_FS=y 8.288 +CONFIG_JBD=y 8.289 +# CONFIG_FAT_FS is not set 8.290 +# CONFIG_CRAMFS is not set 8.291 +# CONFIG_TMPFS is not set 8.292 +# CONFIG_RAMFS is not set 8.293 +# CONFIG_ISO9660_FS is not set 8.294 +# CONFIG_MINIX_FS is not set 8.295 +# CONFIG_VXFS_FS is not set 8.296 +# CONFIG_NTFS_FS is not set 8.297 +# CONFIG_HPFS_FS is not set 8.298 +CONFIG_PROC_FS=y 8.299 +# CONFIG_ROMFS_FS is not set 8.300 +CONFIG_EXT2_FS=y 8.301 +# CONFIG_SYSV_FS is not set 8.302 +# CONFIG_UDF_FS is not set 8.303 +# CONFIG_UFS_FS is not set 8.304 + 8.305 +# 8.306 +# Network File Systems 8.307 +# 8.308 +# CONFIG_CODA_FS is not set 8.309 +CONFIG_NFS_FS=y 8.310 +CONFIG_NFS_V3=y 8.311 +CONFIG_ROOT_NFS=y 8.312 +CONFIG_NFSD=y 8.313 +CONFIG_NFSD_V3=y 8.314 +CONFIG_SUNRPC=y 8.315 +CONFIG_LOCKD=y 8.316 +CONFIG_LOCKD_V4=y 8.317 +# CONFIG_SMB_FS is not set 8.318 +# CONFIG_NCP_FS is not set 8.319 +# CONFIG_ZISOFS_FS is not set 8.320 +# CONFIG_ZLIB_FS_INFLATE is not set 8.321 + 8.322 +# 8.323 +# Partition Types 8.324 +# 8.325 +# CONFIG_PARTITION_ADVANCED is not set 8.326 +CONFIG_MSDOS_PARTITION=y 8.327 +# CONFIG_SMB_NLS is not set 8.328 +# CONFIG_NLS is not set 8.329 + 8.330 +# 8.331 +# Sound 8.332 +# 8.333 +# CONFIG_SOUND is not set 8.334 + 8.335 +# 8.336 +# USB support 8.337 +# 8.338 + 8.339 +# 8.340 +# USB Controllers 8.341 +# 8.342 + 8.343 +# 8.344 +# USB Device Class drivers 8.345 +# 8.346 + 8.347 +# 8.348 +# USB Human Interface Devices (HID) 8.349 +# 8.350 + 8.351 +# 8.352 +# Input core support is needed for USB HID 8.353 +# 8.354 + 8.355 +# 8.356 +# USB Imaging devices 8.357 +# 8.358 + 8.359 +# 8.360 +# USB Multimedia devices 8.361 +# 8.362 + 8.363 +# 8.364 +# Video4Linux support is needed for USB Multimedia device support 8.365 +# 8.366 + 8.367 +# 8.368 +# USB Network adaptors 8.369 +# 8.370 + 8.371 +# 8.372 +# USB port drivers 8.373 +# 8.374 + 8.375 +# 8.376 +# USB Serial Converter support 8.377 +# 8.378 + 8.379 +# 8.380 +# USB Miscellaneous drivers 8.381 +# 8.382 + 8.383 +# 8.384 +# Kernel hacking 8.385 +# 8.386 +CONFIG_DEBUG_KERNEL=y 8.387 +# CONFIG_DEBUG_HIGHMEM is not set 8.388 +# CONFIG_DEBUG_SLAB is not set 8.389 +# CONFIG_DEBUG_IOVIRT is not set 8.390 +# CONFIG_MAGIC_SYSRQ is not set 8.391 +# CONFIG_DEBUG_SPINLOCK is not set 8.392 +# CONFIG_DEBUG_BUGVERBOSE is not set 8.393 +# CONFIG_KDB is not set 8.394 +CONFIG_KALLSYMS=y 8.395 +# CONFIG_FRAME_POINTER is not set
9.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 9.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/drivers/block/Makefile Mon Feb 24 16:55:07 2003 +0000 9.3 @@ -0,0 +1,3 @@ 9.4 +O_TARGET := blk.o 9.5 +obj-y := xl_block.o xl_block_test.o 9.6 +include $(TOPDIR)/Rules.make
10.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 10.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/drivers/block/xl_block.c Mon Feb 24 16:55:07 2003 +0000 10.3 @@ -0,0 +1,490 @@ 10.4 +/****************************************************************************** 10.5 + * xl_block.c 10.6 + * 10.7 + * Xenolinux virtual block-device driver. 10.8 + * 10.9 + */ 10.10 + 10.11 +#include <linux/config.h> 10.12 +#include <linux/module.h> 10.13 + 10.14 +#include <linux/kernel.h> 10.15 +#include <linux/sched.h> 10.16 +#include <linux/slab.h> 10.17 +#include <linux/string.h> 10.18 +#include <linux/errno.h> 10.19 + 10.20 +#include <linux/fs.h> 10.21 +#include <linux/hdreg.h> 10.22 +#include <linux/blkdev.h> 10.23 +#include <linux/major.h> 10.24 + 10.25 +#include <asm/hypervisor-ifs/block.h> 10.26 +#include <asm/hypervisor-ifs/hypervisor-if.h> 10.27 +#include <asm/io.h> 10.28 +#include <asm/uaccess.h> 10.29 + 10.30 +#define MAJOR_NR XLBLK_MAJOR /* force defns in blk.h, must precede include */ 10.31 +static int xlblk_major = XLBLK_MAJOR; 10.32 +#include <linux/blk.h> 10.33 + 10.34 +/* Copied from linux/ide.h */ 10.35 +typedef unsigned char byte; 10.36 + 10.37 +void xlblk_ide_register_disk(int, unsigned long); 10.38 + 10.39 +#define XLBLK_MAX 32 /* Maximum minor devices we support */ 10.40 +#define XLBLK_MAJOR_NAME "xhd" 10.41 +#define IDE_PARTN_BITS 6 /* from ide.h::PARTN_BITS */ 10.42 +#define IDE_PARTN_MASK ((1<<IDE_PARTN_BITS)-1) /* from ide.h::PARTN_MASK */ 10.43 +static int xlblk_blk_size[XLBLK_MAX]; 10.44 +static int xlblk_blksize_size[XLBLK_MAX]; 10.45 +static int xlblk_read_ahead; 10.46 +static int xlblk_hardsect_size[XLBLK_MAX]; 10.47 +static int xlblk_max_sectors[XLBLK_MAX]; 10.48 + 10.49 +#define XLBLK_RESPONSE_IRQ _EVENT_BLK_RESP 10.50 + 10.51 +#define DEBUG_IRQ _EVENT_DEBUG 10.52 + 10.53 +#if 0 10.54 +#define DPRINTK(_f, _a...) printk ( KERN_ALERT _f , ## _a ) 10.55 +#define DPRINTK_IOCTL(_f, _a...) printk ( KERN_ALERT _f , ## _a ) 10.56 +#else 10.57 +#define DPRINTK(_f, _a...) ((void)0) 10.58 +#define DPRINTK_IOCTL(_f, _a...) ((void)0) 10.59 +#endif 10.60 + 10.61 +static blk_ring_t *blk_ring; 10.62 +static unsigned int resp_cons; /* Response consumer for comms ring. */ 10.63 +static xen_disk_info_t xen_disk_info; 10.64 + 10.65 +int hypervisor_request(void * id, 10.66 + int operation, 10.67 + char * buffer, 10.68 + unsigned long block_number, 10.69 + unsigned short block_size, 10.70 + kdev_t device); 10.71 + 10.72 + 10.73 +/* ------------------------------------------------------------------------ 10.74 + */ 10.75 + 10.76 +static int xenolinux_block_open(struct inode *inode, struct file *filep) 10.77 +{ 10.78 + DPRINTK("xenolinux_block_open\n"); 10.79 + return 0; 10.80 +} 10.81 + 10.82 +static int xenolinux_block_release(struct inode *inode, struct file *filep) 10.83 +{ 10.84 + DPRINTK("xenolinux_block_release\n"); 10.85 + return 0; 10.86 +} 10.87 + 10.88 +static int xenolinux_block_ioctl(struct inode *inode, struct file *filep, 10.89 + unsigned command, unsigned long argument) 10.90 +{ 10.91 + int minor_dev; 10.92 + struct hd_geometry *geo = (struct hd_geometry *)argument; 10.93 + 10.94 + DPRINTK("xenolinux_block_ioctl\n"); 10.95 + 10.96 + /* check permissions */ 10.97 + if (!capable(CAP_SYS_ADMIN)) return -EPERM; 10.98 + if (!inode) return -EINVAL; 10.99 + minor_dev = MINOR(inode->i_rdev); 10.100 + if (minor_dev >= XLBLK_MAX) return -ENODEV; 10.101 + 10.102 + DPRINTK_IOCTL("command: 0x%x, argument: 0x%lx, minor: 0x%x\n", 10.103 + command, (long) argument, minor_dev); 10.104 + 10.105 + switch (command) 10.106 + { 10.107 + case BLKGETSIZE: 10.108 + DPRINTK_IOCTL(" BLKGETSIZE: %x %lx\n", BLKGETSIZE, 10.109 + (long) xen_disk_info.disks[0].capacity); 10.110 + return put_user(xen_disk_info.disks[0].capacity, 10.111 + (unsigned long *) argument); 10.112 + 10.113 + case BLKRRPART: 10.114 + DPRINTK_IOCTL(" BLKRRPART: %x\n", BLKRRPART); 10.115 + break; 10.116 + 10.117 + case BLKSSZGET: 10.118 + DPRINTK_IOCTL(" BLKSSZGET: %x 0x%x\n", BLKSSZGET, 10.119 + xlblk_hardsect_size[minor_dev]); 10.120 + return xlblk_hardsect_size[minor_dev]; 10.121 + 10.122 + case HDIO_GETGEO: 10.123 + DPRINTK_IOCTL(" HDIO_GETGEO: %x\n", HDIO_GETGEO); 10.124 + if (!argument) return -EINVAL; 10.125 + if (put_user(0x00, (unsigned long *) &geo->start)) return -EFAULT; 10.126 + if (put_user(0xff, (byte *)&geo->heads)) return -EFAULT; 10.127 + if (put_user(0x3f, (byte *)&geo->sectors)) return -EFAULT; 10.128 + if (put_user(0x106, (unsigned short *)&geo->cylinders)) return -EFAULT; 10.129 + return 0; 10.130 + 10.131 + case HDIO_GETGEO_BIG: 10.132 + DPRINTK_IOCTL(" HDIO_GETGEO_BIG: %x\n", HDIO_GETGEO_BIG); 10.133 + if (!argument) return -EINVAL; 10.134 + if (put_user(0x00, (unsigned long *) &geo->start)) return -EFAULT; 10.135 + if (put_user(0xff, (byte *)&geo->heads)) return -EFAULT; 10.136 + if (put_user(0x3f, (byte *)&geo->sectors)) return -EFAULT; 10.137 + if (put_user(0x106, (unsigned int *) &geo->cylinders)) return -EFAULT; 10.138 + 10.139 + return 0; 10.140 + 10.141 + default: 10.142 + DPRINTK_IOCTL(" eh? unknown ioctl\n"); 10.143 + break; 10.144 + } 10.145 + 10.146 + return 0; 10.147 +} 10.148 + 10.149 +static int xenolinux_block_check(kdev_t dev) 10.150 +{ 10.151 + DPRINTK("xenolinux_block_check\n"); 10.152 + return 0; 10.153 +} 10.154 + 10.155 +static int xenolinux_block_revalidate(kdev_t dev) 10.156 +{ 10.157 + DPRINTK("xenolinux_block_revalidate\n"); 10.158 + return 0; 10.159 +} 10.160 + 10.161 +/* 10.162 + * hypervisor_request 10.163 + * 10.164 + * request block io 10.165 + * 10.166 + * id: for guest use only. 10.167 + * operation: XEN_BLOCK_READ, XEN_BLOCK_WRITE or XEN_BLOCK_PROBE 10.168 + * buffer: buffer to read/write into. this should be a 10.169 + * virtual address in the guest os. 10.170 + * block_number: block to read 10.171 + * block_size: size of each block 10.172 + * device: ide/hda is 768 or 0x300 10.173 + */ 10.174 +int hypervisor_request(void * id, 10.175 + int operation, 10.176 + char * buffer, 10.177 + unsigned long block_number, 10.178 + unsigned short block_size, 10.179 + kdev_t device) 10.180 +{ 10.181 + int position; 10.182 + void *buffer_ma; 10.183 + kdev_t phys_device = (kdev_t) 0; 10.184 + unsigned long sector_number = 0; 10.185 + struct gendisk *gd; 10.186 + 10.187 + /* 10.188 + * Bail if there's no room in the request communication ring. This may be 10.189 + * because we have a whole bunch of outstanding responses to process. No 10.190 + * matter, as the response handler will kick the request queue. 10.191 + */ 10.192 + if ( BLK_RING_INC(blk_ring->req_prod) == resp_cons ) 10.193 + return 1; 10.194 + 10.195 + buffer_ma = (void *)phys_to_machine(virt_to_phys(buffer)); 10.196 + 10.197 + switch ( operation ) 10.198 + { 10.199 + case XEN_BLOCK_PROBE: 10.200 + phys_device = (kdev_t) 0; 10.201 + sector_number = 0; 10.202 + break; 10.203 + 10.204 + case XEN_BLOCK_READ: 10.205 + case XEN_BLOCK_WRITE: 10.206 + if ( MAJOR(device) != XLBLK_MAJOR ) 10.207 + panic("error: xl_block::hypervisor_request: " 10.208 + "unknown device [0x%x]\n", device); 10.209 + phys_device = MKDEV(IDE0_MAJOR, 0); 10.210 + /* Compute real buffer location on disk */ 10.211 + sector_number = block_number; 10.212 + if ( (gd = (struct gendisk *)xen_disk_info.disks[0].gendisk) != NULL ) 10.213 + sector_number += gd->part[MINOR(device)&IDE_PARTN_MASK].start_sect; 10.214 + break; 10.215 + 10.216 + default: 10.217 + panic("unknown op %d\n", operation); 10.218 + } 10.219 + 10.220 + /* Fill out a communications ring structure & trap to the hypervisor */ 10.221 + position = blk_ring->req_prod; 10.222 + blk_ring->ring[position].req.id = id; 10.223 + blk_ring->ring[position].req.operation = operation; 10.224 + blk_ring->ring[position].req.buffer = buffer_ma; 10.225 + blk_ring->ring[position].req.block_number = block_number; 10.226 + blk_ring->ring[position].req.block_size = block_size; 10.227 + blk_ring->ring[position].req.device = phys_device; 10.228 + blk_ring->ring[position].req.sector_number = sector_number; 10.229 + 10.230 + blk_ring->req_prod = BLK_RING_INC(position); 10.231 + 10.232 + return 0; 10.233 +} 10.234 + 10.235 + 10.236 +/* 10.237 + * do_xlblk_request 10.238 + * read a block; request is in a request queue 10.239 + */ 10.240 +static void do_xlblk_request (request_queue_t *rq) 10.241 +{ 10.242 + struct request *req; 10.243 + struct buffer_head *bh; 10.244 + int rw, nsect, full, queued = 0; 10.245 + 10.246 + DPRINTK("xlblk.c::do_xlblk_request for '%s'\n", DEVICE_NAME); 10.247 + 10.248 + while ( !rq->plugged && !QUEUE_EMPTY ) 10.249 + { 10.250 + if ( (req = CURRENT) == NULL ) goto out; 10.251 + 10.252 + DPRINTK("do_xlblk_request %p: cmd %i, sec %lx, (%li/%li) bh:%p\n", 10.253 + req, req->cmd, req->sector, 10.254 + req->current_nr_sectors, req->nr_sectors, req->bh); 10.255 + 10.256 + rw = req->cmd; 10.257 + if ( rw == READA ) rw = READ; 10.258 + if ((rw != READ) && (rw != WRITE)) 10.259 + panic("XenoLinux Virtual Block Device: bad cmd: %d\n", rw); 10.260 + 10.261 + req->errors = 0; 10.262 + 10.263 + bh = req->bh; 10.264 + while ( bh != NULL ) 10.265 + { 10.266 + full = hypervisor_request( 10.267 + bh, (rw == READ) ? XEN_BLOCK_READ : XEN_BLOCK_WRITE, 10.268 + bh->b_data, bh->b_rsector, bh->b_size, bh->b_dev); 10.269 + 10.270 + if ( full ) goto out; 10.271 + 10.272 + queued++; 10.273 + 10.274 + /* Dequeue the buffer head from the request. */ 10.275 + nsect = bh->b_size >> 9; 10.276 + req->bh = bh->b_reqnext; 10.277 + bh->b_reqnext = NULL; 10.278 + bh = req->bh; 10.279 + 10.280 + if ( bh != NULL ) 10.281 + { 10.282 + /* There's another buffer head to do. Update the request. */ 10.283 + req->hard_sector += nsect; 10.284 + req->hard_nr_sectors -= nsect; 10.285 + req->sector = req->hard_sector; 10.286 + req->nr_sectors = req->hard_nr_sectors; 10.287 + req->current_nr_sectors = bh->b_size >> 9; 10.288 + req->buffer = bh->b_data; 10.289 + } 10.290 + else 10.291 + { 10.292 + /* That was the last buffer head. Finalise the request. */ 10.293 + if ( end_that_request_first(req, 1, "XenBlk") ) BUG(); 10.294 + blkdev_dequeue_request(req); 10.295 + end_that_request_last(req); 10.296 + } 10.297 + } 10.298 + } 10.299 + 10.300 + out: 10.301 + if ( queued != 0 ) HYPERVISOR_block_io_op(); 10.302 +} 10.303 + 10.304 + 10.305 +static struct block_device_operations xenolinux_block_fops = 10.306 +{ 10.307 + open: xenolinux_block_open, 10.308 + release: xenolinux_block_release, 10.309 + ioctl: xenolinux_block_ioctl, 10.310 + check_media_change: xenolinux_block_check, 10.311 + revalidate: xenolinux_block_revalidate, 10.312 +}; 10.313 + 10.314 +static void xlblk_response_int(int irq, void *dev_id, struct pt_regs *ptregs) 10.315 +{ 10.316 + int i; 10.317 + unsigned long flags; 10.318 + struct buffer_head *bh; 10.319 + 10.320 + spin_lock_irqsave(&io_request_lock, flags); 10.321 + 10.322 + for ( i = resp_cons; 10.323 + i != blk_ring->resp_prod; 10.324 + i = BLK_RING_INC(i) ) 10.325 + { 10.326 + blk_ring_resp_entry_t *bret = &blk_ring->ring[i].resp; 10.327 + if ( (bh = bret->id) != NULL ) bh->b_end_io(bh, 1); 10.328 + } 10.329 + 10.330 + resp_cons = i; 10.331 + 10.332 + /* KAF: We can push work down at this point. We have the lock. */ 10.333 + do_xlblk_request(BLK_DEFAULT_QUEUE(MAJOR_NR)); 10.334 + 10.335 + spin_unlock_irqrestore(&io_request_lock, flags); 10.336 +} 10.337 + 10.338 + 10.339 +int __init xlblk_init(void) 10.340 +{ 10.341 + int i, error, result; 10.342 + 10.343 + /* This mapping was created early at boot time. */ 10.344 + blk_ring = (blk_ring_t *)fix_to_virt(FIX_BLKRING_BASE); 10.345 + blk_ring->req_prod = blk_ring->resp_prod = resp_cons = 0; 10.346 + 10.347 + error = request_irq(XLBLK_RESPONSE_IRQ, xlblk_response_int, 0, 10.348 + "xlblk-response", NULL); 10.349 + if (error) { 10.350 + printk(KERN_ALERT "Could not allocate receive interrupt\n"); 10.351 + goto fail; 10.352 + } 10.353 + 10.354 + memset (&xen_disk_info, 0, sizeof(xen_disk_info)); 10.355 + xen_disk_info.count = 0; 10.356 + 10.357 + if ( hypervisor_request(NULL, XEN_BLOCK_PROBE, (char *) &xen_disk_info, 10.358 + 0, 0, (kdev_t) 0) ) 10.359 + BUG(); 10.360 + HYPERVISOR_block_io_op(); 10.361 + while ( blk_ring->resp_prod != 1 ) barrier(); 10.362 + for ( i = 0; i < xen_disk_info.count; i++ ) 10.363 + { 10.364 + printk (KERN_ALERT " %2d: type: %d, capacity: %ld\n", 10.365 + i, xen_disk_info.disks[i].type, 10.366 + xen_disk_info.disks[i].capacity); 10.367 + } 10.368 + 10.369 + SET_MODULE_OWNER(&xenolinux_block_fops); 10.370 + result = register_blkdev(xlblk_major, "block", &xenolinux_block_fops); 10.371 + if (result < 0) { 10.372 + printk (KERN_ALERT "xenolinux block: can't get major %d\n", 10.373 + xlblk_major); 10.374 + return result; 10.375 + } 10.376 + 10.377 + /* initialize global arrays in drivers/block/ll_rw_block.c */ 10.378 + for (i = 0; i < XLBLK_MAX; i++) { 10.379 + xlblk_blk_size[i] = xen_disk_info.disks[0].capacity; 10.380 + xlblk_blksize_size[i] = 512; 10.381 + xlblk_hardsect_size[i] = 512; 10.382 + xlblk_max_sectors[i] = 128; 10.383 + } 10.384 + xlblk_read_ahead = 8; 10.385 + 10.386 + blk_size[xlblk_major] = xlblk_blk_size; 10.387 + blksize_size[xlblk_major] = xlblk_blksize_size; 10.388 + hardsect_size[xlblk_major] = xlblk_hardsect_size; 10.389 + read_ahead[xlblk_major] = xlblk_read_ahead; 10.390 + max_sectors[xlblk_major] = xlblk_max_sectors; 10.391 + 10.392 + blk_init_queue(BLK_DEFAULT_QUEUE(xlblk_major), do_xlblk_request); 10.393 + 10.394 + /* 10.395 + * Turn off barking 'headactive' mode. We dequeue buffer heads as 10.396 + * soon as we pass them down to Xen. 10.397 + */ 10.398 + blk_queue_headactive(BLK_DEFAULT_QUEUE(xlblk_major), 0); 10.399 + 10.400 + xlblk_ide_register_disk(0, xen_disk_info.disks[0].capacity); 10.401 + 10.402 + printk(KERN_ALERT 10.403 + "XenoLinux Virtual Block Device Driver installed [device: %d]\n", 10.404 + xlblk_major); 10.405 + return 0; 10.406 + 10.407 + fail: 10.408 + return error; 10.409 +} 10.410 + 10.411 +void xlblk_ide_register_disk(int idx, unsigned long capacity) 10.412 +{ 10.413 + int units; 10.414 + int minors; 10.415 + struct gendisk *gd; 10.416 + 10.417 + /* plagarized from ide-probe.c::init_gendisk */ 10.418 + 10.419 + units = 2; /* from ide.h::MAX_DRIVES */ 10.420 + 10.421 + minors = units * (1<<IDE_PARTN_BITS); 10.422 + gd = kmalloc (sizeof(struct gendisk), GFP_KERNEL); 10.423 + gd->sizes = kmalloc (minors * sizeof(int), GFP_KERNEL); 10.424 + gd->part = kmalloc (minors * sizeof(struct hd_struct), GFP_KERNEL); 10.425 + memset(gd->part, 0, minors * sizeof(struct hd_struct)); 10.426 + 10.427 + gd->major = xlblk_major; 10.428 + gd->major_name = XLBLK_MAJOR_NAME; 10.429 + gd->minor_shift = IDE_PARTN_BITS; 10.430 + gd->max_p = 1<<IDE_PARTN_BITS; 10.431 + gd->nr_real = units; 10.432 + gd->real_devices = NULL; 10.433 + gd->next = NULL; 10.434 + gd->fops = &xenolinux_block_fops; 10.435 + gd->de_arr = kmalloc (sizeof *gd->de_arr * units, GFP_KERNEL); 10.436 + gd->flags = kmalloc (sizeof *gd->flags * units, GFP_KERNEL); 10.437 + 10.438 + if (gd->de_arr) 10.439 + memset (gd->de_arr, 0, sizeof *gd->de_arr * units); 10.440 + 10.441 + if (gd->flags) 10.442 + memset (gd->flags, 0, sizeof *gd->flags * units); 10.443 + 10.444 + add_gendisk(gd); 10.445 + 10.446 + xen_disk_info.disks[idx].gendisk = gd; 10.447 + 10.448 + /* default disk size is just a big number. in the future, we 10.449 + need a message to probe the devices to determine the actual size */ 10.450 + register_disk(gd, MKDEV(xlblk_major, 0), 1<<IDE_PARTN_BITS, 10.451 + &xenolinux_block_fops, capacity); 10.452 + 10.453 + return; 10.454 +} 10.455 + 10.456 + 10.457 + 10.458 +static void __exit xlblk_cleanup(void) 10.459 +{ 10.460 + /* CHANGE FOR MULTIQUEUE */ 10.461 + blk_cleanup_queue(BLK_DEFAULT_QUEUE(xlblk_major)); 10.462 + 10.463 + /* clean up global arrays */ 10.464 + read_ahead[xlblk_major] = 0; 10.465 + 10.466 + if (blk_size[xlblk_major]) 10.467 + kfree(blk_size[xlblk_major]); 10.468 + blk_size[xlblk_major] = NULL; 10.469 + 10.470 + if (blksize_size[xlblk_major]) 10.471 + kfree(blksize_size[xlblk_major]); 10.472 + blksize_size[xlblk_major] = NULL; 10.473 + 10.474 + if (hardsect_size[xlblk_major]) 10.475 + kfree(hardsect_size[xlblk_major]); 10.476 + hardsect_size[xlblk_major] = NULL; 10.477 + 10.478 + /* XXX: free each gendisk */ 10.479 + if (unregister_blkdev(xlblk_major, "block")) 10.480 + printk(KERN_ALERT 10.481 + "XenoLinux Virtual Block Device Driver uninstalled w/ errs\n"); 10.482 + else 10.483 + printk(KERN_ALERT 10.484 + "XenoLinux Virtual Block Device Driver uninstalled\n"); 10.485 + 10.486 + return; 10.487 +} 10.488 + 10.489 + 10.490 +#ifdef MODULE 10.491 +module_init(xlblk_init); 10.492 +module_exit(xlblk_cleanup); 10.493 +#endif
11.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 11.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/drivers/block/xl_block_test.c Mon Feb 24 16:55:07 2003 +0000 11.3 @@ -0,0 +1,225 @@ 11.4 +/****************************************************************************** 11.5 + * xenolinux_block_test.c 11.6 + * 11.7 + */ 11.8 +#define EXPORT_SYMTAB 11.9 + 11.10 +#include <linux/config.h> 11.11 +#include <linux/module.h> 11.12 + 11.13 +#include <linux/kernel.h> 11.14 +#include <linux/init.h> 11.15 +#include <linux/proc_fs.h> 11.16 +#include <linux/sched.h> 11.17 +#include <asm/uaccess.h> 11.18 +#include <linux/slab.h> 11.19 +#include <linux/string.h> 11.20 +#include <linux/errno.h> 11.21 +#include <linux/delay.h> 11.22 + 11.23 +#include <asm/hypervisor-ifs/block.h> 11.24 +#include <asm/hypervisor-ifs/hypervisor-if.h> 11.25 + 11.26 +/******************************************************************/ 11.27 + 11.28 +static struct proc_dir_entry *bdt; 11.29 +static blk_ring_req_entry_t meta; 11.30 +static char * data; 11.31 + 11.32 +static int proc_read_bdt(char *page, char **start, off_t off, 11.33 + int count, int *eof, void *data) 11.34 +{ 11.35 + switch (meta.operation) 11.36 + { 11.37 + case XEN_BLOCK_READ : 11.38 + case XEN_BLOCK_WRITE : 11.39 + { 11.40 + return proc_dump_block(page, start, off, count, eof, data); 11.41 + } 11.42 + case XEN_BLOCK_DEBUG : 11.43 + { 11.44 + return proc_dump_debug(page, start, off, count, eof, data); 11.45 + } 11.46 + default : 11.47 + { 11.48 + printk(KERN_ALERT 11.49 + "block device test error: unknown operation [%c]\n", 11.50 + meta.operation); 11.51 + return -EINVAL; 11.52 + } 11.53 + } 11.54 +} 11.55 + 11.56 +int proc_dump_debug(char *page, char **start, off_t off, 11.57 + int count, int *eof, void *data) 11.58 +{ 11.59 + char header[100]; 11.60 + char dump[1024]; 11.61 + 11.62 + sprintf (header, "Block Device Test: Debug Dump\n\n"); 11.63 + 11.64 + sprintf (dump, "%s\n", meta.buffer); 11.65 + 11.66 + if (data) 11.67 + { 11.68 + kfree(data); 11.69 + } 11.70 + 11.71 + strncpy (page, dump, count); 11.72 + return strlen(page); 11.73 +} 11.74 + 11.75 +int proc_dump_block(char *page, char **start, off_t off, 11.76 + int count, int *eof, void *data) 11.77 +{ 11.78 + char header[100]; 11.79 + char dump[1024]; 11.80 + char temp[100]; 11.81 + int loop; 11.82 + 11.83 + sprintf (header, "Block Device Test\n\n%s blk num: %ld 0x%lx; size: %d 0x%x; device: 0x%x\n", 11.84 + meta.operation == XEN_BLOCK_WRITE ? "write" : "read", 11.85 + meta.block_number, meta.block_number, 11.86 + meta.block_size, meta.block_size, 11.87 + meta.device); 11.88 + 11.89 + sprintf (dump, "%s", header); 11.90 + 11.91 + if (meta.buffer) 11.92 + { 11.93 + for (loop = 0; loop < 100; loop++) 11.94 + { 11.95 + int i = meta.buffer[loop]; 11.96 + 11.97 + if (loop % 8 == 0) 11.98 + { 11.99 + sprintf (temp, "[%2d] ", loop); 11.100 + strcat(dump, temp); 11.101 + } 11.102 + else if (loop % 2 == 0) 11.103 + { 11.104 + strcat(dump, " "); 11.105 + } 11.106 + 11.107 + sprintf (temp, " 0x%02x", i & 255); 11.108 + strcat(dump, temp); 11.109 + if ((loop + 1) % 8 == 0) 11.110 + { 11.111 + strcat(dump, "\n"); 11.112 + } 11.113 + } 11.114 + strcat(dump, "\n\n"); 11.115 + } 11.116 + 11.117 + if (data) 11.118 + { 11.119 + kfree(data); 11.120 + } 11.121 + 11.122 + strncpy (page, dump, count); 11.123 + return strlen(page); 11.124 +} 11.125 + 11.126 +int proc_write_bdt(struct file *file, const char *buffer, 11.127 + unsigned long count, void *data) 11.128 +{ 11.129 + char *local = kmalloc((count + 1) * sizeof(char), GFP_KERNEL); 11.130 + char opcode; 11.131 + int block_number = 0; 11.132 + int block_size = 0; 11.133 + int device = 0; 11.134 + 11.135 + if (copy_from_user(local, buffer, count)) 11.136 + { 11.137 + return -EFAULT; 11.138 + } 11.139 + local[count] = '\0'; 11.140 + 11.141 + sscanf(local, "%c %i %i %i", 11.142 + &opcode, &block_number, &block_size, &device); 11.143 + 11.144 + if (opcode == 'r' || opcode == 'R') 11.145 + { 11.146 + meta.operation = XEN_BLOCK_READ; 11.147 + } 11.148 + else if (opcode == 'w' || opcode == 'W') 11.149 + { 11.150 + meta.operation = XEN_BLOCK_WRITE; 11.151 + } 11.152 + else if (opcode == 'd' || opcode == 'D') 11.153 + { 11.154 + meta.operation = XEN_BLOCK_DEBUG; 11.155 + block_size = 10000; 11.156 + } 11.157 + else 11.158 + { 11.159 + printk(KERN_ALERT 11.160 + "block device test error: unknown opcode [%c]\n", opcode); 11.161 + return -EINVAL; 11.162 + } 11.163 + 11.164 + if (data) 11.165 + { 11.166 + kfree(data); 11.167 + } 11.168 + data = kmalloc(block_size * sizeof(char), GFP_KERNEL); 11.169 + if (data == NULL) 11.170 + { 11.171 + kfree(local); 11.172 + return -ENOMEM; 11.173 + } 11.174 + 11.175 + meta.block_number = block_number; 11.176 + meta.block_size = block_size; 11.177 + meta.device = device; 11.178 + meta.buffer = data; 11.179 + 11.180 + /* submit request */ 11.181 + hypervisor_request(0, meta.operation, meta.buffer, 11.182 + meta.block_number, meta.block_size, 11.183 + meta.device); 11.184 + HYPERVISOR_block_io_op(); 11.185 + mdelay(1000); /* should wait for a proper acknowledgement/response. */ 11.186 + 11.187 + kfree(local); 11.188 + return count; 11.189 +} 11.190 + 11.191 + 11.192 +static int __init init_module(void) 11.193 +{ 11.194 + int return_value = 0; 11.195 + 11.196 + /* create proc entry */ 11.197 + bdt = create_proc_entry("bdt", 0644, NULL); 11.198 + if (bdt == NULL) 11.199 + { 11.200 + return_value = -ENOMEM; 11.201 + goto error; 11.202 + } 11.203 + bdt->data = NULL; 11.204 + bdt->read_proc = proc_read_bdt; 11.205 + bdt->write_proc = proc_write_bdt; 11.206 + bdt->owner = THIS_MODULE; 11.207 + 11.208 + memset(&meta, 0, sizeof(meta)); 11.209 + 11.210 + /* success */ 11.211 + printk(KERN_ALERT "XenoLinux Block Device Test installed\n"); 11.212 + return 0; 11.213 + 11.214 + error: 11.215 + return return_value; 11.216 +} 11.217 + 11.218 +static void __exit cleanup_module(void) 11.219 +{ 11.220 + if (data) 11.221 + { 11.222 + kfree(data); 11.223 + } 11.224 + printk(KERN_ALERT "XenoLinux Block Device Test uninstalled\n"); 11.225 +} 11.226 + 11.227 +module_init(init_module); 11.228 +module_exit(cleanup_module);
12.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 12.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/drivers/console/Makefile Mon Feb 24 16:55:07 2003 +0000 12.3 @@ -0,0 +1,3 @@ 12.4 +O_TARGET := con.o 12.5 +obj-y := console.o 12.6 +include $(TOPDIR)/Rules.make
13.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 13.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/drivers/console/console.c Mon Feb 24 16:55:07 2003 +0000 13.3 @@ -0,0 +1,204 @@ 13.4 +/****************************************************************************** 13.5 + * console.c 13.6 + */ 13.7 + 13.8 +#include <linux/config.h> 13.9 +#include <linux/module.h> 13.10 +#include <linux/errno.h> 13.11 +#include <linux/signal.h> 13.12 +#include <linux/sched.h> 13.13 +#include <linux/interrupt.h> 13.14 +#include <linux/tty.h> 13.15 +#include <linux/tty_flip.h> 13.16 +#include <linux/serial.h> 13.17 +#include <linux/major.h> 13.18 +#include <linux/ptrace.h> 13.19 +#include <linux/ioport.h> 13.20 +#include <linux/mm.h> 13.21 +#include <linux/slab.h> 13.22 +#include <linux/init.h> 13.23 +#include <linux/console.h> 13.24 + 13.25 +#include <asm/io.h> 13.26 +#include <asm/irq.h> 13.27 +#include <asm/uaccess.h> 13.28 +#include <asm/hypervisor.h> 13.29 + 13.30 +/******************** Kernel console driver ********************************/ 13.31 + 13.32 +static void kconsole_write(struct console *co, const char *s, unsigned count) 13.33 +{ 13.34 +#define STRLEN 256 13.35 + static char str[STRLEN]; 13.36 + static int pos = 0; 13.37 + int len; 13.38 + 13.39 + /* We buffer output until we see a newline, or until the buffer is full. */ 13.40 + while ( count != 0 ) 13.41 + { 13.42 + len = ((STRLEN - pos) > count) ? count : STRLEN - pos; 13.43 + memcpy(str + pos, s, len); 13.44 + pos += len; 13.45 + s += len; 13.46 + count -= len; 13.47 + if ( (pos == STRLEN) || (str[pos-1] == '\n') ) 13.48 + { 13.49 + (void)HYPERVISOR_console_write(str, pos); 13.50 + pos = 0; 13.51 + } 13.52 + } 13.53 +} 13.54 + 13.55 +static kdev_t kconsole_device(struct console *c) 13.56 +{ 13.57 + /* 13.58 + * This is the magic that binds our "struct console" to our 13.59 + * "tty_struct", defined below. 13.60 + */ 13.61 + return MKDEV(TTY_MAJOR, 0); 13.62 +} 13.63 + 13.64 +static struct console kconsole_info = { 13.65 + name: "xenocon", 13.66 + write: kconsole_write, 13.67 + device: kconsole_device, 13.68 + flags: CON_PRINTBUFFER, 13.69 + index: -1, 13.70 +}; 13.71 + 13.72 +void xeno_console_init(void) 13.73 +{ 13.74 + register_console(&kconsole_info); 13.75 +} 13.76 + 13.77 + 13.78 +/******************** Initial /dev/console *********************************/ 13.79 + 13.80 + 13.81 +static struct tty_driver console_driver; 13.82 +static int console_refcount; 13.83 +static struct tty_struct *console_table[1]; 13.84 +static struct termios *console_termios[1]; 13.85 +static struct termios *console_termios_locked[1]; 13.86 + 13.87 +static int console_write_room(struct tty_struct *tty) 13.88 +{ 13.89 + return INT_MAX; 13.90 +} 13.91 + 13.92 +static int console_chars_in_buffer(struct tty_struct *tty) 13.93 +{ 13.94 + return 0; 13.95 +} 13.96 + 13.97 +static inline int console_xmit(int ch) 13.98 +{ 13.99 + char _ch = ch; 13.100 + kconsole_write(NULL, &_ch, 1); 13.101 + return 1; 13.102 +} 13.103 + 13.104 +static int console_write(struct tty_struct *tty, int from_user, 13.105 + const u_char * buf, int count) 13.106 +{ 13.107 + int i; 13.108 + 13.109 + if ( from_user && verify_area(VERIFY_READ, buf, count) ) 13.110 + { 13.111 + return -EINVAL; 13.112 + } 13.113 + 13.114 + for ( i = 0; i < count; i++ ) 13.115 + { 13.116 + char ch; 13.117 + if ( from_user ) 13.118 + { 13.119 + __get_user(ch, buf + i); 13.120 + } 13.121 + else 13.122 + { 13.123 + ch = buf[i]; 13.124 + } 13.125 + console_xmit(ch); 13.126 + } 13.127 + return i; 13.128 +} 13.129 + 13.130 +static void console_put_char(struct tty_struct *tty, u_char ch) 13.131 +{ 13.132 + console_xmit(ch); 13.133 +} 13.134 + 13.135 +static int console_open(struct tty_struct *tty, struct file *filp) 13.136 +{ 13.137 + int line; 13.138 + 13.139 + MOD_INC_USE_COUNT; 13.140 + line = MINOR(tty->device) - tty->driver.minor_start; 13.141 + if ( line ) 13.142 + { 13.143 + MOD_DEC_USE_COUNT; 13.144 + return -ENODEV; 13.145 + } 13.146 + 13.147 + tty->driver_data = NULL; 13.148 + 13.149 + return 0; 13.150 +} 13.151 + 13.152 +static void console_close(struct tty_struct *tty, struct file *filp) 13.153 +{ 13.154 + MOD_DEC_USE_COUNT; 13.155 +} 13.156 + 13.157 +static int __init console_ini(void) 13.158 +{ 13.159 + memset(&console_driver, 0, sizeof(struct tty_driver)); 13.160 + console_driver.magic = TTY_DRIVER_MAGIC; 13.161 + console_driver.driver_name = "xeno_console"; 13.162 + console_driver.name = "console"; 13.163 + console_driver.major = TTY_MAJOR; 13.164 + console_driver.minor_start = 0; 13.165 + console_driver.num = 1; 13.166 + console_driver.type = TTY_DRIVER_TYPE_SERIAL; 13.167 + console_driver.subtype = SERIAL_TYPE_NORMAL; 13.168 + console_driver.init_termios = tty_std_termios; 13.169 + console_driver.flags = TTY_DRIVER_REAL_RAW; 13.170 + console_driver.refcount = &console_refcount; 13.171 + console_driver.table = console_table; 13.172 + console_driver.termios = console_termios; 13.173 + console_driver.termios_locked = console_termios_locked; 13.174 + /* Functions */ 13.175 + console_driver.open = console_open; 13.176 + console_driver.close = console_close; 13.177 + console_driver.write = console_write; 13.178 + console_driver.write_room = console_write_room; 13.179 + console_driver.put_char = console_put_char; 13.180 + console_driver.chars_in_buffer = console_chars_in_buffer; 13.181 + 13.182 + if ( tty_register_driver(&console_driver) ) 13.183 + { 13.184 + printk(KERN_ERR "Couldn't register Xeno console driver\n"); 13.185 + } 13.186 + else 13.187 + { 13.188 + printk("Xeno console successfully installed\n"); 13.189 + } 13.190 + 13.191 + return 0; 13.192 +} 13.193 + 13.194 +static void __exit console_fin(void) 13.195 +{ 13.196 + int ret; 13.197 + 13.198 + ret = tty_unregister_driver(&console_driver); 13.199 + if ( ret != 0 ) 13.200 + { 13.201 + printk(KERN_ERR "Unable to unregister Xeno console driver: %d\n", ret); 13.202 + } 13.203 +} 13.204 + 13.205 +module_init(console_ini); 13.206 +module_exit(console_fin); 13.207 +
14.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 14.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/Makefile Mon Feb 24 16:55:07 2003 +0000 14.3 @@ -0,0 +1,3 @@ 14.4 +O_TARGET := dom0.o 14.5 +obj-y := dom0_memory.o dom0_core.o vfr.o 14.6 +include $(TOPDIR)/Rules.make
15.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 15.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_block.c Mon Feb 24 16:55:07 2003 +0000 15.3 @@ -0,0 +1,27 @@ 15.4 +/* 15.5 + * domain 0 block driver interface 15.6 + * 15.7 + */ 15.8 + 15.9 +#include <linux/config.h> 15.10 +#include <linux/module.h> 15.11 +#include <linux/kernel.h> 15.12 +#include <linux/sched.h> 15.13 + 15.14 +static int __init init_module(void) 15.15 +{ 15.16 + request_module("xl_block"); 15.17 + printk("Successfully installed domain 0 block interface\n"); 15.18 + 15.19 + 15.20 + return 0; 15.21 +} 15.22 + 15.23 +static void __exit cleanup_module(void) 15.24 +{ 15.25 + printk("Successfully de-installed domain-0 block interface\n"); 15.26 + return 0; 15.27 +} 15.28 + 15.29 +module_init(init_module); 15.30 +module_exit(cleanup_module);
16.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 16.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_core.c Mon Feb 24 16:55:07 2003 +0000 16.3 @@ -0,0 +1,334 @@ 16.4 +/****************************************************************************** 16.5 + * dom0_core.c 16.6 + * 16.7 + * Interface to privileged domain-0 commands. 16.8 + * 16.9 + * Copyright (c) 2002, K A Fraser, B Dragovic 16.10 + */ 16.11 + 16.12 +#include <linux/config.h> 16.13 +#include <linux/module.h> 16.14 +#include <linux/kernel.h> 16.15 +#include <linux/sched.h> 16.16 +#include <linux/slab.h> 16.17 +#include <linux/string.h> 16.18 +#include <linux/errno.h> 16.19 +#include <linux/proc_fs.h> 16.20 + 16.21 +#include <linux/mm.h> 16.22 +#include <linux/mman.h> 16.23 +#include <linux/swap.h> 16.24 +#include <linux/smp_lock.h> 16.25 +#include <linux/swapctl.h> 16.26 +#include <linux/iobuf.h> 16.27 +#include <linux/highmem.h> 16.28 +#include <linux/pagemap.h> 16.29 + 16.30 +#include <asm/pgalloc.h> 16.31 +#include <asm/pgtable.h> 16.32 +#include <asm/uaccess.h> 16.33 +#include <asm/tlb.h> 16.34 + 16.35 +#include "dom0_ops.h" 16.36 + 16.37 +/* Private proc-file data structures. */ 16.38 +typedef struct proc_data { 16.39 + unsigned int domain; 16.40 + unsigned long map_size; 16.41 +} dom_procdata_t; 16.42 + 16.43 +typedef struct proc_mem_data { 16.44 + unsigned long pfn; 16.45 + int tot_pages; 16.46 +} proc_memdata_t; 16.47 + 16.48 +#define XENO_BASE "xeno" 16.49 +#define DOM0_CMD_INTF "dom0_cmd" 16.50 +#define DOM0_NEWDOM "new_dom_data" 16.51 + 16.52 +#define MAX_LEN 16 16.53 +#define DOM_DIR "dom" 16.54 +#define DOM_MEM "mem" 16.55 +#define DOM_VIF "vif" 16.56 + 16.57 +#define MAP_DISCONT 1 16.58 + 16.59 +static struct proc_dir_entry *xeno_base; 16.60 +static struct proc_dir_entry *dom0_cmd_intf; 16.61 +static struct proc_dir_entry *proc_ft; 16.62 + 16.63 +unsigned long direct_mmap(unsigned long, unsigned long, pgprot_t, int, int); 16.64 +int direct_unmap(unsigned long, unsigned long); 16.65 +int direct_disc_unmap(unsigned long, unsigned long, int); 16.66 + 16.67 +static unsigned char readbuf[1204]; 16.68 + 16.69 +static int cmd_read_proc(char *page, char **start, off_t off, 16.70 + int count, int *eof, void *data) 16.71 +{ 16.72 + strcpy(page, readbuf); 16.73 + *readbuf = '\0'; 16.74 + *eof = 1; 16.75 + *start = page; 16.76 + return strlen(page); 16.77 +} 16.78 + 16.79 +static ssize_t dom_vif_read(struct file * file, char * buff, size_t size, loff_t * off) 16.80 +{ 16.81 + char hyp_buf[128]; // Hypervisor is going to write its reply here. 16.82 + network_op_t op; 16.83 + static int finished = 0; 16.84 + 16.85 + // This seems to be the only way to make the OS stop making read requests 16.86 + // to the file. When we use the fileoperations version of read, offset 16.87 + // seems to be ignored altogether. 16.88 + 16.89 + if (finished) 16.90 + { 16.91 + finished = 0; 16.92 + return 0; 16.93 + } 16.94 + 16.95 + op.cmd = NETWORK_OP_VIFQUERY; 16.96 + op.u.vif_query.domain = (unsigned int) ((struct proc_dir_entry *)file->f_dentry->d_inode->u.generic_ip)->data; 16.97 + op.u.vif_query.buf = hyp_buf; 16.98 + 16.99 + strcpy(hyp_buf, "Error getting domain's vif list from hypervisor.\n"); // This will be replaced if everything works. 16.100 + 16.101 + (void)HYPERVISOR_network_op(&op); 16.102 + 16.103 + if (*off >= (strlen(hyp_buf)+1)) return 0; 16.104 + 16.105 + copy_to_user(buff, hyp_buf, strlen(hyp_buf)); 16.106 + 16.107 + finished = 1; 16.108 + 16.109 + return strlen(hyp_buf)+1; 16.110 +} 16.111 + 16.112 +struct file_operations dom_vif_ops = { 16.113 + read: dom_vif_read 16.114 +}; 16.115 + 16.116 + 16.117 +static void create_proc_dom_entries(int dom) 16.118 +{ 16.119 + struct proc_dir_entry * dir; 16.120 + dom_procdata_t * dom_data; 16.121 + char dir_name[MAX_LEN]; 16.122 + struct proc_dir_entry * file; 16.123 + 16.124 + snprintf(dir_name, MAX_LEN, "%s%d", DOM_DIR, dom); 16.125 + 16.126 + dom_data = (dom_procdata_t *)kmalloc(sizeof(dom_procdata_t), GFP_KERNEL); 16.127 + dom_data->domain = dom; 16.128 + 16.129 + dir = proc_mkdir(dir_name, xeno_base); 16.130 + dir->data = dom_data; 16.131 + 16.132 + file = create_proc_entry(DOM_VIF, 0600, dir); 16.133 + if (file != NULL) 16.134 + { 16.135 + file->owner = THIS_MODULE; 16.136 + file->nlink = 1; 16.137 + file->proc_fops = &dom_vif_ops; 16.138 + file->data = (void *) dom; 16.139 + } 16.140 +} 16.141 + 16.142 +static ssize_t dom_mem_write(struct file * file, const char * buff, 16.143 + size_t size , loff_t * off) 16.144 +{ 16.145 + dom_mem_t mem_data; 16.146 + 16.147 + copy_from_user(&mem_data, (dom_mem_t *)buff, sizeof(dom_mem_t)); 16.148 + 16.149 + if(direct_disc_unmap(mem_data.vaddr, mem_data.start_pfn, 16.150 + mem_data.tot_pages) == 0){ 16.151 + return sizeof(sizeof(dom_mem_t)); 16.152 + } else { 16.153 + return -1; 16.154 + } 16.155 +} 16.156 + 16.157 +static ssize_t dom_mem_read(struct file * file, char * buff, size_t size, loff_t * off) 16.158 +{ 16.159 + unsigned long addr; 16.160 + pgprot_t prot; 16.161 + 16.162 + proc_memdata_t * mem_data = (proc_memdata_t *)((struct proc_dir_entry *)file->f_dentry->d_inode->u.generic_ip)->data; 16.163 + 16.164 + prot = PAGE_SHARED; 16.165 + 16.166 + /* remap the range using xen specific routines */ 16.167 + 16.168 + addr = direct_mmap(mem_data->pfn << PAGE_SHIFT, mem_data->tot_pages << PAGE_SHIFT, prot, MAP_DISCONT, mem_data->tot_pages); 16.169 + 16.170 + copy_to_user((unsigned long *)buff, &addr, sizeof(addr)); 16.171 + 16.172 + return sizeof(addr); 16.173 +} 16.174 + 16.175 +struct file_operations dom_mem_ops = { 16.176 + read: dom_mem_read, 16.177 + write: dom_mem_write, 16.178 +}; 16.179 + 16.180 +static int dom_map_mem(unsigned int dom, unsigned long pfn, int tot_pages) 16.181 +{ 16.182 + int ret = -ENOENT; 16.183 + struct proc_dir_entry * pd = xeno_base->subdir; 16.184 + struct proc_dir_entry * file; 16.185 + proc_memdata_t * memdata; 16.186 + 16.187 + while(pd != NULL){ 16.188 + 16.189 + if((pd->mode & S_IFDIR) && ((dom_procdata_t *)pd->data)->domain == dom){ 16.190 + 16.191 + /* check if there is already an entry for mem and if so 16.192 + * remove it. 16.193 + */ 16.194 + remove_proc_entry(DOM_MEM, pd); 16.195 + 16.196 + /* create new entry with parameters describing what to do 16.197 + * when it is mmaped. 16.198 + */ 16.199 + file = create_proc_entry(DOM_MEM, 0600, pd); 16.200 + if(file != NULL) 16.201 + { 16.202 + file->owner = THIS_MODULE; 16.203 + file->nlink = 1; 16.204 + file->proc_fops = &dom_mem_ops; 16.205 + 16.206 + memdata = (proc_memdata_t *)kmalloc(sizeof(proc_memdata_t), GFP_KERNEL); 16.207 + memdata->pfn = pfn; 16.208 + memdata->tot_pages = tot_pages; 16.209 + file->data = memdata; 16.210 + 16.211 + ret = 0; 16.212 + break; 16.213 + } 16.214 + 16.215 + ret = -EAGAIN; 16.216 + break; 16.217 + } 16.218 + pd = pd->next; 16.219 + } 16.220 + 16.221 + return ret; 16.222 +} 16.223 + 16.224 +/* function used to retrieve data associated with new domain */ 16.225 +static ssize_t dom_data_read(struct file * file, char * buff, size_t size, loff_t * off) 16.226 +{ 16.227 + dom0_newdomain_t * dom_data = (dom0_newdomain_t *) 16.228 + ((struct proc_dir_entry *)file->f_dentry->d_inode->u.generic_ip)->data; 16.229 + 16.230 + copy_to_user((dom0_newdomain_t *)buff, dom_data, sizeof(dom0_newdomain_t)); 16.231 + 16.232 + remove_proc_entry(DOM0_NEWDOM, xeno_base); 16.233 + 16.234 + kfree(dom_data); 16.235 + 16.236 + return sizeof(dom0_newdomain_t); 16.237 +} 16.238 + 16.239 +struct file_operations newdom_data_fops = { 16.240 + read: dom_data_read, 16.241 +}; 16.242 + 16.243 +static int cmd_write_proc(struct file *file, const char *buffer, 16.244 + u_long count, void *data) 16.245 +{ 16.246 + dom0_op_t op; 16.247 + int ret = 0; 16.248 + struct proc_dir_entry * new_dom_id; 16.249 + dom0_newdomain_t * params; 16.250 + int i; 16.251 + unsigned long p; 16.252 + 16.253 + copy_from_user(&op, buffer, sizeof(dom0_op_t)); 16.254 + 16.255 + /* do some sanity checks */ 16.256 + if(op.cmd > MAX_CMD){ 16.257 + ret = -ENOSYS; 16.258 + goto out; 16.259 + } 16.260 + 16.261 + if ( op.cmd == MAP_DOM_MEM ) 16.262 + { 16.263 + ret = dom_map_mem(op.u.dommem.domain, op.u.dommem.start_pfn, 16.264 + op.u.dommem.tot_pages); 16.265 + } 16.266 + else if ( op.cmd == DO_PGUPDATES ) 16.267 + { 16.268 + ret = HYPERVISOR_pt_update(op.u.pgupdate.pgt_update_arr, 16.269 + op.u.pgupdate.num_pgt_updates); 16.270 + } 16.271 + else 16.272 + { 16.273 + ret = HYPERVISOR_dom0_op(&op); 16.274 + 16.275 + /* if new domain created, create proc entries */ 16.276 + if(op.cmd == DOM0_NEWDOMAIN){ 16.277 + create_proc_dom_entries(ret); 16.278 + 16.279 + params = (dom0_newdomain_t *)kmalloc(sizeof(dom0_newdomain_t), 16.280 + GFP_KERNEL); 16.281 + params->memory_kb = op.u.newdomain.memory_kb; 16.282 + params->pg_head = op.u.newdomain.pg_head; 16.283 + params->num_vifs = op.u.newdomain.num_vifs; 16.284 + params->domain = op.u.newdomain.domain; 16.285 + 16.286 + /* now notify user space of the new domain's id */ 16.287 + new_dom_id = create_proc_entry(DOM0_NEWDOM, 0600, xeno_base); 16.288 + if ( new_dom_id != NULL ) 16.289 + { 16.290 + new_dom_id->owner = THIS_MODULE; 16.291 + new_dom_id->nlink = 1; 16.292 + new_dom_id->proc_fops = &newdom_data_fops; 16.293 + new_dom_id->data = (void *)params; 16.294 + } 16.295 + 16.296 + } 16.297 + 16.298 + } 16.299 + 16.300 +out: 16.301 + return ret; 16.302 + 16.303 +} 16.304 + 16.305 +static int __init init_module(void) 16.306 +{ 16.307 + /* xeno proc root setup */ 16.308 + xeno_base = proc_mkdir(XENO_BASE, &proc_root); 16.309 + 16.310 + /* xeno control interface */ 16.311 + *readbuf = '\0'; 16.312 + dom0_cmd_intf = create_proc_entry (DOM0_CMD_INTF, 0600, xeno_base); 16.313 + if ( dom0_cmd_intf != NULL ) 16.314 + { 16.315 + dom0_cmd_intf->owner = THIS_MODULE; 16.316 + dom0_cmd_intf->nlink = 1; 16.317 + dom0_cmd_intf->read_proc = cmd_read_proc; 16.318 + dom0_cmd_intf->write_proc = cmd_write_proc; 16.319 + } 16.320 + 16.321 + /* set up /proc entries for dom 0 */ 16.322 + create_proc_dom_entries(0); 16.323 + 16.324 + return 0; 16.325 +} 16.326 + 16.327 + 16.328 +static void __exit cleanup_module(void) 16.329 +{ 16.330 + if ( dom0_cmd_intf == NULL ) return; 16.331 + remove_proc_entry("dom0", &proc_root); 16.332 + dom0_cmd_intf = NULL; 16.333 +} 16.334 + 16.335 + 16.336 +module_init(init_module); 16.337 +module_exit(cleanup_module);
17.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 17.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_memory.c Mon Feb 24 16:55:07 2003 +0000 17.3 @@ -0,0 +1,368 @@ 17.4 +#include <linux/slab.h> 17.5 +#include <linux/mm.h> 17.6 +#include <linux/mman.h> 17.7 +#include <linux/swap.h> 17.8 +#include <linux/smp_lock.h> 17.9 +#include <linux/swapctl.h> 17.10 +#include <linux/iobuf.h> 17.11 +#include <linux/highmem.h> 17.12 +#include <linux/pagemap.h> 17.13 +#include <linux/list.h> 17.14 + 17.15 +#include <asm/pgalloc.h> 17.16 +#include <asm/uaccess.h> 17.17 +#include <asm/tlb.h> 17.18 +#include <asm/mmu.h> 17.19 + 17.20 +#include "dom0_ops.h" 17.21 + 17.22 +#define MAP_CONT 0 17.23 +#define MAP_DISCONT 1 17.24 + 17.25 +extern struct list_head * find_direct(struct list_head *, unsigned long); 17.26 + 17.27 +/* 17.28 + * bd240: functions below perform direct mapping to the real physical pages 17.29 + * needed for mapping various hypervisor specific structures needed in dom0 17.30 + * userspace by various management applications such as domain builder etc. 17.31 + */ 17.32 + 17.33 +#define direct_set_pte(pteptr, pteval) queue_l1_entry_update(__pa(pteptr)|PGREQ_UNCHECKED_UPDATE, (pteval).pte_low) 17.34 + 17.35 +#define direct_pte_clear(pteptr) queue_l1_entry_update(__pa(pteptr)|PGREQ_UNCHECKED_UPDATE, 0) 17.36 + 17.37 +#define __direct_pte(x) ((pte_t) { (x) } ) 17.38 +#define __direct_mk_pte(page_nr,pgprot) __direct_pte(((page_nr) << PAGE_SHIFT) | pgprot_val(pgprot)) 17.39 +#define direct_mk_pte_phys(physpage, pgprot) __direct_mk_pte((physpage) >> PAGE_SHIFT, pgprot) 17.40 + 17.41 +static inline void forget_pte(pte_t page) 17.42 +{ 17.43 + if (!pte_none(page)) { 17.44 + printk("forget_pte: old mapping existed!\n"); 17.45 + BUG(); 17.46 + } 17.47 +} 17.48 + 17.49 +static inline void direct_remappte_range(pte_t * pte, unsigned long address, unsigned long size, 17.50 + unsigned long phys_addr, pgprot_t prot) 17.51 +{ 17.52 + unsigned long end; 17.53 + 17.54 + address &= ~PMD_MASK; 17.55 + end = address + size; 17.56 + if (end > PMD_SIZE) 17.57 + end = PMD_SIZE; 17.58 + do { 17.59 + pte_t oldpage; 17.60 + oldpage = ptep_get_and_clear(pte); 17.61 + 17.62 + direct_set_pte(pte, direct_mk_pte_phys(phys_addr, prot)); 17.63 + 17.64 + forget_pte(oldpage); 17.65 + address += PAGE_SIZE; 17.66 + phys_addr += PAGE_SIZE; 17.67 + pte++; 17.68 + } while (address && (address < end)); 17.69 + 17.70 +} 17.71 + 17.72 +static inline int direct_remappmd_range(struct mm_struct *mm, pmd_t * pmd, unsigned long address, unsigned long size, 17.73 + unsigned long phys_addr, pgprot_t prot) 17.74 +{ 17.75 + unsigned long end; 17.76 + 17.77 + address &= ~PGDIR_MASK; 17.78 + end = address + size; 17.79 + if (end > PGDIR_SIZE) 17.80 + end = PGDIR_SIZE; 17.81 + phys_addr -= address; 17.82 + do { 17.83 + pte_t * pte = pte_alloc(mm, pmd, address); 17.84 + if (!pte) 17.85 + return -ENOMEM; 17.86 + direct_remappte_range(pte, address, end - address, address + phys_addr, prot); 17.87 + address = (address + PMD_SIZE) & PMD_MASK; 17.88 + pmd++; 17.89 + } while (address && (address < end)); 17.90 + return 0; 17.91 +} 17.92 + 17.93 +/* Note: this is only safe if the mm semaphore is held when called. */ 17.94 +int direct_remap_page_range(unsigned long from, unsigned long phys_addr, unsigned long size, pgprot_t prot) 17.95 +{ 17.96 + int error = 0; 17.97 + pgd_t * dir; 17.98 + unsigned long beg = from; 17.99 + unsigned long end = from + size; 17.100 + struct mm_struct *mm = current->mm; 17.101 + 17.102 + phys_addr -= from; 17.103 + dir = pgd_offset(mm, from); 17.104 + flush_cache_range(mm, beg, end); 17.105 + if (from >= end) 17.106 + BUG(); 17.107 + 17.108 + spin_lock(&mm->page_table_lock); 17.109 + do { 17.110 + pmd_t *pmd = pmd_alloc(mm, dir, from); 17.111 + error = -ENOMEM; 17.112 + if (!pmd) 17.113 + break; 17.114 + error = direct_remappmd_range(mm, pmd, from, end - from, phys_addr + from, prot); 17.115 + if (error) 17.116 + break; 17.117 + from = (from + PGDIR_SIZE) & PGDIR_MASK; 17.118 + dir++; 17.119 + } while (from && (from < end)); 17.120 + spin_unlock(&mm->page_table_lock); 17.121 + flush_tlb_range(mm, beg, end); 17.122 + return error; 17.123 +} 17.124 + 17.125 +/* 17.126 + * used for remapping discontiguous bits of domain's memory, pages to map are 17.127 + * found from frame table beginning at the given first_pg index 17.128 + */ 17.129 +int direct_remap_disc_page_range(unsigned long from, 17.130 + unsigned long first_pg, int tot_pages, pgprot_t prot) 17.131 +{ 17.132 + dom0_op_t dom0_op; 17.133 + unsigned long *pfns = get_free_page(GFP_KERNEL); 17.134 + unsigned long start = from; 17.135 + int pages, i; 17.136 + 17.137 + while ( tot_pages != 0 ) 17.138 + { 17.139 + dom0_op.cmd = DOM0_GETMEMLIST; 17.140 + dom0_op.u.getmemlist.start_pfn = first_pg; 17.141 + pages = 1023; 17.142 + dom0_op.u.getmemlist.num_pfns = 1024; 17.143 + if ( tot_pages < 1024 ) 17.144 + dom0_op.u.getmemlist.num_pfns = pages = tot_pages; 17.145 + dom0_op.u.getmemlist.buffer = pfns; 17.146 + (void)HYPERVISOR_dom0_op(&dom0_op); 17.147 + first_pg = pfns[1023]; 17.148 + 17.149 + for ( i = 0; i < pages; i++ ) 17.150 + { 17.151 + if(direct_remap_page_range(start, pfns[i] << PAGE_SHIFT, 17.152 + PAGE_SIZE, prot)) 17.153 + goto out; 17.154 + start += PAGE_SIZE; 17.155 + tot_pages--; 17.156 + } 17.157 + } 17.158 + 17.159 +out: 17.160 + free_page(pfns); 17.161 + return tot_pages; 17.162 +} 17.163 + 17.164 +/* below functions replace standard sys_mmap and sys_munmap which are absolutely useless 17.165 + * for direct memory mapping. direct_zap* functions are minor ammendments to the 17.166 + * original versions in mm/memory.c. the changes are to enable unmapping of real physical 17.167 + * addresses. 17.168 + */ 17.169 + 17.170 +unsigned long direct_mmap(unsigned long phys_addr, unsigned long size, 17.171 + pgprot_t prot, int flag, int tot_pages) 17.172 +{ 17.173 + direct_mmap_node_t * dmmap; 17.174 + struct list_head * entry; 17.175 + unsigned long addr; 17.176 + int ret = 0; 17.177 + 17.178 + if(!capable(CAP_SYS_ADMIN)){ 17.179 + ret = -EPERM; 17.180 + goto out; 17.181 + } 17.182 + 17.183 + /* get unmapped area invokes xen specific arch_get_unmapped_area */ 17.184 + addr = get_unmapped_area(NULL, 0, size, 0, 0); 17.185 + if(addr & ~PAGE_MASK){ 17.186 + ret = -ENOMEM; 17.187 + goto out; 17.188 + } 17.189 + 17.190 + /* add node on the list of directly mapped areas, make sure the 17.191 + * list remains sorted. 17.192 + */ 17.193 + dmmap = (direct_mmap_node_t *)kmalloc(sizeof(direct_mmap_node_t), GFP_KERNEL); 17.194 + dmmap->vm_start = addr; 17.195 + dmmap->vm_end = addr + size; 17.196 + entry = find_direct(¤t->mm->context.direct_list, addr); 17.197 + if(entry != ¤t->mm->context.direct_list){ 17.198 + list_add_tail(&dmmap->list, entry); 17.199 + } else { 17.200 + list_add_tail(&dmmap->list, ¤t->mm->context.direct_list); 17.201 + } 17.202 + 17.203 + /* and perform the mapping */ 17.204 + if(flag == MAP_DISCONT){ 17.205 + ret = direct_remap_disc_page_range(addr, phys_addr >> PAGE_SHIFT, 17.206 + tot_pages, prot); 17.207 + } else { 17.208 + ret = direct_remap_page_range(addr, phys_addr, size, prot); 17.209 + } 17.210 + 17.211 + if(ret == 0) 17.212 + ret = addr; 17.213 + 17.214 +out: 17.215 + return ret; 17.216 +} 17.217 + 17.218 +/* most of the checks, refcnt updates, cache stuff have been thrown out as they are not 17.219 + * needed 17.220 + */ 17.221 +static inline int direct_zap_pte_range(mmu_gather_t *tlb, pmd_t * pmd, unsigned long address, 17.222 + unsigned long size) 17.223 +{ 17.224 + unsigned long offset; 17.225 + pte_t * ptep; 17.226 + int freed = 0; 17.227 + 17.228 + if (pmd_none(*pmd)) 17.229 + return 0; 17.230 + if (pmd_bad(*pmd)) { 17.231 + pmd_ERROR(*pmd); 17.232 + pmd_clear(pmd); 17.233 + return 0; 17.234 + } 17.235 + ptep = pte_offset(pmd, address); 17.236 + offset = address & ~PMD_MASK; 17.237 + if (offset + size > PMD_SIZE) 17.238 + size = PMD_SIZE - offset; 17.239 + size &= PAGE_MASK; 17.240 + for (offset=0; offset < size; ptep++, offset += PAGE_SIZE) { 17.241 + pte_t pte = *ptep; 17.242 + if (pte_none(pte)) 17.243 + continue; 17.244 + freed ++; 17.245 + direct_pte_clear(ptep); 17.246 + } 17.247 + 17.248 + return freed; 17.249 +} 17.250 + 17.251 +static inline int direct_zap_pmd_range(mmu_gather_t *tlb, pgd_t * dir, 17.252 + unsigned long address, unsigned long size) 17.253 +{ 17.254 + pmd_t * pmd; 17.255 + unsigned long end; 17.256 + int freed; 17.257 + 17.258 + if (pgd_none(*dir)) 17.259 + return 0; 17.260 + if (pgd_bad(*dir)) { 17.261 + pgd_ERROR(*dir); 17.262 + pgd_clear(dir); 17.263 + return 0; 17.264 + } 17.265 + pmd = pmd_offset(dir, address); 17.266 + end = address + size; 17.267 + if (end > ((address + PGDIR_SIZE) & PGDIR_MASK)) 17.268 + end = ((address + PGDIR_SIZE) & PGDIR_MASK); 17.269 + freed = 0; 17.270 + do { 17.271 + freed += direct_zap_pte_range(tlb, pmd, address, end - address); 17.272 + address = (address + PMD_SIZE) & PMD_MASK; 17.273 + pmd++; 17.274 + } while (address < end); 17.275 + return freed; 17.276 +} 17.277 + 17.278 +/* 17.279 + * remove user pages in a given range. 17.280 + */ 17.281 +void direct_zap_page_range(struct mm_struct *mm, unsigned long address, unsigned long size) 17.282 +{ 17.283 + mmu_gather_t *tlb; 17.284 + pgd_t * dir; 17.285 + unsigned long start = address, end = address + size; 17.286 + int freed = 0; 17.287 + 17.288 + dir = pgd_offset(mm, address); 17.289 + 17.290 + /* 17.291 + * This is a long-lived spinlock. That's fine. 17.292 + * There's no contention, because the page table 17.293 + * lock only protects against kswapd anyway, and 17.294 + * even if kswapd happened to be looking at this 17.295 + * process we _want_ it to get stuck. 17.296 + */ 17.297 + if (address >= end) 17.298 + BUG(); 17.299 + spin_lock(&mm->page_table_lock); 17.300 + flush_cache_range(mm, address, end); 17.301 + tlb = tlb_gather_mmu(mm); 17.302 + 17.303 + do { 17.304 + freed += direct_zap_pmd_range(tlb, dir, address, end - address); 17.305 + address = (address + PGDIR_SIZE) & PGDIR_MASK; 17.306 + dir++; 17.307 + } while (address && (address < end)); 17.308 + 17.309 + /* this will flush any remaining tlb entries */ 17.310 + tlb_finish_mmu(tlb, start, end); 17.311 + 17.312 + /* decrementing rss removed */ 17.313 + 17.314 + spin_unlock(&mm->page_table_lock); 17.315 +} 17.316 + 17.317 +int direct_unmap(unsigned long addr, unsigned long size) 17.318 +{ 17.319 + direct_mmap_node_t * node; 17.320 + struct list_head * curr; 17.321 + struct list_head * direct_list = ¤t->mm->context.direct_list; 17.322 + 17.323 + curr = direct_list->next; 17.324 + while(curr != direct_list){ 17.325 + node = list_entry(curr, direct_mmap_node_t, list); 17.326 + if(node->vm_start == addr) 17.327 + break; 17.328 + curr = curr->next; 17.329 + } 17.330 + 17.331 + if(curr == direct_list) 17.332 + return -1; 17.333 + 17.334 + list_del(&node->list); 17.335 + kfree(node); 17.336 + 17.337 + direct_zap_page_range(current->mm, addr, size); 17.338 + 17.339 + return 0; 17.340 +} 17.341 + 17.342 +int direct_disc_unmap(unsigned long from, unsigned long first_pg, int tot_pages) 17.343 +{ 17.344 + int count = 0; 17.345 + direct_mmap_node_t * node; 17.346 + struct list_head * curr; 17.347 + struct list_head * direct_list = ¤t->mm->context.direct_list; 17.348 + 17.349 + curr = direct_list->next; 17.350 + while(curr != direct_list){ 17.351 + node = list_entry(curr, direct_mmap_node_t, list); 17.352 + 17.353 + if(node->vm_start == from) 17.354 + break; 17.355 + curr = curr->next; 17.356 + } 17.357 + 17.358 + if(curr == direct_list) 17.359 + return -1; 17.360 + 17.361 + list_del(&node->list); 17.362 + kfree(node); 17.363 + 17.364 + while(count < tot_pages){ 17.365 + direct_zap_page_range(current->mm, from, PAGE_SIZE); 17.366 + from += PAGE_SIZE; 17.367 + count++; 17.368 + } 17.369 + 17.370 + return 0; 17.371 +}
18.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 18.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_ops.h Mon Feb 24 16:55:07 2003 +0000 18.3 @@ -0,0 +1,80 @@ 18.4 +/****************************************************************************** 18.5 + * dom0_ops.h 18.6 + * 18.7 + * Process command requests from domain-0 guest OS. 18.8 + * 18.9 + * Copyright (c) 2002, K A Fraser, B Dragovic 18.10 + */ 18.11 + 18.12 +#define DOM0_NEWDOMAIN 0 18.13 +#define DOM0_KILLDOMAIN 1 18.14 +#define DOM0_GETMEMLIST 2 18.15 +#define DOM0_STARTDOM 4 18.16 +#define MAP_DOM_MEM 6 /* Not passed down to Xen */ 18.17 +#define DO_PGUPDATES 7 /* Not passed down to Xen */ 18.18 +#define MAX_CMD 8 18.19 + 18.20 +#define MAX_CMD_LEN 256 18.21 + 18.22 +typedef struct dom0_newdomain_st 18.23 +{ 18.24 + unsigned int domain; 18.25 + unsigned int memory_kb; 18.26 + unsigned int num_vifs; // temporary 18.27 + unsigned long pg_head; // return parameter 18.28 +} dom0_newdomain_t; 18.29 + 18.30 +typedef struct dom0_killdomain_st 18.31 +{ 18.32 + unsigned int domain; 18.33 +} dom0_killdomain_t; 18.34 + 18.35 +typedef struct dom0_getmemlist_st 18.36 +{ 18.37 + unsigned long start_pfn; 18.38 + unsigned long num_pfns; 18.39 + void *buffer; 18.40 +} dom0_getmemlist_t; 18.41 + 18.42 +/* This is entirely processed by XenoLinux */ 18.43 +typedef struct dom_mem 18.44 +{ 18.45 + unsigned int domain; 18.46 + unsigned long vaddr; 18.47 + unsigned long start_pfn; 18.48 + int tot_pages; 18.49 +} dom_mem_t; 18.50 + 18.51 +/* This is entirely processed by XenoLinux */ 18.52 +typedef struct dom_pgupdate 18.53 +{ 18.54 + unsigned long pgt_update_arr; 18.55 + unsigned long num_pgt_updates; 18.56 +} dom_pgupdate_t; 18.57 + 18.58 +typedef struct domain_launch 18.59 +{ 18.60 + unsigned int domain; 18.61 + unsigned long l2_pgt_addr; 18.62 + unsigned long virt_load_addr; 18.63 + unsigned long virt_shinfo_addr; 18.64 + unsigned long virt_startinfo_addr; 18.65 + unsigned int num_vifs; 18.66 + char cmd_line[MAX_CMD_LEN]; 18.67 +} dom_meminfo_t; 18.68 + 18.69 +typedef struct dom0_op_st 18.70 +{ 18.71 + unsigned long cmd; 18.72 + union 18.73 + { 18.74 + dom0_newdomain_t newdomain; 18.75 + dom0_killdomain_t killdomain; 18.76 + dom0_getmemlist_t getmemlist; 18.77 + dom_mem_t dommem; 18.78 + dom_pgupdate_t pgupdate; 18.79 + dom_meminfo_t meminfo; 18.80 + } 18.81 + u; 18.82 +} dom0_op_t; 18.83 +
19.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 19.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/vfr.c Mon Feb 24 16:55:07 2003 +0000 19.3 @@ -0,0 +1,306 @@ 19.4 +/****************************************************************************** 19.5 + * vfr.c 19.6 + * 19.7 + * Interface to the virtual firewall/router. 19.8 + * 19.9 + */ 19.10 + 19.11 +#include <linux/config.h> 19.12 +#include <linux/module.h> 19.13 +#include <linux/kernel.h> 19.14 +#include <linux/sched.h> 19.15 +#include <linux/slab.h> 19.16 +#include <linux/string.h> 19.17 +#include <linux/errno.h> 19.18 +#include <linux/proc_fs.h> 19.19 + 19.20 +#include <asm/hypervisor-ifs/network.h> 19.21 + 19.22 +static struct proc_dir_entry *proc_vfr; 19.23 + 19.24 +static unsigned char readbuf[1024]; 19.25 + 19.26 +/* Helpers, implemented at the bottom. */ 19.27 +u32 getipaddr(const char *buff, unsigned int len); 19.28 +u16 antous(const char *buff, int len); 19.29 +int anton(const char *buff, int len); 19.30 + 19.31 +static int vfr_read_proc(char *page, char **start, off_t off, 19.32 + int count, int *eof, void *data) 19.33 +{ 19.34 + strcpy(page, readbuf); 19.35 + *readbuf = '\0'; 19.36 + *eof = 1; 19.37 + *start = page; 19.38 + return strlen(page); 19.39 +} 19.40 + 19.41 +/* The format for the vfr interface is as follows: 19.42 + * 19.43 + * COMMAND <field>=<val> [<field>=<val> [...]] 19.44 + * 19.45 + * where: 19.46 + * 19.47 + * COMMAND = { ACCEPT | COUNT } 19.48 + * 19.49 + * field=val pairs are as follows: 19.50 + * 19.51 + * field = { srcaddr | dstaddr } 19.52 + * val is a dot seperated, numeric IP address. 19.53 + * 19.54 + * field = { srcport | dstport } 19.55 + * val is a (16-bit) unsigned int 19.56 + * 19.57 + * field = { proto } 19.58 + * val = { IP | TCP | UDP | ARP } 19.59 + * 19.60 + */ 19.61 + 19.62 +#define isspace(_x) ( ((_x)==' ') || ((_x)=='\t') || ((_x)=='\v') || \ 19.63 + ((_x)=='\f') || ((_x)=='\r') || ((_x)=='\n') ) 19.64 + 19.65 +static int vfr_write_proc(struct file *file, const char *buffer, 19.66 + u_long count, void *data) 19.67 +{ 19.68 + network_op_t op; 19.69 + int ret, len; 19.70 + int ts, te, tl; // token start, end, and length 19.71 + int fs, fe, fl; // field. 19.72 + 19.73 + len = count; 19.74 + ts = te = 0; 19.75 + 19.76 + memset(&op, 0, sizeof(network_op_t)); 19.77 + 19.78 + // get the command: 19.79 + while ( count && isspace(buffer[ts]) ) { ts++; count--; } // skip spaces. 19.80 + te = ts; 19.81 + while ( count && !isspace(buffer[te]) ) { te++; count--; } // command end 19.82 + if ( te <= ts ) goto bad; 19.83 + tl = te - ts; 19.84 + 19.85 + if ( strncmp(&buffer[ts], "ADD", tl) == 0 ) 19.86 + { 19.87 + op.cmd = NETWORK_OP_ADDRULE; 19.88 + } 19.89 + else if ( strncmp(&buffer[ts], "DELETE", tl) == 0 ) 19.90 + { 19.91 + op.cmd = NETWORK_OP_DELETERULE; 19.92 + } 19.93 + else if ( strncmp(&buffer[ts], "PRINT", tl) == 0 ) 19.94 + { 19.95 + op.cmd = NETWORK_OP_GETRULELIST; 19.96 + goto doneparsing; 19.97 + } 19.98 + 19.99 + ts = te; 19.100 + 19.101 + // get the action 19.102 + while ( count && (buffer[ts] == ' ') ) { ts++; count--; } // skip spaces. 19.103 + te = ts; 19.104 + while ( count && (buffer[te] != ' ') ) { te++; count--; } // command end 19.105 + if ( te <= ts ) goto bad; 19.106 + tl = te - ts; 19.107 + 19.108 + if ( strncmp(&buffer[ts], "ACCEPT", tl) == 0 ) 19.109 + { 19.110 + op.u.net_rule.action = NETWORK_ACTION_ACCEPT; 19.111 + goto keyval; 19.112 + } 19.113 + if ( strncmp(&buffer[ts], "COUNT", tl) == 0 ) 19.114 + { 19.115 + op.u.net_rule.action = NETWORK_ACTION_COUNT; 19.116 + goto keyval; 19.117 + } 19.118 + 19.119 + // default case; 19.120 + return (len); 19.121 + 19.122 + 19.123 + // get the key=val pairs. 19.124 + keyval: 19.125 + while (count) 19.126 + { 19.127 + //get field 19.128 + ts = te; while ( count && isspace(buffer[ts]) ) { ts++; count--; } 19.129 + te = ts; 19.130 + while ( count && !isspace(buffer[te]) && (buffer[te] != '=') ) 19.131 + { te++; count--; } 19.132 + if ( te <= ts ) 19.133 + goto doneparsing; 19.134 + tl = te - ts; 19.135 + fs = ts; fe = te; fl = tl; // save the field markers. 19.136 + // skip " = " (ignores extra equals.) 19.137 + while ( count && (isspace(buffer[te]) || (buffer[te] == '=')) ) 19.138 + { te++; count--; } 19.139 + ts = te; 19.140 + while ( count && !isspace(buffer[te]) ) { te++; count--; } 19.141 + tl = te - ts; 19.142 + 19.143 + if ( (fl <= 0) || (tl <= 0) ) goto bad; 19.144 + 19.145 + if (strncmp(&buffer[fs], "srcaddr", fl) == 0) 19.146 + { 19.147 + op.u.net_rule.src_addr = getipaddr(&buffer[ts], tl); 19.148 + } 19.149 + else if (strncmp(&buffer[fs], "dstaddr", fl) == 0) 19.150 + { 19.151 + op.u.net_rule.dst_addr = getipaddr(&buffer[ts], tl); 19.152 + } 19.153 + else if (strncmp(&buffer[fs], "srcaddrmask", fl) == 0) 19.154 + { 19.155 + op.u.net_rule.src_addr_mask = getipaddr(&buffer[ts], tl); 19.156 + } 19.157 + else if (strncmp(&buffer[fs], "dstaddrmask", fl) == 0) 19.158 + { 19.159 + op.u.net_rule.dst_addr_mask = getipaddr(&buffer[ts], tl); 19.160 + } 19.161 + else if (strncmp(&buffer[fs], "srcport", fl) == 0) 19.162 + { 19.163 + op.u.net_rule.src_port = antous(&buffer[ts], tl); 19.164 + } 19.165 + else if (strncmp(&buffer[fs], "dstport", fl) == 0) 19.166 + { 19.167 + op.u.net_rule.dst_port = antous(&buffer[ts], tl); 19.168 + } 19.169 + else if (strncmp(&buffer[fs], "srcportmask", fl) == 0) 19.170 + { 19.171 + op.u.net_rule.src_port_mask = antous(&buffer[ts], tl); 19.172 + } 19.173 + else if (strncmp(&buffer[fs], "dstportmask", fl) == 0) 19.174 + { 19.175 + op.u.net_rule.dst_port_mask = antous(&buffer[ts], tl); 19.176 + } 19.177 + else if (strncmp(&buffer[fs], "srcint", fl) == 0) 19.178 + { 19.179 + op.u.net_rule.src_interface = anton(&buffer[ts], tl); 19.180 + } 19.181 + else if (strncmp(&buffer[fs], "dstint", fl) == 0) 19.182 + { 19.183 + op.u.net_rule.dst_interface = anton(&buffer[ts], tl); 19.184 + } 19.185 + else if ( (strncmp(&buffer[fs], "proto", fl) == 0)) 19.186 + { 19.187 + if (strncmp(&buffer[ts], "any", tl) == 0) 19.188 + op.u.net_rule.proto = NETWORK_PROTO_ANY; 19.189 + if (strncmp(&buffer[ts], "ip", tl) == 0) 19.190 + op.u.net_rule.proto = NETWORK_PROTO_IP; 19.191 + if (strncmp(&buffer[ts], "tcp", tl) == 0) 19.192 + op.u.net_rule.proto = NETWORK_PROTO_TCP; 19.193 + if (strncmp(&buffer[ts], "udp", tl) == 0) 19.194 + op.u.net_rule.proto = NETWORK_PROTO_UDP; 19.195 + if (strncmp(&buffer[ts], "arp", tl) == 0) 19.196 + op.u.net_rule.proto = NETWORK_PROTO_ARP; 19.197 + 19.198 + } 19.199 + } 19.200 + 19.201 + doneparsing: 19.202 + ret = HYPERVISOR_network_op(&op); 19.203 + return(len); 19.204 + 19.205 + bad: 19.206 + return(len); 19.207 + 19.208 + 19.209 +} 19.210 + 19.211 +static int __init init_module(void) 19.212 +{ 19.213 + *readbuf = '\0'; 19.214 + proc_vfr = create_proc_entry ("vfr", 0600, &proc_root); 19.215 + if ( proc_vfr != NULL ) 19.216 + { 19.217 + proc_vfr->owner = THIS_MODULE; 19.218 + proc_vfr->nlink = 1; 19.219 + proc_vfr->read_proc = vfr_read_proc; 19.220 + proc_vfr->write_proc = vfr_write_proc; 19.221 + printk("Successfully installed virtual firewall/router interface\n"); 19.222 + } 19.223 + return 0; 19.224 +} 19.225 + 19.226 +static void __exit cleanup_module(void) 19.227 +{ 19.228 + if ( proc_vfr == NULL ) return; 19.229 + remove_proc_entry("vfr", &proc_root); 19.230 + proc_vfr = NULL; 19.231 +} 19.232 + 19.233 +module_init(init_module); 19.234 +module_exit(cleanup_module); 19.235 + 19.236 +/* Helper functions start here: */ 19.237 + 19.238 +int anton(const char *buff, int len) 19.239 +{ 19.240 + int ret; 19.241 + char c; 19.242 + int sign = 1; 19.243 + 19.244 + ret = 0; 19.245 + 19.246 + if (len == 0) return 0; 19.247 + if (*buff == '-') { sign = -1; buff++; len--; } 19.248 + 19.249 + while ( (len) && ((c = *buff) >= '0') && (c <= '9') ) 19.250 + { 19.251 + ret *= 10; 19.252 + ret += c - '0'; 19.253 + buff++; len--; 19.254 + } 19.255 + 19.256 + ret *= sign; 19.257 + return ret; 19.258 +} 19.259 + 19.260 +u16 antous(const char *buff, int len) 19.261 +{ 19.262 + u16 ret; 19.263 + char c; 19.264 + 19.265 + ret = 0; 19.266 + 19.267 + while ( (len) && ((c = *buff) >= '0') && (c <= '9') ) 19.268 + { 19.269 + ret *= 10; 19.270 + ret += c - '0'; 19.271 + buff++; len--; 19.272 + } 19.273 + 19.274 + return ret; 19.275 +} 19.276 + 19.277 +u32 getipaddr(const char *buff, unsigned int len) 19.278 +{ 19.279 + int i; 19.280 + char c; 19.281 + u32 ret, val; 19.282 + 19.283 + ret = 0; val = 0; 19.284 + 19.285 + while ( len ) 19.286 + { 19.287 + if (!((((c = *buff) >= '0') && ( c <= '9')) || ( c == '.' ) ) ) 19.288 + { 19.289 + return(0); // malformed. 19.290 + } 19.291 + 19.292 + if ( c == '.' ) { 19.293 + if (val > 255) return (0); //malformed. 19.294 + ret = ret << 8; 19.295 + ret += val; 19.296 + val = 0; 19.297 + len--; buff++; 19.298 + continue; 19.299 + } 19.300 + val *= 10; 19.301 + val += c - '0'; 19.302 + buff++; len--; 19.303 + } 19.304 + ret = ret << 8; 19.305 + ret += val; 19.306 + 19.307 + return (ret); 19.308 +} 19.309 +
20.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 20.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/drivers/network/Makefile Mon Feb 24 16:55:07 2003 +0000 20.3 @@ -0,0 +1,3 @@ 20.4 +O_TARGET := net.o 20.5 +obj-y := network.o 20.6 +include $(TOPDIR)/Rules.make
21.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 21.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/drivers/network/network.c Mon Feb 24 16:55:07 2003 +0000 21.3 @@ -0,0 +1,443 @@ 21.4 +/****************************************************************************** 21.5 + * network.c 21.6 + * 21.7 + * Virtual network driver for XenoLinux. 21.8 + * 21.9 + * Copyright (c) 2002, K A Fraser 21.10 + */ 21.11 + 21.12 +#include <linux/config.h> 21.13 +#include <linux/module.h> 21.14 + 21.15 +#include <linux/kernel.h> 21.16 +#include <linux/sched.h> 21.17 +#include <linux/slab.h> 21.18 +#include <linux/string.h> 21.19 +#include <linux/errno.h> 21.20 + 21.21 +#include <linux/netdevice.h> 21.22 +#include <linux/inetdevice.h> 21.23 +#include <linux/etherdevice.h> 21.24 +#include <linux/skbuff.h> 21.25 +#include <linux/init.h> 21.26 + 21.27 +#include <asm/io.h> 21.28 +#include <net/sock.h> 21.29 + 21.30 +#define NET_TX_IRQ _EVENT_NET_TX 21.31 +#define NET_RX_IRQ _EVENT_NET_RX 21.32 + 21.33 +#define TX_MAX_ENTRIES (TX_RING_SIZE - 2) 21.34 +#define RX_MAX_ENTRIES (RX_RING_SIZE - 2) 21.35 + 21.36 +#define TX_RING_INC(_i) (((_i)+1) & (TX_RING_SIZE-1)) 21.37 +#define RX_RING_INC(_i) (((_i)+1) & (RX_RING_SIZE-1)) 21.38 +#define TX_RING_ADD(_i,_j) (((_i)+(_j)) & (TX_RING_SIZE-1)) 21.39 +#define RX_RING_ADD(_i,_j) (((_i)+(_j)) & (RX_RING_SIZE-1)) 21.40 + 21.41 +#define RX_BUF_SIZE ((PAGE_SIZE/2)+1) /* Fool the slab allocator :-) */ 21.42 + 21.43 +static void network_rx_int(int irq, void *dev_id, struct pt_regs *ptregs); 21.44 +static void network_tx_int(int irq, void *dev_id, struct pt_regs *ptregs); 21.45 +static void network_tx_buf_gc(struct net_device *dev); 21.46 +static void network_alloc_rx_buffers(struct net_device *dev); 21.47 +static void network_free_rx_buffers(struct net_device *dev); 21.48 +static void cleanup_module(void); 21.49 + 21.50 +static struct list_head dev_list; 21.51 + 21.52 +/* 21.53 + * RX RING: RX_IDX <= rx_cons <= rx_prod 21.54 + * TX RING: TX_IDX <= tx_cons <= tx_prod 21.55 + * (*_IDX allocated privately here, *_cons & *_prod shared with hypervisor) 21.56 + */ 21.57 +struct net_private 21.58 +{ 21.59 + struct list_head list; 21.60 + struct net_device *dev; 21.61 + 21.62 + struct net_device_stats stats; 21.63 + struct sk_buff **tx_skb_ring; 21.64 + struct sk_buff **rx_skb_ring; 21.65 + atomic_t tx_entries; 21.66 + unsigned int rx_idx, tx_idx, tx_full; 21.67 + net_ring_t *net_ring; 21.68 + spinlock_t tx_lock; 21.69 +}; 21.70 + 21.71 + 21.72 +static int network_open(struct net_device *dev) 21.73 +{ 21.74 + struct net_private *np = dev->priv; 21.75 + int error = 0; 21.76 + 21.77 + np->rx_idx = np->tx_idx = np->tx_full = 0; 21.78 + 21.79 + memset(&np->stats, 0, sizeof(np->stats)); 21.80 + 21.81 + spin_lock_init(&np->tx_lock); 21.82 + 21.83 + atomic_set(&np->tx_entries, 0); 21.84 + 21.85 + np->net_ring->tx_prod = np->net_ring->tx_cons = np->net_ring->tx_event = 0; 21.86 + np->net_ring->rx_prod = np->net_ring->rx_cons = np->net_ring->rx_event = 0; 21.87 + np->net_ring->tx_ring = NULL; 21.88 + np->net_ring->rx_ring = NULL; 21.89 + 21.90 + np->tx_skb_ring = kmalloc(TX_RING_SIZE * sizeof(struct sk_buff *), 21.91 + GFP_KERNEL); 21.92 + np->rx_skb_ring = kmalloc(RX_RING_SIZE * sizeof(struct sk_buff *), 21.93 + GFP_KERNEL); 21.94 + np->net_ring->tx_ring = kmalloc(TX_RING_SIZE * sizeof(tx_entry_t), 21.95 + GFP_KERNEL); 21.96 + np->net_ring->rx_ring = kmalloc(RX_RING_SIZE * sizeof(rx_entry_t), 21.97 + GFP_KERNEL); 21.98 + if ( (np->tx_skb_ring == NULL) || (np->rx_skb_ring == NULL) || 21.99 + (np->net_ring->tx_ring == NULL) || (np->net_ring->rx_ring == NULL) ) 21.100 + { 21.101 + printk(KERN_WARNING "%s; Could not allocate ring memory\n", dev->name); 21.102 + error = -ENOBUFS; 21.103 + goto fail; 21.104 + } 21.105 + 21.106 + network_alloc_rx_buffers(dev); 21.107 + 21.108 + error = request_irq(NET_RX_IRQ, network_rx_int, 0, 21.109 + "net-rx", dev); 21.110 + if ( error ) 21.111 + { 21.112 + printk(KERN_WARNING "%s: Could not allocate receive interrupt\n", 21.113 + dev->name); 21.114 + network_free_rx_buffers(dev); 21.115 + goto fail; 21.116 + } 21.117 + 21.118 + error = request_irq(NET_TX_IRQ, network_tx_int, 0, 21.119 + "net-tx", dev); 21.120 + if ( error ) 21.121 + { 21.122 + printk(KERN_WARNING "%s: Could not allocate transmit interrupt\n", 21.123 + dev->name); 21.124 + free_irq(NET_RX_IRQ, dev); 21.125 + network_free_rx_buffers(dev); 21.126 + goto fail; 21.127 + } 21.128 + 21.129 + printk("XenoLinux Virtual Network Driver installed as %s\n", dev->name); 21.130 + 21.131 + netif_start_queue(dev); 21.132 + 21.133 + MOD_INC_USE_COUNT; 21.134 + 21.135 + return 0; 21.136 + 21.137 + fail: 21.138 + if ( np->net_ring->rx_ring ) kfree(np->net_ring->rx_ring); 21.139 + if ( np->net_ring->tx_ring ) kfree(np->net_ring->tx_ring); 21.140 + if ( np->rx_skb_ring ) kfree(np->rx_skb_ring); 21.141 + if ( np->tx_skb_ring ) kfree(np->tx_skb_ring); 21.142 + kfree(np); 21.143 + return error; 21.144 +} 21.145 + 21.146 + 21.147 +static void network_tx_buf_gc(struct net_device *dev) 21.148 +{ 21.149 + unsigned int i; 21.150 + struct net_private *np = dev->priv; 21.151 + struct sk_buff *skb; 21.152 + unsigned long flags; 21.153 + 21.154 + spin_lock_irqsave(&np->tx_lock, flags); 21.155 + 21.156 + for ( i = np->tx_idx; i != np->net_ring->tx_cons; i = TX_RING_INC(i) ) 21.157 + { 21.158 + skb = np->tx_skb_ring[i]; 21.159 + dev_kfree_skb_any(skb); 21.160 + atomic_dec(&np->tx_entries); 21.161 + } 21.162 + 21.163 + np->tx_idx = i; 21.164 + 21.165 + if ( np->tx_full && (atomic_read(&np->tx_entries) < TX_MAX_ENTRIES) ) 21.166 + { 21.167 + np->tx_full = 0; 21.168 + netif_wake_queue(dev); 21.169 + } 21.170 + 21.171 + spin_unlock_irqrestore(&np->tx_lock, flags); 21.172 +} 21.173 + 21.174 +inline unsigned long get_ppte(unsigned long addr) 21.175 +{ 21.176 + unsigned long ppte; 21.177 + pgd_t *pgd; pmd_t *pmd; pte_t *ptep; 21.178 + pgd = pgd_offset_k(addr); 21.179 + 21.180 + if ( pgd_none(*pgd) || pgd_bad(*pgd) ) BUG(); 21.181 + 21.182 + pmd = pmd_offset(pgd, addr); 21.183 + if ( pmd_none(*pmd) || pmd_bad(*pmd) ) BUG(); 21.184 + 21.185 + ptep = pte_offset(pmd, addr); 21.186 + ppte = (unsigned long)phys_to_machine(virt_to_phys(ptep)); 21.187 + 21.188 + return ppte; 21.189 +} 21.190 + 21.191 +static void network_alloc_rx_buffers(struct net_device *dev) 21.192 +{ 21.193 + unsigned int i; 21.194 + struct net_private *np = dev->priv; 21.195 + struct sk_buff *skb; 21.196 + unsigned int end = RX_RING_ADD(np->rx_idx, RX_MAX_ENTRIES); 21.197 + 21.198 + for ( i = np->net_ring->rx_prod; i != end; i = RX_RING_INC(i) ) 21.199 + { 21.200 + skb = dev_alloc_skb(RX_BUF_SIZE); 21.201 + if ( skb == NULL ) break; 21.202 + skb->dev = dev; 21.203 + skb_reserve(skb, 2); /* word align the IP header */ 21.204 + np->rx_skb_ring[i] = skb; 21.205 + np->net_ring->rx_ring[i].addr = get_ppte((unsigned long)skb->head); 21.206 + np->net_ring->rx_ring[i].size = RX_BUF_SIZE - 16; /* arbitrary */ 21.207 + } 21.208 + 21.209 + np->net_ring->rx_prod = i; 21.210 + 21.211 + np->net_ring->rx_event = RX_RING_INC(np->rx_idx); 21.212 + 21.213 + HYPERVISOR_net_update(); 21.214 +} 21.215 + 21.216 + 21.217 +static void network_free_rx_buffers(struct net_device *dev) 21.218 +{ 21.219 + unsigned int i; 21.220 + struct net_private *np = dev->priv; 21.221 + struct sk_buff *skb; 21.222 + 21.223 + for ( i = np->rx_idx; i != np->net_ring->rx_prod; i = RX_RING_INC(i) ) 21.224 + { 21.225 + skb = np->rx_skb_ring[i]; 21.226 + dev_kfree_skb(skb); 21.227 + } 21.228 +} 21.229 + 21.230 +static int network_start_xmit(struct sk_buff *skb, struct net_device *dev) 21.231 +{ 21.232 + unsigned int i; 21.233 + struct net_private *np = (struct net_private *)dev->priv; 21.234 + 21.235 + if ( np->tx_full ) 21.236 + { 21.237 + printk(KERN_WARNING "%s: full queue wasn't stopped!\n", dev->name); 21.238 + netif_stop_queue(dev); 21.239 + return -ENOBUFS; 21.240 + } 21.241 + i = np->net_ring->tx_prod; 21.242 + 21.243 + if ( (((unsigned long)skb->data & ~PAGE_MASK) + skb->len) >= PAGE_SIZE ) 21.244 + { 21.245 + struct sk_buff *new_skb = alloc_skb(RX_BUF_SIZE, GFP_KERNEL); 21.246 + skb_put(new_skb, skb->len); 21.247 + memcpy(new_skb->data, skb->data, skb->len); 21.248 + kfree_skb(skb); 21.249 + skb = new_skb; 21.250 + } 21.251 + 21.252 + np->tx_skb_ring[i] = skb; 21.253 + np->net_ring->tx_ring[i].addr = 21.254 + (unsigned long)phys_to_machine(virt_to_phys(skb->data)); 21.255 + np->net_ring->tx_ring[i].size = skb->len; 21.256 + np->net_ring->tx_prod = TX_RING_INC(i); 21.257 + atomic_inc(&np->tx_entries); 21.258 + 21.259 + np->stats.tx_bytes += skb->len; 21.260 + np->stats.tx_packets++; 21.261 + 21.262 + spin_lock_irq(&np->tx_lock); 21.263 + if ( atomic_read(&np->tx_entries) >= TX_MAX_ENTRIES ) 21.264 + { 21.265 + np->tx_full = 1; 21.266 + netif_stop_queue(dev); 21.267 + np->net_ring->tx_event = 21.268 + TX_RING_ADD(np->tx_idx, atomic_read(&np->tx_entries) >> 1); 21.269 + } 21.270 + else 21.271 + { 21.272 + /* Avoid unnecessary tx interrupts. */ 21.273 + np->net_ring->tx_event = TX_RING_INC(np->net_ring->tx_prod); 21.274 + } 21.275 + spin_unlock_irq(&np->tx_lock); 21.276 + 21.277 + /* Must do this after setting tx_event: race with updates of tx_cons. */ 21.278 + network_tx_buf_gc(dev); 21.279 + 21.280 + HYPERVISOR_net_update(); 21.281 + 21.282 + return 0; 21.283 +} 21.284 + 21.285 + 21.286 +static void network_rx_int(int irq, void *dev_id, struct pt_regs *ptregs) 21.287 +{ 21.288 + unsigned int i; 21.289 + struct net_device *dev = (struct net_device *)dev_id; 21.290 + struct net_private *np = dev->priv; 21.291 + struct sk_buff *skb; 21.292 + 21.293 + again: 21.294 + for ( i = np->rx_idx; i != np->net_ring->rx_cons; i = RX_RING_INC(i) ) 21.295 + { 21.296 + if (np->net_ring->rx_ring[i].status != RING_STATUS_OK) 21.297 + { 21.298 + printk("bad buffer on RX ring!(%d)\n", 21.299 + np->net_ring->rx_ring[i].status); 21.300 + continue; 21.301 + } 21.302 + skb = np->rx_skb_ring[i]; 21.303 + 21.304 + phys_to_machine_mapping[virt_to_phys(skb->head) >> PAGE_SHIFT] = 21.305 + (*(unsigned long *)phys_to_virt( 21.306 + machine_to_phys(np->net_ring->rx_ring[i].addr)) 21.307 + ) >> PAGE_SHIFT; 21.308 + 21.309 + skb_put(skb, np->net_ring->rx_ring[i].size); 21.310 + skb->protocol = eth_type_trans(skb, dev); 21.311 + 21.312 + /* 21.313 + * Set up shinfo -- from alloc_skb This was particularily nasty: the 21.314 + * shared info is hidden at the back of the data area (presumably so it 21.315 + * can be shared), but on page flip it gets very spunked. 21.316 + */ 21.317 + atomic_set(&(skb_shinfo(skb)->dataref), 1); 21.318 + skb_shinfo(skb)->nr_frags = 0; 21.319 + skb_shinfo(skb)->frag_list = NULL; 21.320 + 21.321 + np->stats.rx_packets++; 21.322 + 21.323 + np->stats.rx_bytes += np->net_ring->rx_ring[i].size; 21.324 + netif_rx(skb); 21.325 + dev->last_rx = jiffies; 21.326 + } 21.327 + 21.328 + np->rx_idx = i; 21.329 + 21.330 + network_alloc_rx_buffers(dev); 21.331 + 21.332 + /* Deal with hypervisor racing our resetting of rx_event. */ 21.333 + smp_mb(); 21.334 + if ( np->net_ring->rx_cons != i ) goto again; 21.335 +} 21.336 + 21.337 + 21.338 +static void network_tx_int(int irq, void *dev_id, struct pt_regs *ptregs) 21.339 +{ 21.340 + struct net_device *dev = (struct net_device *)dev_id; 21.341 + network_tx_buf_gc(dev); 21.342 +} 21.343 + 21.344 + 21.345 +int network_close(struct net_device *dev) 21.346 +{ 21.347 + struct net_private *np = dev->priv; 21.348 + 21.349 + netif_stop_queue(dev); 21.350 + 21.351 + free_irq(NET_RX_IRQ, dev); 21.352 + free_irq(NET_TX_IRQ, dev); 21.353 + 21.354 + /* 21.355 + * XXXX This cannot be done safely until be have a proper interface 21.356 + * for setting up and tearing down virtual interfaces on the fly. 21.357 + * Currently the receive buffers are locked down by Xen and we have 21.358 + * no sensible way of retrieving them. 21.359 + */ 21.360 +#if 0 21.361 + network_free_rx_buffers(dev); 21.362 + kfree(np->net_ring->rx_ring); 21.363 + kfree(np->net_ring->tx_ring); 21.364 +#endif 21.365 + 21.366 + kfree(np->rx_skb_ring); 21.367 + kfree(np->tx_skb_ring); 21.368 + 21.369 + MOD_DEC_USE_COUNT; 21.370 + 21.371 + return 0; 21.372 +} 21.373 + 21.374 + 21.375 +static struct net_device_stats *network_get_stats(struct net_device *dev) 21.376 +{ 21.377 + struct net_private *np = (struct net_private *)dev->priv; 21.378 + return &np->stats; 21.379 +} 21.380 + 21.381 + 21.382 +int __init init_module(void) 21.383 +{ 21.384 + int i, err; 21.385 + struct net_device *dev; 21.386 + struct net_private *np; 21.387 + 21.388 + INIT_LIST_HEAD(&dev_list); 21.389 + 21.390 + for ( i = 0; i < start_info.num_net_rings; i++ ) 21.391 + { 21.392 + dev = alloc_etherdev(sizeof(struct net_private)); 21.393 + if ( dev == NULL ) 21.394 + { 21.395 + err = -ENOMEM; 21.396 + goto fail; 21.397 + } 21.398 + 21.399 + np = dev->priv; 21.400 + np->net_ring = start_info.net_rings + i; 21.401 + 21.402 + SET_MODULE_OWNER(dev); 21.403 + dev->open = network_open; 21.404 + dev->hard_start_xmit = network_start_xmit; 21.405 + dev->stop = network_close; 21.406 + dev->get_stats = network_get_stats; 21.407 + 21.408 + memset(dev->dev_addr, 0, ETH_ALEN); 21.409 + *(unsigned int *)(dev->dev_addr + 1) = i; 21.410 + 21.411 + if ( (err = register_netdev(dev)) != 0 ) 21.412 + { 21.413 + kfree(dev); 21.414 + goto fail; 21.415 + } 21.416 + 21.417 + np->dev = dev; 21.418 + list_add(&np->list, &dev_list); 21.419 + } 21.420 + 21.421 + return 0; 21.422 + 21.423 + fail: 21.424 + cleanup_module(); 21.425 + return err; 21.426 +} 21.427 + 21.428 + 21.429 +static void cleanup_module(void) 21.430 +{ 21.431 + struct net_private *np; 21.432 + struct net_device *dev; 21.433 + 21.434 + while ( !list_empty(&dev_list) ) 21.435 + { 21.436 + np = list_entry(dev_list.next, struct net_private, list); 21.437 + list_del(&np->list); 21.438 + dev = np->dev; 21.439 + unregister_netdev(dev); 21.440 + kfree(dev); 21.441 + } 21.442 +} 21.443 + 21.444 + 21.445 +module_init(init_module); 21.446 +module_exit(cleanup_module);
22.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 22.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/kernel/Makefile Mon Feb 24 16:55:07 2003 +0000 22.3 @@ -0,0 +1,15 @@ 22.4 + 22.5 +.S.o: 22.6 + $(CC) $(AFLAGS) -traditional -c $< -o $*.o 22.7 + 22.8 +all: kernel.o head.o init_task.o 22.9 + 22.10 +O_TARGET := kernel.o 22.11 + 22.12 +export-objs := i386_ksyms.o 22.13 + 22.14 +obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o \ 22.15 + ptrace.o ioport.o ldt.o setup.o time.o sys_i386.o \ 22.16 + i386_ksyms.o i387.o hypervisor.o 22.17 + 22.18 +include $(TOPDIR)/Rules.make
23.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 23.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/kernel/entry.S Mon Feb 24 16:55:07 2003 +0000 23.3 @@ -0,0 +1,717 @@ 23.4 +/* 23.5 + * linux/arch/i386/entry.S 23.6 + * 23.7 + * Copyright (C) 1991, 1992 Linus Torvalds 23.8 + */ 23.9 + 23.10 +/* 23.11 + * entry.S contains the system-call and fault low-level handling routines. 23.12 + * This also contains the timer-interrupt handler, as well as all interrupts 23.13 + * and faults that can result in a task-switch. 23.14 + * 23.15 + * NOTE: This code handles signal-recognition, which happens every time 23.16 + * after a timer-interrupt and after each system call. 23.17 + * 23.18 + * I changed all the .align's to 4 (16 byte alignment), as that's faster 23.19 + * on a 486. 23.20 + * 23.21 + * Stack layout in 'ret_from_system_call': 23.22 + * ptrace needs to have all regs on the stack. 23.23 + * if the order here is changed, it needs to be 23.24 + * updated in fork.c:copy_process, signal.c:do_signal, 23.25 + * ptrace.c and ptrace.h 23.26 + * 23.27 + * 0(%esp) - %ebx 23.28 + * 4(%esp) - %ecx 23.29 + * 8(%esp) - %edx 23.30 + * C(%esp) - %esi 23.31 + * 10(%esp) - %edi 23.32 + * 14(%esp) - %ebp 23.33 + * 18(%esp) - %eax 23.34 + * 1C(%esp) - %ds 23.35 + * 20(%esp) - %es 23.36 + * 24(%esp) - orig_eax 23.37 + * 28(%esp) - %eip 23.38 + * 2C(%esp) - %cs 23.39 + * 30(%esp) - %eflags 23.40 + * 34(%esp) - %oldesp 23.41 + * 38(%esp) - %oldss 23.42 + * 23.43 + * "current" is in register %ebx during any slow entries. 23.44 + */ 23.45 + 23.46 +#include <linux/config.h> 23.47 +#include <linux/sys.h> 23.48 +#include <linux/linkage.h> 23.49 +#include <asm/segment.h> 23.50 +#include <asm/smp.h> 23.51 + 23.52 +EBX = 0x00 23.53 +ECX = 0x04 23.54 +EDX = 0x08 23.55 +ESI = 0x0C 23.56 +EDI = 0x10 23.57 +EBP = 0x14 23.58 +EAX = 0x18 23.59 +DS = 0x1C 23.60 +ES = 0x20 23.61 +ORIG_EAX = 0x24 23.62 +EIP = 0x28 23.63 +CS = 0x2C 23.64 +EFLAGS = 0x30 23.65 +OLDESP = 0x34 23.66 +OLDSS = 0x38 23.67 + 23.68 +CF_MASK = 0x00000001 23.69 +IF_MASK = 0x00000200 23.70 +NT_MASK = 0x00004000 23.71 + 23.72 +/* 23.73 + * these are offsets into the task-struct. 23.74 + */ 23.75 +state = 0 23.76 +flags = 4 23.77 +sigpending = 8 23.78 +addr_limit = 12 23.79 +exec_domain = 16 23.80 +need_resched = 20 23.81 +tsk_ptrace = 24 23.82 +processor = 52 23.83 + 23.84 +ENOSYS = 38 23.85 + 23.86 + 23.87 +#define SAVE_ALL \ 23.88 + cld; \ 23.89 + pushl %es; \ 23.90 + pushl %ds; \ 23.91 + pushl %eax; \ 23.92 + pushl %ebp; \ 23.93 + pushl %edi; \ 23.94 + pushl %esi; \ 23.95 + pushl %edx; \ 23.96 + pushl %ecx; \ 23.97 + pushl %ebx; \ 23.98 + movl $(__KERNEL_DS),%edx; \ 23.99 + movl %edx,%ds; \ 23.100 + movl %edx,%es; 23.101 + 23.102 +#define RESTORE_ALL \ 23.103 + popl %ebx; \ 23.104 + popl %ecx; \ 23.105 + popl %edx; \ 23.106 + popl %esi; \ 23.107 + popl %edi; \ 23.108 + popl %ebp; \ 23.109 + popl %eax; \ 23.110 +1: popl %ds; \ 23.111 +2: popl %es; \ 23.112 + addl $4,%esp; \ 23.113 +3: iret; \ 23.114 +.section .fixup,"ax"; \ 23.115 +4: movl $0,(%esp); \ 23.116 + jmp 1b; \ 23.117 +5: movl $0,(%esp); \ 23.118 + jmp 2b; \ 23.119 +6: pushl %ss; \ 23.120 + popl %ds; \ 23.121 + pushl %ss; \ 23.122 + popl %es; \ 23.123 + pushl $11; \ 23.124 + call do_exit; \ 23.125 +.previous; \ 23.126 +.section __ex_table,"a";\ 23.127 + .align 4; \ 23.128 + .long 1b,4b; \ 23.129 + .long 2b,5b; \ 23.130 + .long 3b,6b; \ 23.131 +.previous 23.132 + 23.133 +#define GET_CURRENT(reg) \ 23.134 + movl $-8192, reg; \ 23.135 + andl %esp, reg 23.136 + 23.137 + 23.138 +ENTRY(ret_from_fork) 23.139 + pushl %ebx 23.140 + call SYMBOL_NAME(schedule_tail) 23.141 + addl $4, %esp 23.142 + GET_CURRENT(%ebx) 23.143 + testb $0x02,tsk_ptrace(%ebx) # PT_TRACESYS 23.144 + jne tracesys_exit 23.145 + jmp ret_from_sys_call 23.146 + 23.147 +#if defined(CONFIG_KDB) 23.148 +ENTRY(kdb_call) 23.149 + pushl %eax # save orig EAX 23.150 + SAVE_ALL 23.151 + pushl %esp # struct pt_regs 23.152 + pushl $0 # error_code 23.153 + pushl $7 # KDB_REASON_ENTRY 23.154 + call SYMBOL_NAME(kdb) 23.155 + addl $12,%esp # remove args 23.156 + RESTORE_ALL 23.157 +#endif 23.158 + 23.159 +/* 23.160 + * Return to user mode is not as complex as all this looks, 23.161 + * but we want the default path for a system call return to 23.162 + * go as quickly as possible which is why some of this is 23.163 + * less clear than it otherwise should be. 23.164 + */ 23.165 + 23.166 +ENTRY(system_call) 23.167 + pushl %eax # save orig_eax 23.168 + SAVE_ALL 23.169 + GET_CURRENT(%ebx) 23.170 + testb $0x02,tsk_ptrace(%ebx) # PT_TRACESYS 23.171 + jne tracesys 23.172 + cmpl $(NR_syscalls),%eax 23.173 + jae badsys 23.174 + call *SYMBOL_NAME(sys_call_table)(,%eax,4) 23.175 + movl %eax,EAX(%esp) # save the return value 23.176 +ENTRY(ret_from_sys_call) 23.177 + movl SYMBOL_NAME(HYPERVISOR_shared_info),%esi 23.178 + xorl %eax,%eax 23.179 + movl %eax,4(%esi) # need_resched and signals atomic test 23.180 +ret_syscall_tests: 23.181 + cmpl $0,need_resched(%ebx) 23.182 + jne reschedule 23.183 + cmpl $0,sigpending(%ebx) 23.184 + je safesti # ensure need_resched updates are seen 23.185 +signal_return: 23.186 + btsl %eax,4(%esi) # reenable event callbacks 23.187 + movl %esp,%eax 23.188 + xorl %edx,%edx 23.189 + call SYMBOL_NAME(do_signal) 23.190 + jmp ret_from_sys_call 23.191 + 23.192 + ALIGN 23.193 +restore_all: 23.194 + RESTORE_ALL 23.195 + 23.196 + ALIGN 23.197 +tracesys: 23.198 + movl $-ENOSYS,EAX(%esp) 23.199 + call SYMBOL_NAME(syscall_trace) 23.200 + movl ORIG_EAX(%esp),%eax 23.201 + cmpl $(NR_syscalls),%eax 23.202 + jae tracesys_exit 23.203 + call *SYMBOL_NAME(sys_call_table)(,%eax,4) 23.204 + movl %eax,EAX(%esp) # save the return value 23.205 +tracesys_exit: 23.206 + call SYMBOL_NAME(syscall_trace) 23.207 + jmp ret_from_sys_call 23.208 +badsys: 23.209 + movl $-ENOSYS,EAX(%esp) 23.210 + jmp ret_from_sys_call 23.211 + 23.212 + ALIGN 23.213 +ENTRY(ret_from_intr) 23.214 + GET_CURRENT(%ebx) 23.215 +ret_from_exception: 23.216 + movb CS(%esp),%al 23.217 + testl $2,%eax 23.218 + jne ret_from_sys_call 23.219 + jmp restore_all 23.220 + 23.221 + ALIGN 23.222 +reschedule: 23.223 + btsl %eax,4(%esi) # reenable event callbacks 23.224 + call SYMBOL_NAME(schedule) # test 23.225 + jmp ret_from_sys_call 23.226 + 23.227 +ENTRY(divide_error) 23.228 + pushl $0 # no error code 23.229 + pushl $ SYMBOL_NAME(do_divide_error) 23.230 + ALIGN 23.231 +error_code: 23.232 + pushl %ds 23.233 + pushl %eax 23.234 + xorl %eax,%eax 23.235 + pushl %ebp 23.236 + pushl %edi 23.237 + pushl %esi 23.238 + pushl %edx 23.239 + decl %eax # eax = -1 23.240 + pushl %ecx 23.241 + pushl %ebx 23.242 + GET_CURRENT(%ebx) 23.243 + cld 23.244 + movl %es,%ecx 23.245 + movl ORIG_EAX(%esp), %esi # get the error code 23.246 + movl ES(%esp), %edi # get the function address 23.247 + movl %eax, ORIG_EAX(%esp) 23.248 + movl %ecx, ES(%esp) 23.249 + movl %esp,%edx 23.250 + pushl %esi # push the error code 23.251 + pushl %edx # push the pt_regs pointer 23.252 + movl $(__KERNEL_DS),%edx 23.253 + movl %edx,%ds 23.254 + movl %edx,%es 23.255 + call *%edi 23.256 + addl $8,%esp 23.257 + jmp ret_from_exception 23.258 + 23.259 +# A note on the "critical region" in our callback handler. 23.260 +# We want to avoid stacking callback handlers due to events occurring 23.261 +# during handling of the last event. To do this, we keep events disabled 23.262 +# until we've done all processing. HOWEVER, we must enable events before 23.263 +# popping the stack frame (can't be done atomically) and so it would still 23.264 +# be possible to get enough handler activations to overflow the stack. 23.265 +# Although unlikely, bugs of that kind are hard to track down, so we'd 23.266 +# like to avoid the possibility. 23.267 +# So, on entry to the handler we detect whether we interrupted an 23.268 +# existing activation in its critical region -- if so, we pop the current 23.269 +# activation and restart the handler using the previous one. 23.270 +ENTRY(hypervisor_callback) 23.271 + pushl %eax 23.272 + SAVE_ALL 23.273 + GET_CURRENT(%ebx) 23.274 + movl EIP(%esp),%eax 23.275 + cmpl $scrit,%eax 23.276 + jb 11f 23.277 + cmpl $ecrit,%eax 23.278 + jb critical_region_fixup 23.279 +11: push %esp 23.280 + call do_hypervisor_callback 23.281 + add $4,%esp 23.282 + movl SYMBOL_NAME(HYPERVISOR_shared_info),%esi 23.283 + xorl %eax,%eax 23.284 + movb CS(%esp),%cl 23.285 + test $2,%cl # slow return to ring 2 or 3 23.286 + jne ret_syscall_tests 23.287 +safesti:btsl %eax,4(%esi) # reenable event callbacks 23.288 +scrit: /**** START OF CRITICAL REGION ****/ 23.289 + cmpl %eax,(%esi) 23.290 + jne 14f # process more events if necessary... 23.291 + RESTORE_ALL 23.292 +14: btrl %eax,4(%esi) 23.293 + jmp 11b 23.294 +ecrit: /**** END OF CRITICAL REGION ****/ 23.295 +# [How we do the fixup]. We want to merge the current stack frame with the 23.296 +# just-interrupted frame. How we do this depends on where in the critical 23.297 +# region the interrupted handler was executing, and so how many saved 23.298 +# registers are in each frame. We do this quickly using the lookup table 23.299 +# 'critical_fixup_table'. For each byte offset in the critical region, it 23.300 +# provides the number of bytes which have already been popped from the 23.301 +# interrupted stack frame. 23.302 +critical_region_fixup: 23.303 + addl $critical_fixup_table-scrit,%eax 23.304 + movzbl (%eax),%eax # %eax contains num bytes popped 23.305 + mov %esp,%esi 23.306 + add %eax,%esi # %esi points at end of src region 23.307 + mov %esp,%edi 23.308 + add $0x34,%edi # %edi points at end of dst region 23.309 + mov %eax,%ecx 23.310 + shr $2,%ecx # convert words to bytes 23.311 + je 16f # skip loop if nothing to copy 23.312 +15: subl $4,%esi # pre-decrementing copy loop 23.313 + subl $4,%edi 23.314 + movl (%esi),%eax 23.315 + movl %eax,(%edi) 23.316 + loop 15b 23.317 +16: movl %edi,%esp # final %edi is top of merged stack 23.318 + jmp 11b 23.319 + 23.320 +critical_fixup_table: 23.321 + .byte 0x00,0x00 # cmpl %eax,(%esi) 23.322 + .byte 0x00,0x00 # jne 14f 23.323 + .byte 0x00 # pop %ebx 23.324 + .byte 0x04 # pop %ecx 23.325 + .byte 0x08 # pop %edx 23.326 + .byte 0x0c # pop %esi 23.327 + .byte 0x10 # pop %edi 23.328 + .byte 0x14 # pop %ebp 23.329 + .byte 0x18 # pop %eax 23.330 + .byte 0x1c # pop %ds 23.331 + .byte 0x20 # pop %es 23.332 + .byte 0x24,0x24,0x24 # add $4,%esp 23.333 + .byte 0x28 # iret 23.334 + .byte 0x00,0x00,0x00,0x00 # btrl %eax,4(%esi) 23.335 + .byte 0x00,0x00 # jmp 11b 23.336 + 23.337 +# Hypervisor uses this for application faults while it executes. 23.338 +ENTRY(failsafe_callback) 23.339 +1: pop %ds 23.340 +2: pop %es 23.341 +3: iret 23.342 +.section .fixup,"ax"; \ 23.343 +4: movl $0,(%esp); \ 23.344 + jmp 1b; \ 23.345 +5: movl $0,(%esp); \ 23.346 + jmp 2b; \ 23.347 +6: pushl %ss; \ 23.348 + popl %ds; \ 23.349 + pushl %ss; \ 23.350 + popl %es; \ 23.351 + pushl $11; \ 23.352 + call do_exit; \ 23.353 +.previous; \ 23.354 +.section __ex_table,"a";\ 23.355 + .align 4; \ 23.356 + .long 1b,4b; \ 23.357 + .long 2b,5b; \ 23.358 + .long 3b,6b; \ 23.359 +.previous 23.360 + 23.361 +ENTRY(coprocessor_error) 23.362 + pushl $0 23.363 + pushl $ SYMBOL_NAME(do_coprocessor_error) 23.364 + jmp error_code 23.365 + 23.366 +ENTRY(simd_coprocessor_error) 23.367 + pushl $0 23.368 + pushl $ SYMBOL_NAME(do_simd_coprocessor_error) 23.369 + jmp error_code 23.370 + 23.371 +ENTRY(device_not_available) 23.372 + pushl $-1 # mark this as an int 23.373 + SAVE_ALL 23.374 + GET_CURRENT(%ebx) 23.375 + call SYMBOL_NAME(math_state_restore) 23.376 + jmp ret_from_exception 23.377 + 23.378 +ENTRY(debug) 23.379 + pushl $0 23.380 + pushl $ SYMBOL_NAME(do_debug) 23.381 + jmp error_code 23.382 + 23.383 +ENTRY(int3) 23.384 + pushl $0 23.385 + pushl $ SYMBOL_NAME(do_int3) 23.386 + jmp error_code 23.387 + 23.388 +ENTRY(overflow) 23.389 + pushl $0 23.390 + pushl $ SYMBOL_NAME(do_overflow) 23.391 + jmp error_code 23.392 + 23.393 +ENTRY(bounds) 23.394 + pushl $0 23.395 + pushl $ SYMBOL_NAME(do_bounds) 23.396 + jmp error_code 23.397 + 23.398 +ENTRY(invalid_op) 23.399 + pushl $0 23.400 + pushl $ SYMBOL_NAME(do_invalid_op) 23.401 + jmp error_code 23.402 + 23.403 +ENTRY(coprocessor_segment_overrun) 23.404 + pushl $0 23.405 + pushl $ SYMBOL_NAME(do_coprocessor_segment_overrun) 23.406 + jmp error_code 23.407 + 23.408 +ENTRY(double_fault) 23.409 + pushl $ SYMBOL_NAME(do_double_fault) 23.410 + jmp error_code 23.411 + 23.412 +ENTRY(invalid_TSS) 23.413 + pushl $ SYMBOL_NAME(do_invalid_TSS) 23.414 + jmp error_code 23.415 + 23.416 +ENTRY(segment_not_present) 23.417 + pushl $ SYMBOL_NAME(do_segment_not_present) 23.418 + jmp error_code 23.419 + 23.420 +ENTRY(stack_segment) 23.421 + pushl $ SYMBOL_NAME(do_stack_segment) 23.422 + jmp error_code 23.423 + 23.424 +ENTRY(general_protection) 23.425 + pushl $ SYMBOL_NAME(do_general_protection) 23.426 + jmp error_code 23.427 + 23.428 +ENTRY(alignment_check) 23.429 + pushl $ SYMBOL_NAME(do_alignment_check) 23.430 + jmp error_code 23.431 + 23.432 +#if defined(CONFIG_KDB) 23.433 +ENTRY(page_fault_mca) 23.434 + pushl %ecx 23.435 + pushl %edx 23.436 + pushl %eax 23.437 + movl $473,%ecx 23.438 + rdmsr 23.439 + andl $0xfffffffe,%eax /* Disable last branch recording */ 23.440 + wrmsr 23.441 + popl %eax 23.442 + popl %edx 23.443 + popl %ecx 23.444 + pushl $ SYMBOL_NAME(do_page_fault) 23.445 + jmp error_code 23.446 +#endif 23.447 + 23.448 +# This handler is special, because it gets an extra value on its stack, 23.449 +# which is the linear faulting address. 23.450 +ENTRY(page_fault) 23.451 + pushl %ds 23.452 + pushl %eax 23.453 + xorl %eax,%eax 23.454 + pushl %ebp 23.455 + pushl %edi 23.456 + pushl %esi 23.457 + pushl %edx 23.458 + decl %eax # eax = -1 23.459 + pushl %ecx 23.460 + pushl %ebx 23.461 + GET_CURRENT(%ebx) 23.462 + cld 23.463 + movl %es,%ecx 23.464 + movl ORIG_EAX(%esp), %esi # get the error code 23.465 + movl ES(%esp), %edi # get the faulting address 23.466 + movl %eax, ORIG_EAX(%esp) 23.467 + movl %ecx, ES(%esp) 23.468 + movl %esp,%edx 23.469 + pushl %edi # push the faulting address 23.470 + pushl %esi # push the error code 23.471 + pushl %edx # push the pt_regs pointer 23.472 + movl $(__KERNEL_DS),%edx 23.473 + movl %edx,%ds 23.474 + movl %edx,%es 23.475 + call SYMBOL_NAME(do_page_fault) 23.476 + addl $12,%esp 23.477 + jmp ret_from_exception 23.478 + 23.479 +ENTRY(machine_check) 23.480 + pushl $0 23.481 + pushl $ SYMBOL_NAME(do_machine_check) 23.482 + jmp error_code 23.483 + 23.484 +ENTRY(spurious_interrupt_bug) 23.485 + pushl $0 23.486 + pushl $ SYMBOL_NAME(do_spurious_interrupt_bug) 23.487 + jmp error_code 23.488 + 23.489 +.data 23.490 +ENTRY(sys_call_table) 23.491 + .long SYMBOL_NAME(sys_ni_syscall) /* 0 - old "setup()" system call*/ 23.492 + .long SYMBOL_NAME(sys_exit) 23.493 + .long SYMBOL_NAME(sys_fork) 23.494 + .long SYMBOL_NAME(sys_read) 23.495 + .long SYMBOL_NAME(sys_write) 23.496 + .long SYMBOL_NAME(sys_open) /* 5 */ 23.497 + .long SYMBOL_NAME(sys_close) 23.498 + .long SYMBOL_NAME(sys_waitpid) 23.499 + .long SYMBOL_NAME(sys_creat) 23.500 + .long SYMBOL_NAME(sys_link) 23.501 + .long SYMBOL_NAME(sys_unlink) /* 10 */ 23.502 + .long SYMBOL_NAME(sys_execve) 23.503 + .long SYMBOL_NAME(sys_chdir) 23.504 + .long SYMBOL_NAME(sys_time) 23.505 + .long SYMBOL_NAME(sys_mknod) 23.506 + .long SYMBOL_NAME(sys_chmod) /* 15 */ 23.507 + .long SYMBOL_NAME(sys_lchown16) 23.508 + .long SYMBOL_NAME(sys_ni_syscall) /* old break syscall holder */ 23.509 + .long SYMBOL_NAME(sys_stat) 23.510 + .long SYMBOL_NAME(sys_lseek) 23.511 + .long SYMBOL_NAME(sys_getpid) /* 20 */ 23.512 + .long SYMBOL_NAME(sys_mount) 23.513 + .long SYMBOL_NAME(sys_oldumount) 23.514 + .long SYMBOL_NAME(sys_setuid16) 23.515 + .long SYMBOL_NAME(sys_getuid16) 23.516 + .long SYMBOL_NAME(sys_stime) /* 25 */ 23.517 + .long SYMBOL_NAME(sys_ptrace) 23.518 + .long SYMBOL_NAME(sys_alarm) 23.519 + .long SYMBOL_NAME(sys_fstat) 23.520 + .long SYMBOL_NAME(sys_pause) 23.521 + .long SYMBOL_NAME(sys_utime) /* 30 */ 23.522 + .long SYMBOL_NAME(sys_ni_syscall) /* old stty syscall holder */ 23.523 + .long SYMBOL_NAME(sys_ni_syscall) /* old gtty syscall holder */ 23.524 + .long SYMBOL_NAME(sys_access) 23.525 + .long SYMBOL_NAME(sys_nice) 23.526 + .long SYMBOL_NAME(sys_ni_syscall) /* 35 */ /* old ftime syscall holder */ 23.527 + .long SYMBOL_NAME(sys_sync) 23.528 + .long SYMBOL_NAME(sys_kill) 23.529 + .long SYMBOL_NAME(sys_rename) 23.530 + .long SYMBOL_NAME(sys_mkdir) 23.531 + .long SYMBOL_NAME(sys_rmdir) /* 40 */ 23.532 + .long SYMBOL_NAME(sys_dup) 23.533 + .long SYMBOL_NAME(sys_pipe) 23.534 + .long SYMBOL_NAME(sys_times) 23.535 + .long SYMBOL_NAME(sys_ni_syscall) /* old prof syscall holder */ 23.536 + .long SYMBOL_NAME(sys_brk) /* 45 */ 23.537 + .long SYMBOL_NAME(sys_setgid16) 23.538 + .long SYMBOL_NAME(sys_getgid16) 23.539 + .long SYMBOL_NAME(sys_signal) 23.540 + .long SYMBOL_NAME(sys_geteuid16) 23.541 + .long SYMBOL_NAME(sys_getegid16) /* 50 */ 23.542 + .long SYMBOL_NAME(sys_acct) 23.543 + .long SYMBOL_NAME(sys_umount) /* recycled never used phys() */ 23.544 + .long SYMBOL_NAME(sys_ni_syscall) /* old lock syscall holder */ 23.545 + .long SYMBOL_NAME(sys_ioctl) 23.546 + .long SYMBOL_NAME(sys_fcntl) /* 55 */ 23.547 + .long SYMBOL_NAME(sys_ni_syscall) /* old mpx syscall holder */ 23.548 + .long SYMBOL_NAME(sys_setpgid) 23.549 + .long SYMBOL_NAME(sys_ni_syscall) /* old ulimit syscall holder */ 23.550 + .long SYMBOL_NAME(sys_olduname) 23.551 + .long SYMBOL_NAME(sys_umask) /* 60 */ 23.552 + .long SYMBOL_NAME(sys_chroot) 23.553 + .long SYMBOL_NAME(sys_ustat) 23.554 + .long SYMBOL_NAME(sys_dup2) 23.555 + .long SYMBOL_NAME(sys_getppid) 23.556 + .long SYMBOL_NAME(sys_getpgrp) /* 65 */ 23.557 + .long SYMBOL_NAME(sys_setsid) 23.558 + .long SYMBOL_NAME(sys_sigaction) 23.559 + .long SYMBOL_NAME(sys_sgetmask) 23.560 + .long SYMBOL_NAME(sys_ssetmask) 23.561 + .long SYMBOL_NAME(sys_setreuid16) /* 70 */ 23.562 + .long SYMBOL_NAME(sys_setregid16) 23.563 + .long SYMBOL_NAME(sys_sigsuspend) 23.564 + .long SYMBOL_NAME(sys_sigpending) 23.565 + .long SYMBOL_NAME(sys_sethostname) 23.566 + .long SYMBOL_NAME(sys_setrlimit) /* 75 */ 23.567 + .long SYMBOL_NAME(sys_old_getrlimit) 23.568 + .long SYMBOL_NAME(sys_getrusage) 23.569 + .long SYMBOL_NAME(sys_gettimeofday) 23.570 + .long SYMBOL_NAME(sys_settimeofday) 23.571 + .long SYMBOL_NAME(sys_getgroups16) /* 80 */ 23.572 + .long SYMBOL_NAME(sys_setgroups16) 23.573 + .long SYMBOL_NAME(old_select) 23.574 + .long SYMBOL_NAME(sys_symlink) 23.575 + .long SYMBOL_NAME(sys_lstat) 23.576 + .long SYMBOL_NAME(sys_readlink) /* 85 */ 23.577 + .long SYMBOL_NAME(sys_uselib) 23.578 + .long SYMBOL_NAME(sys_swapon) 23.579 + .long SYMBOL_NAME(sys_reboot) 23.580 + .long SYMBOL_NAME(old_readdir) 23.581 + .long SYMBOL_NAME(old_mmap) /* 90 */ 23.582 + .long SYMBOL_NAME(sys_munmap) 23.583 + .long SYMBOL_NAME(sys_truncate) 23.584 + .long SYMBOL_NAME(sys_ftruncate) 23.585 + .long SYMBOL_NAME(sys_fchmod) 23.586 + .long SYMBOL_NAME(sys_fchown16) /* 95 */ 23.587 + .long SYMBOL_NAME(sys_getpriority) 23.588 + .long SYMBOL_NAME(sys_setpriority) 23.589 + .long SYMBOL_NAME(sys_ni_syscall) /* old profil syscall holder */ 23.590 + .long SYMBOL_NAME(sys_statfs) 23.591 + .long SYMBOL_NAME(sys_fstatfs) /* 100 */ 23.592 + .long SYMBOL_NAME(sys_ioperm) 23.593 + .long SYMBOL_NAME(sys_socketcall) 23.594 + .long SYMBOL_NAME(sys_syslog) 23.595 + .long SYMBOL_NAME(sys_setitimer) 23.596 + .long SYMBOL_NAME(sys_getitimer) /* 105 */ 23.597 + .long SYMBOL_NAME(sys_newstat) 23.598 + .long SYMBOL_NAME(sys_newlstat) 23.599 + .long SYMBOL_NAME(sys_newfstat) 23.600 + .long SYMBOL_NAME(sys_uname) 23.601 + .long SYMBOL_NAME(sys_iopl) /* 110 */ 23.602 + .long SYMBOL_NAME(sys_vhangup) 23.603 + .long SYMBOL_NAME(sys_ni_syscall) /* old "idle" system call */ 23.604 + .long SYMBOL_NAME(sys_ni_syscall) /* was VM86 */ 23.605 + .long SYMBOL_NAME(sys_wait4) 23.606 + .long SYMBOL_NAME(sys_swapoff) /* 115 */ 23.607 + .long SYMBOL_NAME(sys_sysinfo) 23.608 + .long SYMBOL_NAME(sys_ipc) 23.609 + .long SYMBOL_NAME(sys_fsync) 23.610 + .long SYMBOL_NAME(sys_sigreturn) 23.611 + .long SYMBOL_NAME(sys_clone) /* 120 */ 23.612 + .long SYMBOL_NAME(sys_setdomainname) 23.613 + .long SYMBOL_NAME(sys_newuname) 23.614 + .long SYMBOL_NAME(sys_modify_ldt) 23.615 + .long SYMBOL_NAME(sys_adjtimex) 23.616 + .long SYMBOL_NAME(sys_mprotect) /* 125 */ 23.617 + .long SYMBOL_NAME(sys_sigprocmask) 23.618 + .long SYMBOL_NAME(sys_create_module) 23.619 + .long SYMBOL_NAME(sys_init_module) 23.620 + .long SYMBOL_NAME(sys_delete_module) 23.621 + .long SYMBOL_NAME(sys_get_kernel_syms) /* 130 */ 23.622 + .long SYMBOL_NAME(sys_quotactl) 23.623 + .long SYMBOL_NAME(sys_getpgid) 23.624 + .long SYMBOL_NAME(sys_fchdir) 23.625 + .long SYMBOL_NAME(sys_bdflush) 23.626 + .long SYMBOL_NAME(sys_sysfs) /* 135 */ 23.627 + .long SYMBOL_NAME(sys_personality) 23.628 + .long SYMBOL_NAME(sys_ni_syscall) /* for afs_syscall */ 23.629 + .long SYMBOL_NAME(sys_setfsuid16) 23.630 + .long SYMBOL_NAME(sys_setfsgid16) 23.631 + .long SYMBOL_NAME(sys_llseek) /* 140 */ 23.632 + .long SYMBOL_NAME(sys_getdents) 23.633 + .long SYMBOL_NAME(sys_select) 23.634 + .long SYMBOL_NAME(sys_flock) 23.635 + .long SYMBOL_NAME(sys_msync) 23.636 + .long SYMBOL_NAME(sys_readv) /* 145 */ 23.637 + .long SYMBOL_NAME(sys_writev) 23.638 + .long SYMBOL_NAME(sys_getsid) 23.639 + .long SYMBOL_NAME(sys_fdatasync) 23.640 + .long SYMBOL_NAME(sys_sysctl) 23.641 + .long SYMBOL_NAME(sys_mlock) /* 150 */ 23.642 + .long SYMBOL_NAME(sys_munlock) 23.643 + .long SYMBOL_NAME(sys_mlockall) 23.644 + .long SYMBOL_NAME(sys_munlockall) 23.645 + .long SYMBOL_NAME(sys_sched_setparam) 23.646 + .long SYMBOL_NAME(sys_sched_getparam) /* 155 */ 23.647 + .long SYMBOL_NAME(sys_sched_setscheduler) 23.648 + .long SYMBOL_NAME(sys_sched_getscheduler) 23.649 + .long SYMBOL_NAME(sys_sched_yield) 23.650 + .long SYMBOL_NAME(sys_sched_get_priority_max) 23.651 + .long SYMBOL_NAME(sys_sched_get_priority_min) /* 160 */ 23.652 + .long SYMBOL_NAME(sys_sched_rr_get_interval) 23.653 + .long SYMBOL_NAME(sys_nanosleep) 23.654 + .long SYMBOL_NAME(sys_mremap) 23.655 + .long SYMBOL_NAME(sys_setresuid16) 23.656 + .long SYMBOL_NAME(sys_getresuid16) /* 165 */ 23.657 + .long SYMBOL_NAME(sys_ni_syscall) /* was VM86 */ 23.658 + .long SYMBOL_NAME(sys_query_module) 23.659 + .long SYMBOL_NAME(sys_poll) 23.660 + .long SYMBOL_NAME(sys_nfsservctl) 23.661 + .long SYMBOL_NAME(sys_setresgid16) /* 170 */ 23.662 + .long SYMBOL_NAME(sys_getresgid16) 23.663 + .long SYMBOL_NAME(sys_prctl) 23.664 + .long SYMBOL_NAME(sys_rt_sigreturn) 23.665 + .long SYMBOL_NAME(sys_rt_sigaction) 23.666 + .long SYMBOL_NAME(sys_rt_sigprocmask) /* 175 */ 23.667 + .long SYMBOL_NAME(sys_rt_sigpending) 23.668 + .long SYMBOL_NAME(sys_rt_sigtimedwait) 23.669 + .long SYMBOL_NAME(sys_rt_sigqueueinfo) 23.670 + .long SYMBOL_NAME(sys_rt_sigsuspend) 23.671 + .long SYMBOL_NAME(sys_pread) /* 180 */ 23.672 + .long SYMBOL_NAME(sys_pwrite) 23.673 + .long SYMBOL_NAME(sys_chown16) 23.674 + .long SYMBOL_NAME(sys_getcwd) 23.675 + .long SYMBOL_NAME(sys_capget) 23.676 + .long SYMBOL_NAME(sys_capset) /* 185 */ 23.677 + .long SYMBOL_NAME(sys_sigaltstack) 23.678 + .long SYMBOL_NAME(sys_sendfile) 23.679 + .long SYMBOL_NAME(sys_ni_syscall) /* streams1 */ 23.680 + .long SYMBOL_NAME(sys_ni_syscall) /* streams2 */ 23.681 + .long SYMBOL_NAME(sys_vfork) /* 190 */ 23.682 + .long SYMBOL_NAME(sys_getrlimit) 23.683 + .long SYMBOL_NAME(sys_mmap2) 23.684 + .long SYMBOL_NAME(sys_truncate64) 23.685 + .long SYMBOL_NAME(sys_ftruncate64) 23.686 + .long SYMBOL_NAME(sys_stat64) /* 195 */ 23.687 + .long SYMBOL_NAME(sys_lstat64) 23.688 + .long SYMBOL_NAME(sys_fstat64) 23.689 + .long SYMBOL_NAME(sys_lchown) 23.690 + .long SYMBOL_NAME(sys_getuid) 23.691 + .long SYMBOL_NAME(sys_getgid) /* 200 */ 23.692 + .long SYMBOL_NAME(sys_geteuid) 23.693 + .long SYMBOL_NAME(sys_getegid) 23.694 + .long SYMBOL_NAME(sys_setreuid) 23.695 + .long SYMBOL_NAME(sys_setregid) 23.696 + .long SYMBOL_NAME(sys_getgroups) /* 205 */ 23.697 + .long SYMBOL_NAME(sys_setgroups) 23.698 + .long SYMBOL_NAME(sys_fchown) 23.699 + .long SYMBOL_NAME(sys_setresuid) 23.700 + .long SYMBOL_NAME(sys_getresuid) 23.701 + .long SYMBOL_NAME(sys_setresgid) /* 210 */ 23.702 + .long SYMBOL_NAME(sys_getresgid) 23.703 + .long SYMBOL_NAME(sys_chown) 23.704 + .long SYMBOL_NAME(sys_setuid) 23.705 + .long SYMBOL_NAME(sys_setgid) 23.706 + .long SYMBOL_NAME(sys_setfsuid) /* 215 */ 23.707 + .long SYMBOL_NAME(sys_setfsgid) 23.708 + .long SYMBOL_NAME(sys_pivot_root) 23.709 + .long SYMBOL_NAME(sys_mincore) 23.710 + .long SYMBOL_NAME(sys_madvise) 23.711 + .long SYMBOL_NAME(sys_getdents64) /* 220 */ 23.712 + .long SYMBOL_NAME(sys_fcntl64) 23.713 + .long SYMBOL_NAME(sys_ni_syscall) /* reserved for TUX */ 23.714 + .long SYMBOL_NAME(sys_ni_syscall) /* Reserved for Security */ 23.715 + .long SYMBOL_NAME(sys_gettid) 23.716 + .long SYMBOL_NAME(sys_readahead) /* 225 */ 23.717 + 23.718 + .rept NR_syscalls-(.-sys_call_table)/4 23.719 + .long SYMBOL_NAME(sys_ni_syscall) 23.720 + .endr
24.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 24.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/kernel/head.S Mon Feb 24 16:55:07 2003 +0000 24.3 @@ -0,0 +1,67 @@ 24.4 + 24.5 +.text 24.6 +#include <linux/config.h> 24.7 +#include <linux/threads.h> 24.8 +#include <linux/linkage.h> 24.9 +#include <asm/segment.h> 24.10 +#include <asm/page.h> 24.11 +#include <asm/pgtable.h> 24.12 +#include <asm/desc.h> 24.13 + 24.14 +/* Offsets in start_info structure */ 24.15 +#define SHARED_INFO 4 24.16 +#define MOD_START 12 24.17 +#define MOD_LEN 16 24.18 + 24.19 +startup_32: 24.20 + cld 24.21 + 24.22 + lss stack_start,%esp 24.23 + 24.24 + /* Copy initrd somewhere safe before it's clobbered by BSS. */ 24.25 + mov MOD_LEN(%esi),%ecx 24.26 + shr $2,%ecx 24.27 + jz 2f /* bail from copy loop if no initrd */ 24.28 + mov $SYMBOL_NAME(_end),%edi 24.29 + add MOD_LEN(%esi),%edi 24.30 + mov MOD_START(%esi),%eax 24.31 + add MOD_LEN(%esi),%eax 24.32 +1: sub $4,%eax 24.33 + sub $4,%edi 24.34 + mov (%eax),%ebx 24.35 + mov %ebx,(%edi) 24.36 + loop 1b 24.37 + mov %edi,MOD_START(%esi) 24.38 + 24.39 + /* Clear BSS first so that there are no surprises... */ 24.40 +2: xorl %eax,%eax 24.41 + movl $SYMBOL_NAME(__bss_start),%edi 24.42 + movl $SYMBOL_NAME(_end),%ecx 24.43 + subl %edi,%ecx 24.44 + rep stosb 24.45 + 24.46 + /* Copy the necessary stuff from start_info structure. */ 24.47 + /* We need to copy shared_info early, so that sti/cli work */ 24.48 + mov SHARED_INFO(%esi),%eax 24.49 + mov %eax,SYMBOL_NAME(HYPERVISOR_shared_info) 24.50 + mov $SYMBOL_NAME(start_info_union),%edi 24.51 + mov $128,%ecx 24.52 + rep movsl 24.53 + 24.54 + jmp SYMBOL_NAME(start_kernel) 24.55 + 24.56 +ENTRY(stack_start) 24.57 + .long SYMBOL_NAME(init_task_union)+8192, __KERNEL_DS 24.58 + 24.59 +.org 0x1000 24.60 +ENTRY(empty_zero_page) 24.61 + 24.62 +.org 0x2000 24.63 +ENTRY(cpu0_pte_quicklist) 24.64 + 24.65 +.org 0x2400 24.66 +ENTRY(cpu0_pgd_quicklist) 24.67 + 24.68 +.org 0x2800 24.69 +ENTRY(stext) 24.70 +ENTRY(_stext)
25.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 25.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/kernel/hypervisor.c Mon Feb 24 16:55:07 2003 +0000 25.3 @@ -0,0 +1,118 @@ 25.4 +/****************************************************************************** 25.5 + * hypervisor.c 25.6 + * 25.7 + * Communication to/from hypervisor. 25.8 + * 25.9 + * Copyright (c) 2002, K A Fraser 25.10 + */ 25.11 + 25.12 +#include <linux/config.h> 25.13 +#include <asm/atomic.h> 25.14 +#include <linux/irq.h> 25.15 +#include <asm/hypervisor.h> 25.16 +#include <asm/system.h> 25.17 +#include <asm/ptrace.h> 25.18 + 25.19 +static unsigned long event_mask = 0; 25.20 + 25.21 +void frobb(void) {} 25.22 + 25.23 +void do_hypervisor_callback(struct pt_regs *regs) 25.24 +{ 25.25 + unsigned long events, flags; 25.26 + shared_info_t *shared = HYPERVISOR_shared_info; 25.27 + 25.28 + do { 25.29 + /* Specialised local_irq_save(). */ 25.30 + flags = shared->events_enable; 25.31 + shared->events_enable = 0; 25.32 + barrier(); 25.33 + 25.34 + events = xchg(&shared->events, 0); 25.35 + events &= event_mask; 25.36 + 25.37 + __asm__ __volatile__ ( 25.38 + " push %1 ;" 25.39 + " sub $4,%%esp ;" 25.40 + " jmp 2f ;" 25.41 + "1: btrl %%eax,%0 ;" /* clear bit */ 25.42 + " mov %%eax,(%%esp) ;" 25.43 + " call do_IRQ ;" /* do_IRQ(event) */ 25.44 + "2: bsfl %0,%%eax ;" /* %eax == bit # */ 25.45 + " jnz 1b ;" 25.46 + " add $8,%%esp ;" 25.47 + /* we use %ebx because it is callee-saved */ 25.48 + : : "b" (events), "r" (regs) 25.49 + /* clobbered by callback function calls */ 25.50 + : "eax", "ecx", "edx", "memory" ); 25.51 + 25.52 + /* Specialised local_irq_restore(). */ 25.53 + shared->events_enable = flags; 25.54 + barrier(); 25.55 + } 25.56 + while ( shared->events ); 25.57 +} 25.58 + 25.59 + 25.60 + 25.61 +/* 25.62 + * Define interface to generic handling in irq.c 25.63 + */ 25.64 + 25.65 +static unsigned int startup_hypervisor_event(unsigned int irq) 25.66 +{ 25.67 + set_bit(irq, &event_mask); 25.68 + return 0; 25.69 +} 25.70 + 25.71 +static void shutdown_hypervisor_event(unsigned int irq) 25.72 +{ 25.73 + clear_bit(irq, &event_mask); 25.74 +} 25.75 + 25.76 +static void enable_hypervisor_event(unsigned int irq) 25.77 +{ 25.78 + set_bit(irq, &event_mask); 25.79 +} 25.80 + 25.81 +static void disable_hypervisor_event(unsigned int irq) 25.82 +{ 25.83 + clear_bit(irq, &event_mask); 25.84 +} 25.85 + 25.86 +static void ack_hypervisor_event(unsigned int irq) 25.87 +{ 25.88 + if ( !(event_mask & (1<<irq)) ) 25.89 + { 25.90 + printk("Unexpected hypervisor event %d\n", irq); 25.91 + atomic_inc(&irq_err_count); 25.92 + } 25.93 +} 25.94 + 25.95 +static void end_hypervisor_event(unsigned int irq) 25.96 +{ 25.97 +} 25.98 + 25.99 +static struct hw_interrupt_type hypervisor_irq_type = { 25.100 + "Hypervisor-event", 25.101 + startup_hypervisor_event, 25.102 + shutdown_hypervisor_event, 25.103 + enable_hypervisor_event, 25.104 + disable_hypervisor_event, 25.105 + ack_hypervisor_event, 25.106 + end_hypervisor_event, 25.107 + NULL 25.108 +}; 25.109 + 25.110 +void __init init_IRQ(void) 25.111 +{ 25.112 + int i; 25.113 + 25.114 + for ( i = 0; i < NR_IRQS; i++ ) 25.115 + { 25.116 + irq_desc[i].status = IRQ_DISABLED; 25.117 + irq_desc[i].action = 0; 25.118 + irq_desc[i].depth = 1; 25.119 + irq_desc[i].handler = &hypervisor_irq_type; 25.120 + } 25.121 +}
26.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 26.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/kernel/i386_ksyms.c Mon Feb 24 16:55:07 2003 +0000 26.3 @@ -0,0 +1,144 @@ 26.4 +#include <linux/config.h> 26.5 +#include <linux/module.h> 26.6 +#include <linux/smp.h> 26.7 +#include <linux/user.h> 26.8 +#include <linux/elfcore.h> 26.9 +#include <linux/mca.h> 26.10 +#include <linux/sched.h> 26.11 +#include <linux/in6.h> 26.12 +#include <linux/interrupt.h> 26.13 +#include <linux/smp_lock.h> 26.14 +#include <linux/pm.h> 26.15 +#include <linux/pci.h> 26.16 +#include <linux/apm_bios.h> 26.17 +#include <linux/kernel.h> 26.18 +#include <linux/string.h> 26.19 +#include <linux/tty.h> 26.20 + 26.21 +#include <asm/semaphore.h> 26.22 +#include <asm/processor.h> 26.23 +#include <asm/i387.h> 26.24 +#include <asm/uaccess.h> 26.25 +#include <asm/checksum.h> 26.26 +#include <asm/io.h> 26.27 +#include <asm/hardirq.h> 26.28 +#include <asm/delay.h> 26.29 +#include <asm/irq.h> 26.30 +#include <asm/mmx.h> 26.31 +#include <asm/desc.h> 26.32 +#include <asm/pgtable.h> 26.33 +#include <asm/pgalloc.h> 26.34 + 26.35 +extern void dump_thread(struct pt_regs *, struct user *); 26.36 +extern spinlock_t rtc_lock; 26.37 + 26.38 +#ifdef CONFIG_SMP 26.39 +extern void FASTCALL( __write_lock_failed(rwlock_t *rw)); 26.40 +extern void FASTCALL( __read_lock_failed(rwlock_t *rw)); 26.41 +#endif 26.42 + 26.43 +#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_HD) || defined(CONFIG_BLK_DEV_IDE_MODULE) || defined(CONFIG_BLK_DEV_HD_MODULE) 26.44 +extern struct drive_info_struct drive_info; 26.45 +EXPORT_SYMBOL(drive_info); 26.46 +#endif 26.47 + 26.48 +//extern unsigned long get_cmos_time(void); 26.49 + 26.50 +/* platform dependent support */ 26.51 +EXPORT_SYMBOL(boot_cpu_data); 26.52 +EXPORT_SYMBOL(MCA_bus); 26.53 +EXPORT_SYMBOL(__verify_write); 26.54 +EXPORT_SYMBOL(dump_thread); 26.55 +EXPORT_SYMBOL(dump_fpu); 26.56 +EXPORT_SYMBOL(dump_extended_fpu); 26.57 +EXPORT_SYMBOL(enable_irq); 26.58 +EXPORT_SYMBOL(disable_irq); 26.59 +EXPORT_SYMBOL(disable_irq_nosync); 26.60 +EXPORT_SYMBOL(probe_irq_mask); 26.61 +EXPORT_SYMBOL(kernel_thread); 26.62 +EXPORT_SYMBOL(pm_idle); 26.63 +EXPORT_SYMBOL(pm_power_off); 26.64 +//EXPORT_SYMBOL(get_cmos_time); 26.65 +EXPORT_SYMBOL(apm_info); 26.66 + 26.67 +#ifdef CONFIG_DEBUG_IOVIRT 26.68 +EXPORT_SYMBOL(__io_virt_debug); 26.69 +#endif 26.70 + 26.71 +EXPORT_SYMBOL_NOVERS(__down_failed); 26.72 +EXPORT_SYMBOL_NOVERS(__down_failed_interruptible); 26.73 +EXPORT_SYMBOL_NOVERS(__down_failed_trylock); 26.74 +EXPORT_SYMBOL_NOVERS(__up_wakeup); 26.75 +/* Networking helper routines. */ 26.76 +EXPORT_SYMBOL(csum_partial_copy_generic); 26.77 +/* Delay loops */ 26.78 +EXPORT_SYMBOL(__udelay); 26.79 +EXPORT_SYMBOL(__delay); 26.80 +EXPORT_SYMBOL(__const_udelay); 26.81 + 26.82 +EXPORT_SYMBOL_NOVERS(__get_user_1); 26.83 +EXPORT_SYMBOL_NOVERS(__get_user_2); 26.84 +EXPORT_SYMBOL_NOVERS(__get_user_4); 26.85 + 26.86 +EXPORT_SYMBOL(strtok); 26.87 +EXPORT_SYMBOL(strpbrk); 26.88 +EXPORT_SYMBOL(simple_strtol); 26.89 +EXPORT_SYMBOL(strstr); 26.90 + 26.91 +EXPORT_SYMBOL(strncpy_from_user); 26.92 +EXPORT_SYMBOL(__strncpy_from_user); 26.93 +EXPORT_SYMBOL(clear_user); 26.94 +EXPORT_SYMBOL(__clear_user); 26.95 +EXPORT_SYMBOL(__generic_copy_from_user); 26.96 +EXPORT_SYMBOL(__generic_copy_to_user); 26.97 +EXPORT_SYMBOL(strnlen_user); 26.98 + 26.99 +#ifdef CONFIG_X86_USE_3DNOW 26.100 +EXPORT_SYMBOL(_mmx_memcpy); 26.101 +EXPORT_SYMBOL(mmx_clear_page); 26.102 +EXPORT_SYMBOL(mmx_copy_page); 26.103 +#endif 26.104 + 26.105 +#ifdef CONFIG_SMP 26.106 +EXPORT_SYMBOL(cpu_data); 26.107 +EXPORT_SYMBOL(kernel_flag); 26.108 +EXPORT_SYMBOL(smp_num_cpus); 26.109 +EXPORT_SYMBOL(cpu_online_map); 26.110 +EXPORT_SYMBOL_NOVERS(__write_lock_failed); 26.111 +EXPORT_SYMBOL_NOVERS(__read_lock_failed); 26.112 + 26.113 +/* Global SMP irq stuff */ 26.114 +EXPORT_SYMBOL(synchronize_irq); 26.115 +EXPORT_SYMBOL(global_irq_holder); 26.116 +EXPORT_SYMBOL(__global_cli); 26.117 +EXPORT_SYMBOL(__global_sti); 26.118 +EXPORT_SYMBOL(__global_save_flags); 26.119 +EXPORT_SYMBOL(__global_restore_flags); 26.120 +EXPORT_SYMBOL(smp_call_function); 26.121 + 26.122 +/* TLB flushing */ 26.123 +EXPORT_SYMBOL(flush_tlb_page); 26.124 +#endif 26.125 + 26.126 +#ifdef CONFIG_VT 26.127 +EXPORT_SYMBOL(screen_info); 26.128 +#endif 26.129 + 26.130 +EXPORT_SYMBOL(get_wchan); 26.131 + 26.132 +EXPORT_SYMBOL(rtc_lock); 26.133 + 26.134 +#undef memcpy 26.135 +#undef memset 26.136 +extern void * memset(void *,int,__kernel_size_t); 26.137 +extern void * memcpy(void *,const void *,__kernel_size_t); 26.138 +EXPORT_SYMBOL_NOVERS(memcpy); 26.139 +EXPORT_SYMBOL_NOVERS(memset); 26.140 + 26.141 +#ifdef CONFIG_HAVE_DEC_LOCK 26.142 +EXPORT_SYMBOL(atomic_dec_and_lock); 26.143 +#endif 26.144 + 26.145 +#ifdef CONFIG_DEBUG_BUGVERBOSE 26.146 +EXPORT_SYMBOL(do_BUG); 26.147 +#endif
27.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 27.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/kernel/i387.c Mon Feb 24 16:55:07 2003 +0000 27.3 @@ -0,0 +1,518 @@ 27.4 +/* 27.5 + * linux/arch/i386/kernel/i387.c 27.6 + * 27.7 + * Copyright (C) 1994 Linus Torvalds 27.8 + * 27.9 + * Pentium III FXSR, SSE support 27.10 + * General FPU state handling cleanups 27.11 + * Gareth Hughes <gareth@valinux.com>, May 2000 27.12 + */ 27.13 + 27.14 +#include <linux/config.h> 27.15 +#include <linux/sched.h> 27.16 +#include <asm/processor.h> 27.17 +#include <asm/i387.h> 27.18 +#include <asm/math_emu.h> 27.19 +#include <asm/sigcontext.h> 27.20 +#include <asm/user.h> 27.21 +#include <asm/ptrace.h> 27.22 +#include <asm/uaccess.h> 27.23 + 27.24 +#define HAVE_HWFP 1 27.25 + 27.26 +/* 27.27 + * The _current_ task is using the FPU for the first time 27.28 + * so initialize it and set the mxcsr to its default 27.29 + * value at reset if we support XMM instructions and then 27.30 + * remeber the current task has used the FPU. 27.31 + */ 27.32 +void init_fpu(void) 27.33 +{ 27.34 + __asm__("fninit"); 27.35 + if ( cpu_has_xmm ) 27.36 + load_mxcsr(0x1f80); 27.37 + 27.38 + current->used_math = 1; 27.39 +} 27.40 + 27.41 +/* 27.42 + * FPU lazy state save handling. 27.43 + */ 27.44 + 27.45 +static inline void __save_init_fpu( struct task_struct *tsk ) 27.46 +{ 27.47 + if ( cpu_has_fxsr ) { 27.48 + asm volatile( "fxsave %0 ; fnclex" 27.49 + : "=m" (tsk->thread.i387.fxsave) ); 27.50 + } else { 27.51 + asm volatile( "fnsave %0 ; fwait" 27.52 + : "=m" (tsk->thread.i387.fsave) ); 27.53 + } 27.54 + tsk->flags &= ~PF_USEDFPU; 27.55 +} 27.56 + 27.57 +void save_init_fpu( struct task_struct *tsk ) 27.58 +{ 27.59 + __save_init_fpu(tsk); 27.60 + stts(); 27.61 +} 27.62 + 27.63 +void kernel_fpu_begin(void) 27.64 +{ 27.65 + struct task_struct *tsk = current; 27.66 + 27.67 + if (tsk->flags & PF_USEDFPU) { 27.68 + __save_init_fpu(tsk); 27.69 + return; 27.70 + } 27.71 + clts(); 27.72 +} 27.73 + 27.74 +void restore_fpu( struct task_struct *tsk ) 27.75 +{ 27.76 + if ( cpu_has_fxsr ) { 27.77 + asm volatile( "fxrstor %0" 27.78 + : : "m" (tsk->thread.i387.fxsave) ); 27.79 + } else { 27.80 + asm volatile( "frstor %0" 27.81 + : : "m" (tsk->thread.i387.fsave) ); 27.82 + } 27.83 +} 27.84 + 27.85 +/* 27.86 + * FPU tag word conversions. 27.87 + */ 27.88 + 27.89 +static inline unsigned short twd_i387_to_fxsr( unsigned short twd ) 27.90 +{ 27.91 + unsigned int tmp; /* to avoid 16 bit prefixes in the code */ 27.92 + 27.93 + /* Transform each pair of bits into 01 (valid) or 00 (empty) */ 27.94 + tmp = ~twd; 27.95 + tmp = (tmp | (tmp>>1)) & 0x5555; /* 0V0V0V0V0V0V0V0V */ 27.96 + /* and move the valid bits to the lower byte. */ 27.97 + tmp = (tmp | (tmp >> 1)) & 0x3333; /* 00VV00VV00VV00VV */ 27.98 + tmp = (tmp | (tmp >> 2)) & 0x0f0f; /* 0000VVVV0000VVVV */ 27.99 + tmp = (tmp | (tmp >> 4)) & 0x00ff; /* 00000000VVVVVVVV */ 27.100 + return tmp; 27.101 +} 27.102 + 27.103 +static inline unsigned long twd_fxsr_to_i387( struct i387_fxsave_struct *fxsave ) 27.104 +{ 27.105 + struct _fpxreg *st = NULL; 27.106 + unsigned long twd = (unsigned long) fxsave->twd; 27.107 + unsigned long tag; 27.108 + unsigned long ret = 0xffff0000; 27.109 + int i; 27.110 + 27.111 +#define FPREG_ADDR(f, n) ((char *)&(f)->st_space + (n) * 16); 27.112 + 27.113 + for ( i = 0 ; i < 8 ; i++ ) { 27.114 + if ( twd & 0x1 ) { 27.115 + st = (struct _fpxreg *) FPREG_ADDR( fxsave, i ); 27.116 + 27.117 + switch ( st->exponent & 0x7fff ) { 27.118 + case 0x7fff: 27.119 + tag = 2; /* Special */ 27.120 + break; 27.121 + case 0x0000: 27.122 + if ( !st->significand[0] && 27.123 + !st->significand[1] && 27.124 + !st->significand[2] && 27.125 + !st->significand[3] ) { 27.126 + tag = 1; /* Zero */ 27.127 + } else { 27.128 + tag = 2; /* Special */ 27.129 + } 27.130 + break; 27.131 + default: 27.132 + if ( st->significand[3] & 0x8000 ) { 27.133 + tag = 0; /* Valid */ 27.134 + } else { 27.135 + tag = 2; /* Special */ 27.136 + } 27.137 + break; 27.138 + } 27.139 + } else { 27.140 + tag = 3; /* Empty */ 27.141 + } 27.142 + ret |= (tag << (2 * i)); 27.143 + twd = twd >> 1; 27.144 + } 27.145 + return ret; 27.146 +} 27.147 + 27.148 +/* 27.149 + * FPU state interaction. 27.150 + */ 27.151 + 27.152 +unsigned short get_fpu_cwd( struct task_struct *tsk ) 27.153 +{ 27.154 + if ( cpu_has_fxsr ) { 27.155 + return tsk->thread.i387.fxsave.cwd; 27.156 + } else { 27.157 + return (unsigned short)tsk->thread.i387.fsave.cwd; 27.158 + } 27.159 +} 27.160 + 27.161 +unsigned short get_fpu_swd( struct task_struct *tsk ) 27.162 +{ 27.163 + if ( cpu_has_fxsr ) { 27.164 + return tsk->thread.i387.fxsave.swd; 27.165 + } else { 27.166 + return (unsigned short)tsk->thread.i387.fsave.swd; 27.167 + } 27.168 +} 27.169 + 27.170 +unsigned short get_fpu_twd( struct task_struct *tsk ) 27.171 +{ 27.172 + if ( cpu_has_fxsr ) { 27.173 + return tsk->thread.i387.fxsave.twd; 27.174 + } else { 27.175 + return (unsigned short)tsk->thread.i387.fsave.twd; 27.176 + } 27.177 +} 27.178 + 27.179 +unsigned short get_fpu_mxcsr( struct task_struct *tsk ) 27.180 +{ 27.181 + if ( cpu_has_xmm ) { 27.182 + return tsk->thread.i387.fxsave.mxcsr; 27.183 + } else { 27.184 + return 0x1f80; 27.185 + } 27.186 +} 27.187 + 27.188 +void set_fpu_cwd( struct task_struct *tsk, unsigned short cwd ) 27.189 +{ 27.190 + if ( cpu_has_fxsr ) { 27.191 + tsk->thread.i387.fxsave.cwd = cwd; 27.192 + } else { 27.193 + tsk->thread.i387.fsave.cwd = ((long)cwd | 0xffff0000); 27.194 + } 27.195 +} 27.196 + 27.197 +void set_fpu_swd( struct task_struct *tsk, unsigned short swd ) 27.198 +{ 27.199 + if ( cpu_has_fxsr ) { 27.200 + tsk->thread.i387.fxsave.swd = swd; 27.201 + } else { 27.202 + tsk->thread.i387.fsave.swd = ((long)swd | 0xffff0000); 27.203 + } 27.204 +} 27.205 + 27.206 +void set_fpu_twd( struct task_struct *tsk, unsigned short twd ) 27.207 +{ 27.208 + if ( cpu_has_fxsr ) { 27.209 + tsk->thread.i387.fxsave.twd = twd_i387_to_fxsr(twd); 27.210 + } else { 27.211 + tsk->thread.i387.fsave.twd = ((long)twd | 0xffff0000); 27.212 + } 27.213 +} 27.214 + 27.215 +void set_fpu_mxcsr( struct task_struct *tsk, unsigned short mxcsr ) 27.216 +{ 27.217 + if ( cpu_has_xmm ) { 27.218 + tsk->thread.i387.fxsave.mxcsr = (mxcsr & 0xffbf); 27.219 + } 27.220 +} 27.221 + 27.222 +/* 27.223 + * FXSR floating point environment conversions. 27.224 + */ 27.225 + 27.226 +static inline int convert_fxsr_to_user( struct _fpstate *buf, 27.227 + struct i387_fxsave_struct *fxsave ) 27.228 +{ 27.229 + unsigned long env[7]; 27.230 + struct _fpreg *to; 27.231 + struct _fpxreg *from; 27.232 + int i; 27.233 + 27.234 + env[0] = (unsigned long)fxsave->cwd | 0xffff0000; 27.235 + env[1] = (unsigned long)fxsave->swd | 0xffff0000; 27.236 + env[2] = twd_fxsr_to_i387(fxsave); 27.237 + env[3] = fxsave->fip; 27.238 + env[4] = fxsave->fcs | ((unsigned long)fxsave->fop << 16); 27.239 + env[5] = fxsave->foo; 27.240 + env[6] = fxsave->fos; 27.241 + 27.242 + if ( __copy_to_user( buf, env, 7 * sizeof(unsigned long) ) ) 27.243 + return 1; 27.244 + 27.245 + to = &buf->_st[0]; 27.246 + from = (struct _fpxreg *) &fxsave->st_space[0]; 27.247 + for ( i = 0 ; i < 8 ; i++, to++, from++ ) { 27.248 + if ( __copy_to_user( to, from, sizeof(*to) ) ) 27.249 + return 1; 27.250 + } 27.251 + return 0; 27.252 +} 27.253 + 27.254 +static inline int convert_fxsr_from_user( struct i387_fxsave_struct *fxsave, 27.255 + struct _fpstate *buf ) 27.256 +{ 27.257 + unsigned long env[7]; 27.258 + struct _fpxreg *to; 27.259 + struct _fpreg *from; 27.260 + int i; 27.261 + 27.262 + if ( __copy_from_user( env, buf, 7 * sizeof(long) ) ) 27.263 + return 1; 27.264 + 27.265 + fxsave->cwd = (unsigned short)(env[0] & 0xffff); 27.266 + fxsave->swd = (unsigned short)(env[1] & 0xffff); 27.267 + fxsave->twd = twd_i387_to_fxsr((unsigned short)(env[2] & 0xffff)); 27.268 + fxsave->fip = env[3]; 27.269 + fxsave->fop = (unsigned short)((env[4] & 0xffff0000) >> 16); 27.270 + fxsave->fcs = (env[4] & 0xffff); 27.271 + fxsave->foo = env[5]; 27.272 + fxsave->fos = env[6]; 27.273 + 27.274 + to = (struct _fpxreg *) &fxsave->st_space[0]; 27.275 + from = &buf->_st[0]; 27.276 + for ( i = 0 ; i < 8 ; i++, to++, from++ ) { 27.277 + if ( __copy_from_user( to, from, sizeof(*from) ) ) 27.278 + return 1; 27.279 + } 27.280 + return 0; 27.281 +} 27.282 + 27.283 +/* 27.284 + * Signal frame handlers. 27.285 + */ 27.286 + 27.287 +static inline int save_i387_fsave( struct _fpstate *buf ) 27.288 +{ 27.289 + struct task_struct *tsk = current; 27.290 + 27.291 + unlazy_fpu( tsk ); 27.292 + tsk->thread.i387.fsave.status = tsk->thread.i387.fsave.swd; 27.293 + if ( __copy_to_user( buf, &tsk->thread.i387.fsave, 27.294 + sizeof(struct i387_fsave_struct) ) ) 27.295 + return -1; 27.296 + return 1; 27.297 +} 27.298 + 27.299 +static inline int save_i387_fxsave( struct _fpstate *buf ) 27.300 +{ 27.301 + struct task_struct *tsk = current; 27.302 + int err = 0; 27.303 + 27.304 + unlazy_fpu( tsk ); 27.305 + 27.306 + if ( convert_fxsr_to_user( buf, &tsk->thread.i387.fxsave ) ) 27.307 + return -1; 27.308 + 27.309 + err |= __put_user( tsk->thread.i387.fxsave.swd, &buf->status ); 27.310 + err |= __put_user( X86_FXSR_MAGIC, &buf->magic ); 27.311 + if ( err ) 27.312 + return -1; 27.313 + 27.314 + if ( __copy_to_user( &buf->_fxsr_env[0], &tsk->thread.i387.fxsave, 27.315 + sizeof(struct i387_fxsave_struct) ) ) 27.316 + return -1; 27.317 + return 1; 27.318 +} 27.319 + 27.320 +int save_i387( struct _fpstate *buf ) 27.321 +{ 27.322 + if ( !current->used_math ) 27.323 + return 0; 27.324 + 27.325 + /* This will cause a "finit" to be triggered by the next 27.326 + * attempted FPU operation by the 'current' process. 27.327 + */ 27.328 + current->used_math = 0; 27.329 + 27.330 + if ( HAVE_HWFP ) { 27.331 + if ( cpu_has_fxsr ) { 27.332 + return save_i387_fxsave( buf ); 27.333 + } else { 27.334 + return save_i387_fsave( buf ); 27.335 + } 27.336 + } else { 27.337 + return save_i387_soft( ¤t->thread.i387.soft, buf ); 27.338 + } 27.339 +} 27.340 + 27.341 +static inline int restore_i387_fsave( struct _fpstate *buf ) 27.342 +{ 27.343 + struct task_struct *tsk = current; 27.344 + clear_fpu( tsk ); 27.345 + return __copy_from_user( &tsk->thread.i387.fsave, buf, 27.346 + sizeof(struct i387_fsave_struct) ); 27.347 +} 27.348 + 27.349 +static inline int restore_i387_fxsave( struct _fpstate *buf ) 27.350 +{ 27.351 + struct task_struct *tsk = current; 27.352 + clear_fpu( tsk ); 27.353 + if ( __copy_from_user( &tsk->thread.i387.fxsave, &buf->_fxsr_env[0], 27.354 + sizeof(struct i387_fxsave_struct) ) ) 27.355 + return 1; 27.356 + /* mxcsr bit 6 and 31-16 must be zero for security reasons */ 27.357 + tsk->thread.i387.fxsave.mxcsr &= 0xffbf; 27.358 + return convert_fxsr_from_user( &tsk->thread.i387.fxsave, buf ); 27.359 +} 27.360 + 27.361 +int restore_i387( struct _fpstate *buf ) 27.362 +{ 27.363 + int err; 27.364 + 27.365 + if ( HAVE_HWFP ) { 27.366 + if ( cpu_has_fxsr ) { 27.367 + err = restore_i387_fxsave( buf ); 27.368 + } else { 27.369 + err = restore_i387_fsave( buf ); 27.370 + } 27.371 + } else { 27.372 + err = restore_i387_soft( ¤t->thread.i387.soft, buf ); 27.373 + } 27.374 + current->used_math = 1; 27.375 + return err; 27.376 +} 27.377 + 27.378 +/* 27.379 + * ptrace request handlers. 27.380 + */ 27.381 + 27.382 +static inline int get_fpregs_fsave( struct user_i387_struct *buf, 27.383 + struct task_struct *tsk ) 27.384 +{ 27.385 + return __copy_to_user( buf, &tsk->thread.i387.fsave, 27.386 + sizeof(struct user_i387_struct) ); 27.387 +} 27.388 + 27.389 +static inline int get_fpregs_fxsave( struct user_i387_struct *buf, 27.390 + struct task_struct *tsk ) 27.391 +{ 27.392 + return convert_fxsr_to_user( (struct _fpstate *)buf, 27.393 + &tsk->thread.i387.fxsave ); 27.394 +} 27.395 + 27.396 +int get_fpregs( struct user_i387_struct *buf, struct task_struct *tsk ) 27.397 +{ 27.398 + if ( HAVE_HWFP ) { 27.399 + if ( cpu_has_fxsr ) { 27.400 + return get_fpregs_fxsave( buf, tsk ); 27.401 + } else { 27.402 + return get_fpregs_fsave( buf, tsk ); 27.403 + } 27.404 + } else { 27.405 + return save_i387_soft( &tsk->thread.i387.soft, 27.406 + (struct _fpstate *)buf ); 27.407 + } 27.408 +} 27.409 + 27.410 +static inline int set_fpregs_fsave( struct task_struct *tsk, 27.411 + struct user_i387_struct *buf ) 27.412 +{ 27.413 + return __copy_from_user( &tsk->thread.i387.fsave, buf, 27.414 + sizeof(struct user_i387_struct) ); 27.415 +} 27.416 + 27.417 +static inline int set_fpregs_fxsave( struct task_struct *tsk, 27.418 + struct user_i387_struct *buf ) 27.419 +{ 27.420 + return convert_fxsr_from_user( &tsk->thread.i387.fxsave, 27.421 + (struct _fpstate *)buf ); 27.422 +} 27.423 + 27.424 +int set_fpregs( struct task_struct *tsk, struct user_i387_struct *buf ) 27.425 +{ 27.426 + if ( HAVE_HWFP ) { 27.427 + if ( cpu_has_fxsr ) { 27.428 + return set_fpregs_fxsave( tsk, buf ); 27.429 + } else { 27.430 + return set_fpregs_fsave( tsk, buf ); 27.431 + } 27.432 + } else { 27.433 + return restore_i387_soft( &tsk->thread.i387.soft, 27.434 + (struct _fpstate *)buf ); 27.435 + } 27.436 +} 27.437 + 27.438 +int get_fpxregs( struct user_fxsr_struct *buf, struct task_struct *tsk ) 27.439 +{ 27.440 + if ( cpu_has_fxsr ) { 27.441 + if (__copy_to_user( (void *)buf, &tsk->thread.i387.fxsave, 27.442 + sizeof(struct user_fxsr_struct) )) 27.443 + return -EFAULT; 27.444 + return 0; 27.445 + } else { 27.446 + return -EIO; 27.447 + } 27.448 +} 27.449 + 27.450 +int set_fpxregs( struct task_struct *tsk, struct user_fxsr_struct *buf ) 27.451 +{ 27.452 + if ( cpu_has_fxsr ) { 27.453 + __copy_from_user( &tsk->thread.i387.fxsave, (void *)buf, 27.454 + sizeof(struct user_fxsr_struct) ); 27.455 + /* mxcsr bit 6 and 31-16 must be zero for security reasons */ 27.456 + tsk->thread.i387.fxsave.mxcsr &= 0xffbf; 27.457 + return 0; 27.458 + } else { 27.459 + return -EIO; 27.460 + } 27.461 +} 27.462 + 27.463 +/* 27.464 + * FPU state for core dumps. 27.465 + */ 27.466 + 27.467 +static inline void copy_fpu_fsave( struct task_struct *tsk, 27.468 + struct user_i387_struct *fpu ) 27.469 +{ 27.470 + memcpy( fpu, &tsk->thread.i387.fsave, 27.471 + sizeof(struct user_i387_struct) ); 27.472 +} 27.473 + 27.474 +static inline void copy_fpu_fxsave( struct task_struct *tsk, 27.475 + struct user_i387_struct *fpu ) 27.476 +{ 27.477 + unsigned short *to; 27.478 + unsigned short *from; 27.479 + int i; 27.480 + 27.481 + memcpy( fpu, &tsk->thread.i387.fxsave, 7 * sizeof(long) ); 27.482 + 27.483 + to = (unsigned short *)&fpu->st_space[0]; 27.484 + from = (unsigned short *)&tsk->thread.i387.fxsave.st_space[0]; 27.485 + for ( i = 0 ; i < 8 ; i++, to += 5, from += 8 ) { 27.486 + memcpy( to, from, 5 * sizeof(unsigned short) ); 27.487 + } 27.488 +} 27.489 + 27.490 +int dump_fpu( struct pt_regs *regs, struct user_i387_struct *fpu ) 27.491 +{ 27.492 + int fpvalid; 27.493 + struct task_struct *tsk = current; 27.494 + 27.495 + fpvalid = tsk->used_math; 27.496 + if ( fpvalid ) { 27.497 + unlazy_fpu( tsk ); 27.498 + if ( cpu_has_fxsr ) { 27.499 + copy_fpu_fxsave( tsk, fpu ); 27.500 + } else { 27.501 + copy_fpu_fsave( tsk, fpu ); 27.502 + } 27.503 + } 27.504 + 27.505 + return fpvalid; 27.506 +} 27.507 + 27.508 +int dump_extended_fpu( struct pt_regs *regs, struct user_fxsr_struct *fpu ) 27.509 +{ 27.510 + int fpvalid; 27.511 + struct task_struct *tsk = current; 27.512 + 27.513 + fpvalid = tsk->used_math && cpu_has_fxsr; 27.514 + if ( fpvalid ) { 27.515 + unlazy_fpu( tsk ); 27.516 + memcpy( fpu, &tsk->thread.i387.fxsave, 27.517 + sizeof(struct user_fxsr_struct) ); 27.518 + } 27.519 + 27.520 + return fpvalid; 27.521 +}
28.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 28.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/kernel/init_task.c Mon Feb 24 16:55:07 2003 +0000 28.3 @@ -0,0 +1,33 @@ 28.4 +#include <linux/mm.h> 28.5 +#include <linux/sched.h> 28.6 +#include <linux/init.h> 28.7 + 28.8 +#include <asm/uaccess.h> 28.9 +#include <asm/pgtable.h> 28.10 +#include <asm/desc.h> 28.11 + 28.12 +static struct fs_struct init_fs = INIT_FS; 28.13 +static struct files_struct init_files = INIT_FILES; 28.14 +static struct signal_struct init_signals = INIT_SIGNALS; 28.15 +struct mm_struct init_mm = INIT_MM(init_mm); 28.16 + 28.17 +/* 28.18 + * Initial task structure. 28.19 + * 28.20 + * We need to make sure that this is 8192-byte aligned due to the 28.21 + * way process stacks are handled. This is done by having a special 28.22 + * "init_task" linker map entry.. 28.23 + */ 28.24 +union task_union init_task_union 28.25 + __attribute__((__section__(".data.init_task"))) = 28.26 + { INIT_TASK(init_task_union.task) }; 28.27 + 28.28 +/* 28.29 + * per-CPU TSS segments. Threads are completely 'soft' on Linux, 28.30 + * no more per-task TSS's. The TSS size is kept cacheline-aligned 28.31 + * so they are allowed to end up in the .data.cacheline_aligned 28.32 + * section. Since TSS's are completely CPU-local, we want them 28.33 + * on exact cacheline boundaries, to eliminate cacheline ping-pong. 28.34 + */ 28.35 +struct tss_struct init_tss[NR_CPUS] __cacheline_aligned = { [0 ... NR_CPUS-1] = INIT_TSS }; 28.36 +
29.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 29.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/kernel/ioport.c Mon Feb 24 16:55:07 2003 +0000 29.3 @@ -0,0 +1,19 @@ 29.4 +#include <linux/sched.h> 29.5 +#include <linux/kernel.h> 29.6 +#include <linux/errno.h> 29.7 +#include <linux/types.h> 29.8 +#include <linux/stddef.h> 29.9 + 29.10 + 29.11 +asmlinkage int sys_ioperm(unsigned long from, unsigned long num, int turn_on) 29.12 +{ 29.13 + /* No IO permission! */ 29.14 + return -EPERM; 29.15 +} 29.16 + 29.17 + 29.18 +asmlinkage int sys_iopl(unsigned long unused) 29.19 +{ 29.20 + /* The hypervisor won't allow it! */ 29.21 + return -EPERM; 29.22 +}
30.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 30.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/kernel/irq.c Mon Feb 24 16:55:07 2003 +0000 30.3 @@ -0,0 +1,1129 @@ 30.4 +/* 30.5 + * linux/arch/i386/kernel/irq.c 30.6 + * 30.7 + * Copyright (C) 1992, 1998 Linus Torvalds, Ingo Molnar 30.8 + * 30.9 + * This file contains the code used by various IRQ handling routines: 30.10 + * asking for different IRQ's should be done through these routines 30.11 + * instead of just grabbing them. Thus setups with different IRQ numbers 30.12 + * shouldn't result in any weird surprises, and installing new handlers 30.13 + * should be easier. 30.14 + */ 30.15 + 30.16 +/* 30.17 + * (mostly architecture independent, will move to kernel/irq.c in 2.5.) 30.18 + * 30.19 + * IRQs are in fact implemented a bit like signal handlers for the kernel. 30.20 + * Naturally it's not a 1:1 relation, but there are similarities. 30.21 + */ 30.22 + 30.23 +#include <linux/config.h> 30.24 +#include <linux/ptrace.h> 30.25 +#include <linux/errno.h> 30.26 +#include <linux/signal.h> 30.27 +#include <linux/sched.h> 30.28 +#include <linux/ioport.h> 30.29 +#include <linux/interrupt.h> 30.30 +#include <linux/timex.h> 30.31 +#include <linux/slab.h> 30.32 +#include <linux/random.h> 30.33 +#include <linux/smp_lock.h> 30.34 +#include <linux/init.h> 30.35 +#include <linux/kernel_stat.h> 30.36 +#include <linux/irq.h> 30.37 +#include <linux/proc_fs.h> 30.38 +#include <linux/kdb.h> 30.39 + 30.40 +#include <asm/atomic.h> 30.41 +#include <asm/io.h> 30.42 +#include <asm/smp.h> 30.43 +#include <asm/system.h> 30.44 +#include <asm/bitops.h> 30.45 +#include <asm/uaccess.h> 30.46 +#include <asm/pgalloc.h> 30.47 +#include <asm/delay.h> 30.48 +#include <asm/desc.h> 30.49 +#include <asm/irq.h> 30.50 + 30.51 + 30.52 + 30.53 +/* 30.54 + * Linux has a controller-independent x86 interrupt architecture. 30.55 + * every controller has a 'controller-template', that is used 30.56 + * by the main code to do the right thing. Each driver-visible 30.57 + * interrupt source is transparently wired to the apropriate 30.58 + * controller. Thus drivers need not be aware of the 30.59 + * interrupt-controller. 30.60 + * 30.61 + * Various interrupt controllers we handle: 8259 PIC, SMP IO-APIC, 30.62 + * PIIX4's internal 8259 PIC and SGI's Visual Workstation Cobalt (IO-)APIC. 30.63 + * (IO-APICs assumed to be messaging to Pentium local-APICs) 30.64 + * 30.65 + * the code is designed to be easily extended with new/different 30.66 + * interrupt controllers, without having to do assembly magic. 30.67 + */ 30.68 + 30.69 +/* 30.70 + * Controller mappings for all interrupt sources: 30.71 + */ 30.72 +irq_desc_t irq_desc[NR_IRQS] __cacheline_aligned = 30.73 + { [0 ... NR_IRQS-1] = { 0, &no_irq_type, NULL, 0, SPIN_LOCK_UNLOCKED}}; 30.74 + 30.75 +static void register_irq_proc (unsigned int irq); 30.76 + 30.77 +/* 30.78 + * Special irq handlers. 30.79 + */ 30.80 + 30.81 +void no_action(int cpl, void *dev_id, struct pt_regs *regs) { } 30.82 + 30.83 +/* 30.84 + * Generic no controller code 30.85 + */ 30.86 + 30.87 +static void enable_none(unsigned int irq) { } 30.88 +static unsigned int startup_none(unsigned int irq) { return 0; } 30.89 +static void disable_none(unsigned int irq) { } 30.90 +static void ack_none(unsigned int irq) 30.91 +{ 30.92 + printk("unexpected IRQ trap at vector %02x\n", irq); 30.93 +} 30.94 + 30.95 +/* startup is the same as "enable", shutdown is same as "disable" */ 30.96 +#define shutdown_none disable_none 30.97 +#define end_none enable_none 30.98 + 30.99 +struct hw_interrupt_type no_irq_type = { 30.100 + "none", 30.101 + startup_none, 30.102 + shutdown_none, 30.103 + enable_none, 30.104 + disable_none, 30.105 + ack_none, 30.106 + end_none 30.107 +}; 30.108 + 30.109 +atomic_t irq_err_count; 30.110 +#ifdef CONFIG_X86_IO_APIC 30.111 +#ifdef APIC_MISMATCH_DEBUG 30.112 +atomic_t irq_mis_count; 30.113 +#endif 30.114 +#endif 30.115 + 30.116 +/* 30.117 + * Generic, controller-independent functions: 30.118 + */ 30.119 + 30.120 +int get_irq_list(char *buf) 30.121 +{ 30.122 + int i, j; 30.123 + struct irqaction * action; 30.124 + char *p = buf; 30.125 + 30.126 + p += sprintf(p, " "); 30.127 + for (j=0; j<smp_num_cpus; j++) 30.128 + p += sprintf(p, "CPU%d ",j); 30.129 + *p++ = '\n'; 30.130 + 30.131 + for (i = 0 ; i < NR_IRQS ; i++) { 30.132 + action = irq_desc[i].action; 30.133 + if (!action) 30.134 + continue; 30.135 + p += sprintf(p, "%3d: ",i); 30.136 +#ifndef CONFIG_SMP 30.137 + p += sprintf(p, "%10u ", kstat_irqs(i)); 30.138 +#else 30.139 + for (j = 0; j < smp_num_cpus; j++) 30.140 + p += sprintf(p, "%10u ", 30.141 + kstat.irqs[cpu_logical_map(j)][i]); 30.142 +#endif 30.143 + p += sprintf(p, " %14s", irq_desc[i].handler->typename); 30.144 + p += sprintf(p, " %s", action->name); 30.145 + 30.146 + for (action=action->next; action; action = action->next) 30.147 + p += sprintf(p, ", %s", action->name); 30.148 + *p++ = '\n'; 30.149 + } 30.150 + p += sprintf(p, "NMI: "); 30.151 + for (j = 0; j < smp_num_cpus; j++) 30.152 + p += sprintf(p, "%10u ", 30.153 + nmi_count(cpu_logical_map(j))); 30.154 + p += sprintf(p, "\n"); 30.155 +#if CONFIG_X86_LOCAL_APIC 30.156 + p += sprintf(p, "LOC: "); 30.157 + for (j = 0; j < smp_num_cpus; j++) 30.158 + p += sprintf(p, "%10u ", 30.159 + apic_timer_irqs[cpu_logical_map(j)]); 30.160 + p += sprintf(p, "\n"); 30.161 +#endif 30.162 + p += sprintf(p, "ERR: %10u\n", atomic_read(&irq_err_count)); 30.163 +#ifdef CONFIG_X86_IO_APIC 30.164 +#ifdef APIC_MISMATCH_DEBUG 30.165 + p += sprintf(p, "MIS: %10u\n", atomic_read(&irq_mis_count)); 30.166 +#endif 30.167 +#endif 30.168 + return p - buf; 30.169 +} 30.170 + 30.171 + 30.172 +/* 30.173 + * Global interrupt locks for SMP. Allow interrupts to come in on any 30.174 + * CPU, yet make cli/sti act globally to protect critical regions.. 30.175 + */ 30.176 + 30.177 +#ifdef CONFIG_SMP 30.178 +unsigned char global_irq_holder = NO_PROC_ID; 30.179 +unsigned volatile long global_irq_lock; /* pendantic: long for set_bit --RR */ 30.180 + 30.181 +extern void show_stack(unsigned long* esp); 30.182 + 30.183 +static void show(char * str) 30.184 +{ 30.185 + int i; 30.186 + int cpu = smp_processor_id(); 30.187 + 30.188 + printk("\n%s, CPU %d:\n", str, cpu); 30.189 + printk("irq: %d [",irqs_running()); 30.190 + for(i=0;i < smp_num_cpus;i++) 30.191 + printk(" %d",local_irq_count(i)); 30.192 + printk(" ]\nbh: %d [",spin_is_locked(&global_bh_lock) ? 1 : 0); 30.193 + for(i=0;i < smp_num_cpus;i++) 30.194 + printk(" %d",local_bh_count(i)); 30.195 + 30.196 + printk(" ]\nStack dumps:"); 30.197 + for(i = 0; i < smp_num_cpus; i++) { 30.198 + unsigned long esp; 30.199 + if (i == cpu) 30.200 + continue; 30.201 + printk("\nCPU %d:",i); 30.202 + esp = init_tss[i].esp0; 30.203 + if (!esp) { 30.204 + /* tss->esp0 is set to NULL in cpu_init(), 30.205 + * it's initialized when the cpu returns to user 30.206 + * space. -- manfreds 30.207 + */ 30.208 + printk(" <unknown> "); 30.209 + continue; 30.210 + } 30.211 + esp &= ~(THREAD_SIZE-1); 30.212 + esp += sizeof(struct task_struct); 30.213 + show_stack((void*)esp); 30.214 + } 30.215 + printk("\nCPU %d:",cpu); 30.216 + show_stack(NULL); 30.217 + printk("\n"); 30.218 +} 30.219 + 30.220 +#define MAXCOUNT 100000000 30.221 + 30.222 +/* 30.223 + * I had a lockup scenario where a tight loop doing 30.224 + * spin_unlock()/spin_lock() on CPU#1 was racing with 30.225 + * spin_lock() on CPU#0. CPU#0 should have noticed spin_unlock(), but 30.226 + * apparently the spin_unlock() information did not make it 30.227 + * through to CPU#0 ... nasty, is this by design, do we have to limit 30.228 + * 'memory update oscillation frequency' artificially like here? 30.229 + * 30.230 + * Such 'high frequency update' races can be avoided by careful design, but 30.231 + * some of our major constructs like spinlocks use similar techniques, 30.232 + * it would be nice to clarify this issue. Set this define to 0 if you 30.233 + * want to check whether your system freezes. I suspect the delay done 30.234 + * by SYNC_OTHER_CORES() is in correlation with 'snooping latency', but 30.235 + * i thought that such things are guaranteed by design, since we use 30.236 + * the 'LOCK' prefix. 30.237 + */ 30.238 +#define SUSPECTED_CPU_OR_CHIPSET_BUG_WORKAROUND 0 30.239 + 30.240 +#if SUSPECTED_CPU_OR_CHIPSET_BUG_WORKAROUND 30.241 +# define SYNC_OTHER_CORES(x) udelay(x+1) 30.242 +#else 30.243 +/* 30.244 + * We have to allow irqs to arrive between __sti and __cli 30.245 + */ 30.246 +# define SYNC_OTHER_CORES(x) __asm__ __volatile__ ("nop") 30.247 +#endif 30.248 + 30.249 +static inline void wait_on_irq(int cpu) 30.250 +{ 30.251 + int count = MAXCOUNT; 30.252 + 30.253 + for (;;) { 30.254 + 30.255 + /* 30.256 + * Wait until all interrupts are gone. Wait 30.257 + * for bottom half handlers unless we're 30.258 + * already executing in one.. 30.259 + */ 30.260 + if (!irqs_running()) 30.261 + if (local_bh_count(cpu) || !spin_is_locked(&global_bh_lock)) 30.262 + break; 30.263 + 30.264 + /* Duh, we have to loop. Release the lock to avoid deadlocks */ 30.265 + clear_bit(0,&global_irq_lock); 30.266 + 30.267 + for (;;) { 30.268 + if (!--count) { 30.269 + show("wait_on_irq"); 30.270 + count = ~0; 30.271 + } 30.272 + __sti(); 30.273 + SYNC_OTHER_CORES(cpu); 30.274 + __cli(); 30.275 + if (irqs_running()) 30.276 + continue; 30.277 + if (global_irq_lock) 30.278 + continue; 30.279 + if (!local_bh_count(cpu) && spin_is_locked(&global_bh_lock)) 30.280 + continue; 30.281 + if (!test_and_set_bit(0,&global_irq_lock)) 30.282 + break; 30.283 + } 30.284 + } 30.285 +} 30.286 + 30.287 +/* 30.288 + * This is called when we want to synchronize with 30.289 + * interrupts. We may for example tell a device to 30.290 + * stop sending interrupts: but to make sure there 30.291 + * are no interrupts that are executing on another 30.292 + * CPU we need to call this function. 30.293 + */ 30.294 +void synchronize_irq(void) 30.295 +{ 30.296 + if (irqs_running()) { 30.297 + /* Stupid approach */ 30.298 + cli(); 30.299 + sti(); 30.300 + } 30.301 +} 30.302 + 30.303 +static inline void get_irqlock(int cpu) 30.304 +{ 30.305 +#ifdef CONFIG_KDB 30.306 + static int kdb_rate; 30.307 + if (KDB_IS_RUNNING() && kdb_rate++ < 10) 30.308 + kdb_printf("Warning: get_irqlock on cpu %d while kdb is running, may hang\n", smp_processor_id()); 30.309 +#endif /* CONFIG_KDB */ 30.310 + if (test_and_set_bit(0,&global_irq_lock)) { 30.311 + /* do we already hold the lock? */ 30.312 + if ((unsigned char) cpu == global_irq_holder) 30.313 + return; 30.314 + /* Uhhuh.. Somebody else got it. Wait.. */ 30.315 + do { 30.316 + do { 30.317 + rep_nop(); 30.318 + } while (test_bit(0,&global_irq_lock)); 30.319 + } while (test_and_set_bit(0,&global_irq_lock)); 30.320 + } 30.321 + /* 30.322 + * We also to make sure that nobody else is running 30.323 + * in an interrupt context. 30.324 + */ 30.325 + wait_on_irq(cpu); 30.326 + 30.327 + /* 30.328 + * Ok, finally.. 30.329 + */ 30.330 + global_irq_holder = cpu; 30.331 +} 30.332 + 30.333 +void __global_cli(void) 30.334 +{ 30.335 + panic("__global_cli"); 30.336 +} 30.337 + 30.338 +void __global_sti(void) 30.339 +{ 30.340 + panic("__global_sti"); 30.341 +} 30.342 + 30.343 +/* 30.344 + * SMP flags value to restore to: 30.345 + * 0 - global cli 30.346 + * 1 - global sti 30.347 + * 2 - local cli 30.348 + * 3 - local sti 30.349 + */ 30.350 +unsigned long __global_save_flags(void) 30.351 +{ 30.352 + panic("__global_save_flags"); 30.353 +} 30.354 + 30.355 +void __global_restore_flags(unsigned long flags) 30.356 +{ 30.357 + panic("__global_restore_flags"); 30.358 +} 30.359 + 30.360 +#endif 30.361 + 30.362 +/* 30.363 + * This should really return information about whether 30.364 + * we should do bottom half handling etc. Right now we 30.365 + * end up _always_ checking the bottom half, which is a 30.366 + * waste of time and is not what some drivers would 30.367 + * prefer. 30.368 + */ 30.369 +int handle_IRQ_event(unsigned int irq, struct pt_regs * regs, struct irqaction * action) 30.370 +{ 30.371 + int status; 30.372 + int cpu = smp_processor_id(); 30.373 + 30.374 + irq_enter(cpu, irq); 30.375 + 30.376 + status = 1; /* Force the "do bottom halves" bit */ 30.377 + 30.378 + if (!(action->flags & SA_INTERRUPT)) 30.379 + __sti(); 30.380 + 30.381 + do { 30.382 + status |= action->flags; 30.383 + action->handler(irq, action->dev_id, regs); 30.384 + action = action->next; 30.385 + } while (action); 30.386 + if (status & SA_SAMPLE_RANDOM) 30.387 + add_interrupt_randomness(irq); 30.388 + __cli(); 30.389 + 30.390 + irq_exit(cpu, irq); 30.391 + 30.392 + return status; 30.393 +} 30.394 + 30.395 +/* 30.396 + * Generic enable/disable code: this just calls 30.397 + * down into the PIC-specific version for the actual 30.398 + * hardware disable after having gotten the irq 30.399 + * controller lock. 30.400 + */ 30.401 + 30.402 +/** 30.403 + * disable_irq_nosync - disable an irq without waiting 30.404 + * @irq: Interrupt to disable 30.405 + * 30.406 + * Disable the selected interrupt line. Disables and Enables are 30.407 + * nested. 30.408 + * Unlike disable_irq(), this function does not ensure existing 30.409 + * instances of the IRQ handler have completed before returning. 30.410 + * 30.411 + * This function may be called from IRQ context. 30.412 + */ 30.413 + 30.414 +inline void disable_irq_nosync(unsigned int irq) 30.415 +{ 30.416 + irq_desc_t *desc = irq_desc + irq; 30.417 + unsigned long flags; 30.418 + 30.419 + spin_lock_irqsave(&desc->lock, flags); 30.420 + if (!desc->depth++) { 30.421 + desc->status |= IRQ_DISABLED; 30.422 + desc->handler->disable(irq); 30.423 + } 30.424 + spin_unlock_irqrestore(&desc->lock, flags); 30.425 +} 30.426 + 30.427 +/** 30.428 + * disable_irq - disable an irq and wait for completion 30.429 + * @irq: Interrupt to disable 30.430 + * 30.431 + * Disable the selected interrupt line. Enables and Disables are 30.432 + * nested. 30.433 + * This function waits for any pending IRQ handlers for this interrupt 30.434 + * to complete before returning. If you use this function while 30.435 + * holding a resource the IRQ handler may need you will deadlock. 30.436 + * 30.437 + * This function may be called - with care - from IRQ context. 30.438 + */ 30.439 + 30.440 +void disable_irq(unsigned int irq) 30.441 +{ 30.442 + disable_irq_nosync(irq); 30.443 + 30.444 + if (!local_irq_count(smp_processor_id())) { 30.445 + do { 30.446 + barrier(); 30.447 + cpu_relax(); 30.448 + } while (irq_desc[irq].status & IRQ_INPROGRESS); 30.449 + } 30.450 +} 30.451 + 30.452 +/** 30.453 + * enable_irq - enable handling of an irq 30.454 + * @irq: Interrupt to enable 30.455 + * 30.456 + * Undoes the effect of one call to disable_irq(). If this 30.457 + * matches the last disable, processing of interrupts on this 30.458 + * IRQ line is re-enabled. 30.459 + * 30.460 + * This function may be called from IRQ context. 30.461 + */ 30.462 + 30.463 +void enable_irq(unsigned int irq) 30.464 +{ 30.465 + irq_desc_t *desc = irq_desc + irq; 30.466 + unsigned long flags; 30.467 + 30.468 + spin_lock_irqsave(&desc->lock, flags); 30.469 + switch (desc->depth) { 30.470 + case 1: { 30.471 + unsigned int status = desc->status & ~IRQ_DISABLED; 30.472 + desc->status = status; 30.473 + if ((status & (IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) { 30.474 + desc->status = status | IRQ_REPLAY; 30.475 + hw_resend_irq(desc->handler,irq); 30.476 + } 30.477 + desc->handler->enable(irq); 30.478 + /* fall-through */ 30.479 + } 30.480 + default: 30.481 + desc->depth--; 30.482 + break; 30.483 + case 0: 30.484 + printk("enable_irq(%u) unbalanced from %p\n", irq, 30.485 + __builtin_return_address(0)); 30.486 + } 30.487 + spin_unlock_irqrestore(&desc->lock, flags); 30.488 +} 30.489 + 30.490 +/* 30.491 + * do_IRQ handles all normal device IRQ's (the special 30.492 + * SMP cross-CPU interrupts have their own specific 30.493 + * handlers). 30.494 + */ 30.495 +asmlinkage unsigned int do_IRQ(int irq, struct pt_regs *regs) 30.496 +{ 30.497 + /* 30.498 + * We ack quickly, we don't want the irq controller 30.499 + * thinking we're snobs just because some other CPU has 30.500 + * disabled global interrupts (we have already done the 30.501 + * INT_ACK cycles, it's too late to try to pretend to the 30.502 + * controller that we aren't taking the interrupt). 30.503 + * 30.504 + * 0 return value means that this irq is already being 30.505 + * handled by some other CPU. (or is disabled) 30.506 + */ 30.507 + int cpu = smp_processor_id(); 30.508 + irq_desc_t *desc = irq_desc + irq; 30.509 + struct irqaction * action; 30.510 + unsigned int status; 30.511 + 30.512 + kstat.irqs[cpu][irq]++; 30.513 + spin_lock(&desc->lock); 30.514 + desc->handler->ack(irq); 30.515 + /* 30.516 + REPLAY is when Linux resends an IRQ that was dropped earlier 30.517 + WAITING is used by probe to mark irqs that are being tested 30.518 + */ 30.519 + status = desc->status & ~(IRQ_REPLAY | IRQ_WAITING); 30.520 + status |= IRQ_PENDING; /* we _want_ to handle it */ 30.521 + 30.522 + /* 30.523 + * If the IRQ is disabled for whatever reason, we cannot 30.524 + * use the action we have. 30.525 + */ 30.526 + action = NULL; 30.527 + if (!(status & (IRQ_DISABLED | IRQ_INPROGRESS))) { 30.528 + action = desc->action; 30.529 + status &= ~IRQ_PENDING; /* we commit to handling */ 30.530 + status |= IRQ_INPROGRESS; /* we are handling it */ 30.531 + } 30.532 + desc->status = status; 30.533 + 30.534 + /* 30.535 + * If there is no IRQ handler or it was disabled, exit early. 30.536 + Since we set PENDING, if another processor is handling 30.537 + a different instance of this same irq, the other processor 30.538 + will take care of it. 30.539 + */ 30.540 + if (!action) 30.541 + goto out; 30.542 + 30.543 + /* 30.544 + * Edge triggered interrupts need to remember 30.545 + * pending events. 30.546 + * This applies to any hw interrupts that allow a second 30.547 + * instance of the same irq to arrive while we are in do_IRQ 30.548 + * or in the handler. But the code here only handles the _second_ 30.549 + * instance of the irq, not the third or fourth. So it is mostly 30.550 + * useful for irq hardware that does not mask cleanly in an 30.551 + * SMP environment. 30.552 + */ 30.553 + for (;;) { 30.554 + spin_unlock(&desc->lock); 30.555 + handle_IRQ_event(irq, regs, action); 30.556 + spin_lock(&desc->lock); 30.557 + 30.558 + if (!(desc->status & IRQ_PENDING)) 30.559 + break; 30.560 + desc->status &= ~IRQ_PENDING; 30.561 + } 30.562 + desc->status &= ~IRQ_INPROGRESS; 30.563 +out: 30.564 + /* 30.565 + * The ->end() handler has to deal with interrupts which got 30.566 + * disabled while the handler was running. 30.567 + */ 30.568 + desc->handler->end(irq); 30.569 + spin_unlock(&desc->lock); 30.570 + 30.571 + if (softirq_pending(cpu)) 30.572 + do_softirq(); 30.573 + 30.574 + return 1; 30.575 +} 30.576 + 30.577 +/** 30.578 + * request_irq - allocate an interrupt line 30.579 + * @irq: Interrupt line to allocate 30.580 + * @handler: Function to be called when the IRQ occurs 30.581 + * @irqflags: Interrupt type flags 30.582 + * @devname: An ascii name for the claiming device 30.583 + * @dev_id: A cookie passed back to the handler function 30.584 + * 30.585 + * This call allocates interrupt resources and enables the 30.586 + * interrupt line and IRQ handling. From the point this 30.587 + * call is made your handler function may be invoked. Since 30.588 + * your handler function must clear any interrupt the board 30.589 + * raises, you must take care both to initialise your hardware 30.590 + * and to set up the interrupt handler in the right order. 30.591 + * 30.592 + * Dev_id must be globally unique. Normally the address of the 30.593 + * device data structure is used as the cookie. Since the handler 30.594 + * receives this value it makes sense to use it. 30.595 + * 30.596 + * If your interrupt is shared you must pass a non NULL dev_id 30.597 + * as this is required when freeing the interrupt. 30.598 + * 30.599 + * Flags: 30.600 + * 30.601 + * SA_SHIRQ Interrupt is shared 30.602 + * 30.603 + * SA_INTERRUPT Disable local interrupts while processing 30.604 + * 30.605 + * SA_SAMPLE_RANDOM The interrupt can be used for entropy 30.606 + * 30.607 + */ 30.608 + 30.609 +int request_irq(unsigned int irq, 30.610 + void (*handler)(int, void *, struct pt_regs *), 30.611 + unsigned long irqflags, 30.612 + const char * devname, 30.613 + void *dev_id) 30.614 +{ 30.615 + int retval; 30.616 + struct irqaction * action; 30.617 + 30.618 +#if 1 30.619 + /* 30.620 + * Sanity-check: shared interrupts should REALLY pass in 30.621 + * a real dev-ID, otherwise we'll have trouble later trying 30.622 + * to figure out which interrupt is which (messes up the 30.623 + * interrupt freeing logic etc). 30.624 + */ 30.625 + if (irqflags & SA_SHIRQ) { 30.626 + if (!dev_id) 30.627 + printk("Bad boy: %s (at 0x%x) called us without a dev_id!\n", devname, (&irq)[-1]); 30.628 + } 30.629 +#endif 30.630 + 30.631 + if (irq >= NR_IRQS) 30.632 + return -EINVAL; 30.633 + if (!handler) 30.634 + return -EINVAL; 30.635 + 30.636 + action = (struct irqaction *) 30.637 + kmalloc(sizeof(struct irqaction), GFP_KERNEL); 30.638 + if (!action) 30.639 + return -ENOMEM; 30.640 + 30.641 + action->handler = handler; 30.642 + action->flags = irqflags; 30.643 + action->mask = 0; 30.644 + action->name = devname; 30.645 + action->next = NULL; 30.646 + action->dev_id = dev_id; 30.647 + 30.648 + retval = setup_irq(irq, action); 30.649 + if (retval) 30.650 + kfree(action); 30.651 + return retval; 30.652 +} 30.653 + 30.654 +/** 30.655 + * free_irq - free an interrupt 30.656 + * @irq: Interrupt line to free 30.657 + * @dev_id: Device identity to free 30.658 + * 30.659 + * Remove an interrupt handler. The handler is removed and if the 30.660 + * interrupt line is no longer in use by any driver it is disabled. 30.661 + * On a shared IRQ the caller must ensure the interrupt is disabled 30.662 + * on the card it drives before calling this function. The function 30.663 + * does not return until any executing interrupts for this IRQ 30.664 + * have completed. 30.665 + * 30.666 + * This function may be called from interrupt context. 30.667 + * 30.668 + * Bugs: Attempting to free an irq in a handler for the same irq hangs 30.669 + * the machine. 30.670 + */ 30.671 + 30.672 +void free_irq(unsigned int irq, void *dev_id) 30.673 +{ 30.674 + irq_desc_t *desc; 30.675 + struct irqaction **p; 30.676 + unsigned long flags; 30.677 + 30.678 + if (irq >= NR_IRQS) 30.679 + return; 30.680 + 30.681 + desc = irq_desc + irq; 30.682 + spin_lock_irqsave(&desc->lock,flags); 30.683 + p = &desc->action; 30.684 + for (;;) { 30.685 + struct irqaction * action = *p; 30.686 + if (action) { 30.687 + struct irqaction **pp = p; 30.688 + p = &action->next; 30.689 + if (action->dev_id != dev_id) 30.690 + continue; 30.691 + 30.692 + /* Found it - now remove it from the list of entries */ 30.693 + *pp = action->next; 30.694 + if (!desc->action) { 30.695 + desc->status |= IRQ_DISABLED; 30.696 + desc->handler->shutdown(irq); 30.697 + } 30.698 + spin_unlock_irqrestore(&desc->lock,flags); 30.699 + 30.700 +#ifdef CONFIG_SMP 30.701 + /* Wait to make sure it's not being used on another CPU */ 30.702 + while (desc->status & IRQ_INPROGRESS) { 30.703 + barrier(); 30.704 + cpu_relax(); 30.705 + } 30.706 +#endif 30.707 + kfree(action); 30.708 + return; 30.709 + } 30.710 + printk("Trying to free free IRQ%d\n",irq); 30.711 + spin_unlock_irqrestore(&desc->lock,flags); 30.712 + return; 30.713 + } 30.714 +} 30.715 + 30.716 +/* 30.717 + * IRQ autodetection code.. 30.718 + * 30.719 + * This depends on the fact that any interrupt that 30.720 + * comes in on to an unassigned handler will get stuck 30.721 + * with "IRQ_WAITING" cleared and the interrupt 30.722 + * disabled. 30.723 + */ 30.724 + 30.725 +static DECLARE_MUTEX(probe_sem); 30.726 + 30.727 +/** 30.728 + * probe_irq_on - begin an interrupt autodetect 30.729 + * 30.730 + * Commence probing for an interrupt. The interrupts are scanned 30.731 + * and a mask of potential interrupt lines is returned. 30.732 + * 30.733 + */ 30.734 + 30.735 +unsigned long probe_irq_on(void) 30.736 +{ 30.737 + unsigned int i; 30.738 + irq_desc_t *desc; 30.739 + unsigned long val; 30.740 + unsigned long delay; 30.741 + 30.742 + down(&probe_sem); 30.743 + /* 30.744 + * something may have generated an irq long ago and we want to 30.745 + * flush such a longstanding irq before considering it as spurious. 30.746 + */ 30.747 + for (i = NR_IRQS-1; i > 0; i--) { 30.748 + desc = irq_desc + i; 30.749 + 30.750 + spin_lock_irq(&desc->lock); 30.751 + if (!irq_desc[i].action) 30.752 + irq_desc[i].handler->startup(i); 30.753 + spin_unlock_irq(&desc->lock); 30.754 + } 30.755 + 30.756 + /* Wait for longstanding interrupts to trigger. */ 30.757 + for (delay = jiffies + HZ/50; time_after(delay, jiffies); ) 30.758 + /* about 20ms delay */ synchronize_irq(); 30.759 + 30.760 + /* 30.761 + * enable any unassigned irqs 30.762 + * (we must startup again here because if a longstanding irq 30.763 + * happened in the previous stage, it may have masked itself) 30.764 + */ 30.765 + for (i = NR_IRQS-1; i > 0; i--) { 30.766 + desc = irq_desc + i; 30.767 + 30.768 + spin_lock_irq(&desc->lock); 30.769 + if (!desc->action) { 30.770 + desc->status |= IRQ_AUTODETECT | IRQ_WAITING; 30.771 + if (desc->handler->startup(i)) 30.772 + desc->status |= IRQ_PENDING; 30.773 + } 30.774 + spin_unlock_irq(&desc->lock); 30.775 + } 30.776 + 30.777 + /* 30.778 + * Wait for spurious interrupts to trigger 30.779 + */ 30.780 + for (delay = jiffies + HZ/10; time_after(delay, jiffies); ) 30.781 + /* about 100ms delay */ synchronize_irq(); 30.782 + 30.783 + /* 30.784 + * Now filter out any obviously spurious interrupts 30.785 + */ 30.786 + val = 0; 30.787 + for (i = 0; i < NR_IRQS; i++) { 30.788 + irq_desc_t *desc = irq_desc + i; 30.789 + unsigned int status; 30.790 + 30.791 + spin_lock_irq(&desc->lock); 30.792 + status = desc->status; 30.793 + 30.794 + if (status & IRQ_AUTODETECT) { 30.795 + /* It triggered already - consider it spurious. */ 30.796 + if (!(status & IRQ_WAITING)) { 30.797 + desc->status = status & ~IRQ_AUTODETECT; 30.798 + desc->handler->shutdown(i); 30.799 + } else 30.800 + if (i < 32) 30.801 + val |= 1 << i; 30.802 + } 30.803 + spin_unlock_irq(&desc->lock); 30.804 + } 30.805 + 30.806 + return val; 30.807 +} 30.808 + 30.809 +/* 30.810 + * Return a mask of triggered interrupts (this 30.811 + * can handle only legacy ISA interrupts). 30.812 + */ 30.813 + 30.814 +/** 30.815 + * probe_irq_mask - scan a bitmap of interrupt lines 30.816 + * @val: mask of interrupts to consider 30.817 + * 30.818 + * Scan the ISA bus interrupt lines and return a bitmap of 30.819 + * active interrupts. The interrupt probe logic state is then 30.820 + * returned to its previous value. 30.821 + * 30.822 + * Note: we need to scan all the irq's even though we will 30.823 + * only return ISA irq numbers - just so that we reset them 30.824 + * all to a known state. 30.825 + */ 30.826 +unsigned int probe_irq_mask(unsigned long val) 30.827 +{ 30.828 + int i; 30.829 + unsigned int mask; 30.830 + 30.831 + mask = 0; 30.832 + for (i = 0; i < NR_IRQS; i++) { 30.833 + irq_desc_t *desc = irq_desc + i; 30.834 + unsigned int status; 30.835 + 30.836 + spin_lock_irq(&desc->lock); 30.837 + status = desc->status; 30.838 + 30.839 + if (status & IRQ_AUTODETECT) { 30.840 + if (i < 16 && !(status & IRQ_WAITING)) 30.841 + mask |= 1 << i; 30.842 + 30.843 + desc->status = status & ~IRQ_AUTODETECT; 30.844 + desc->handler->shutdown(i); 30.845 + } 30.846 + spin_unlock_irq(&desc->lock); 30.847 + } 30.848 + up(&probe_sem); 30.849 + 30.850 + return mask & val; 30.851 +} 30.852 + 30.853 +/* 30.854 + * Return the one interrupt that triggered (this can 30.855 + * handle any interrupt source). 30.856 + */ 30.857 + 30.858 +/** 30.859 + * probe_irq_off - end an interrupt autodetect 30.860 + * @val: mask of potential interrupts (unused) 30.861 + * 30.862 + * Scans the unused interrupt lines and returns the line which 30.863 + * appears to have triggered the interrupt. If no interrupt was 30.864 + * found then zero is returned. If more than one interrupt is 30.865 + * found then minus the first candidate is returned to indicate 30.866 + * their is doubt. 30.867 + * 30.868 + * The interrupt probe logic state is returned to its previous 30.869 + * value. 30.870 + * 30.871 + * BUGS: When used in a module (which arguably shouldnt happen) 30.872 + * nothing prevents two IRQ probe callers from overlapping. The 30.873 + * results of this are non-optimal. 30.874 + */ 30.875 + 30.876 +int probe_irq_off(unsigned long val) 30.877 +{ 30.878 + int i, irq_found, nr_irqs; 30.879 + 30.880 + nr_irqs = 0; 30.881 + irq_found = 0; 30.882 + for (i = 0; i < NR_IRQS; i++) { 30.883 + irq_desc_t *desc = irq_desc + i; 30.884 + unsigned int status; 30.885 + 30.886 + spin_lock_irq(&desc->lock); 30.887 + status = desc->status; 30.888 + 30.889 + if (status & IRQ_AUTODETECT) { 30.890 + if (!(status & IRQ_WAITING)) { 30.891 + if (!nr_irqs) 30.892 + irq_found = i; 30.893 + nr_irqs++; 30.894 + } 30.895 + desc->status = status & ~IRQ_AUTODETECT; 30.896 + desc->handler->shutdown(i); 30.897 + } 30.898 + spin_unlock_irq(&desc->lock); 30.899 + } 30.900 + up(&probe_sem); 30.901 + 30.902 + if (nr_irqs > 1) 30.903 + irq_found = -irq_found; 30.904 + return irq_found; 30.905 +} 30.906 + 30.907 +/* this was setup_x86_irq but it seems pretty generic */ 30.908 +int setup_irq(unsigned int irq, struct irqaction * new) 30.909 +{ 30.910 + int shared = 0; 30.911 + unsigned long flags; 30.912 + struct irqaction *old, **p; 30.913 + irq_desc_t *desc = irq_desc + irq; 30.914 + 30.915 + /* 30.916 + * Some drivers like serial.c use request_irq() heavily, 30.917 + * so we have to be careful not to interfere with a 30.918 + * running system. 30.919 + */ 30.920 + if (new->flags & SA_SAMPLE_RANDOM) { 30.921 + /* 30.922 + * This function might sleep, we want to call it first, 30.923 + * outside of the atomic block. 30.924 + * Yes, this might clear the entropy pool if the wrong 30.925 + * driver is attempted to be loaded, without actually 30.926 + * installing a new handler, but is this really a problem, 30.927 + * only the sysadmin is able to do this. 30.928 + */ 30.929 + rand_initialize_irq(irq); 30.930 + } 30.931 + 30.932 + /* 30.933 + * The following block of code has to be executed atomically 30.934 + */ 30.935 + spin_lock_irqsave(&desc->lock,flags); 30.936 + p = &desc->action; 30.937 + if ((old = *p) != NULL) { 30.938 + /* Can't share interrupts unless both agree to */ 30.939 + if (!(old->flags & new->flags & SA_SHIRQ)) { 30.940 + spin_unlock_irqrestore(&desc->lock,flags); 30.941 + return -EBUSY; 30.942 + } 30.943 + 30.944 + /* add new interrupt at end of irq queue */ 30.945 + do { 30.946 + p = &old->next; 30.947 + old = *p; 30.948 + } while (old); 30.949 + shared = 1; 30.950 + } 30.951 + 30.952 + *p = new; 30.953 + 30.954 + if (!shared) { 30.955 + desc->depth = 0; 30.956 + desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | IRQ_WAITING); 30.957 + desc->handler->startup(irq); 30.958 + } 30.959 + spin_unlock_irqrestore(&desc->lock,flags); 30.960 + 30.961 + register_irq_proc(irq); 30.962 + return 0; 30.963 +} 30.964 + 30.965 +static struct proc_dir_entry * root_irq_dir; 30.966 +static struct proc_dir_entry * irq_dir [NR_IRQS]; 30.967 + 30.968 +#define HEX_DIGITS 8 30.969 + 30.970 +static unsigned int parse_hex_value (const char *buffer, 30.971 + unsigned long count, unsigned long *ret) 30.972 +{ 30.973 + unsigned char hexnum [HEX_DIGITS]; 30.974 + unsigned long value; 30.975 + int i; 30.976 + 30.977 + if (!count) 30.978 + return -EINVAL; 30.979 + if (count > HEX_DIGITS) 30.980 + count = HEX_DIGITS; 30.981 + if (copy_from_user(hexnum, buffer, count)) 30.982 + return -EFAULT; 30.983 + 30.984 + /* 30.985 + * Parse the first 8 characters as a hex string, any non-hex char 30.986 + * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same. 30.987 + */ 30.988 + value = 0; 30.989 + 30.990 + for (i = 0; i < count; i++) { 30.991 + unsigned int c = hexnum[i]; 30.992 + 30.993 + switch (c) { 30.994 + case '0' ... '9': c -= '0'; break; 30.995 + case 'a' ... 'f': c -= 'a'-10; break; 30.996 + case 'A' ... 'F': c -= 'A'-10; break; 30.997 + default: 30.998 + goto out; 30.999 + } 30.1000 + value = (value << 4) | c; 30.1001 + } 30.1002 +out: 30.1003 + *ret = value; 30.1004 + return 0; 30.1005 +} 30.1006 + 30.1007 +#if CONFIG_SMP 30.1008 + 30.1009 +static struct proc_dir_entry * smp_affinity_entry [NR_IRQS]; 30.1010 + 30.1011 +static unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL }; 30.1012 +static int irq_affinity_read_proc (char *page, char **start, off_t off, 30.1013 + int count, int *eof, void *data) 30.1014 +{ 30.1015 + if (count < HEX_DIGITS+1) 30.1016 + return -EINVAL; 30.1017 + return sprintf (page, "%08lx\n", irq_affinity[(long)data]); 30.1018 +} 30.1019 + 30.1020 +static int irq_affinity_write_proc (struct file *file, const char *buffer, 30.1021 + unsigned long count, void *data) 30.1022 +{ 30.1023 + int irq = (long) data, full_count = count, err; 30.1024 + unsigned long new_value; 30.1025 + 30.1026 + if (!irq_desc[irq].handler->set_affinity) 30.1027 + return -EIO; 30.1028 + 30.1029 + err = parse_hex_value(buffer, count, &new_value); 30.1030 + 30.1031 + /* 30.1032 + * Do not allow disabling IRQs completely - it's a too easy 30.1033 + * way to make the system unusable accidentally :-) At least 30.1034 + * one online CPU still has to be targeted. 30.1035 + */ 30.1036 + if (!(new_value & cpu_online_map)) 30.1037 + return -EINVAL; 30.1038 + 30.1039 + irq_affinity[irq] = new_value; 30.1040 + irq_desc[irq].handler->set_affinity(irq, new_value); 30.1041 + 30.1042 + return full_count; 30.1043 +} 30.1044 + 30.1045 +#endif 30.1046 + 30.1047 +static int prof_cpu_mask_read_proc (char *page, char **start, off_t off, 30.1048 + int count, int *eof, void *data) 30.1049 +{ 30.1050 + unsigned long *mask = (unsigned long *) data; 30.1051 + if (count < HEX_DIGITS+1) 30.1052 + return -EINVAL; 30.1053 + return sprintf (page, "%08lx\n", *mask); 30.1054 +} 30.1055 + 30.1056 +static int prof_cpu_mask_write_proc (struct file *file, const char *buffer, 30.1057 + unsigned long count, void *data) 30.1058 +{ 30.1059 + unsigned long *mask = (unsigned long *) data, full_count = count, err; 30.1060 + unsigned long new_value; 30.1061 + 30.1062 + err = parse_hex_value(buffer, count, &new_value); 30.1063 + if (err) 30.1064 + return err; 30.1065 + 30.1066 + *mask = new_value; 30.1067 + return full_count; 30.1068 +} 30.1069 + 30.1070 +#define MAX_NAMELEN 10 30.1071 + 30.1072 +static void register_irq_proc (unsigned int irq) 30.1073 +{ 30.1074 + char name [MAX_NAMELEN]; 30.1075 + 30.1076 + if (!root_irq_dir || (irq_desc[irq].handler == &no_irq_type) || 30.1077 + irq_dir[irq]) 30.1078 + return; 30.1079 + 30.1080 + memset(name, 0, MAX_NAMELEN); 30.1081 + sprintf(name, "%d", irq); 30.1082 + 30.1083 + /* create /proc/irq/1234 */ 30.1084 + irq_dir[irq] = proc_mkdir(name, root_irq_dir); 30.1085 + 30.1086 +#if CONFIG_SMP 30.1087 + { 30.1088 + struct proc_dir_entry *entry; 30.1089 + 30.1090 + /* create /proc/irq/1234/smp_affinity */ 30.1091 + entry = create_proc_entry("smp_affinity", 0600, irq_dir[irq]); 30.1092 + 30.1093 + if (entry) { 30.1094 + entry->nlink = 1; 30.1095 + entry->data = (void *)(long)irq; 30.1096 + entry->read_proc = irq_affinity_read_proc; 30.1097 + entry->write_proc = irq_affinity_write_proc; 30.1098 + } 30.1099 + 30.1100 + smp_affinity_entry[irq] = entry; 30.1101 + } 30.1102 +#endif 30.1103 +} 30.1104 + 30.1105 +unsigned long prof_cpu_mask = -1; 30.1106 + 30.1107 +void init_irq_proc (void) 30.1108 +{ 30.1109 + struct proc_dir_entry *entry; 30.1110 + int i; 30.1111 + 30.1112 + /* create /proc/irq */ 30.1113 + root_irq_dir = proc_mkdir("irq", 0); 30.1114 + 30.1115 + /* create /proc/irq/prof_cpu_mask */ 30.1116 + entry = create_proc_entry("prof_cpu_mask", 0600, root_irq_dir); 30.1117 + 30.1118 + if (!entry) 30.1119 + return; 30.1120 + 30.1121 + entry->nlink = 1; 30.1122 + entry->data = (void *)&prof_cpu_mask; 30.1123 + entry->read_proc = prof_cpu_mask_read_proc; 30.1124 + entry->write_proc = prof_cpu_mask_write_proc; 30.1125 + 30.1126 + /* 30.1127 + * Create entries for all existing IRQs. 30.1128 + */ 30.1129 + for (i = 0; i < NR_IRQS; i++) 30.1130 + register_irq_proc(i); 30.1131 +} 30.1132 +
31.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 31.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/kernel/ldt.c Mon Feb 24 16:55:07 2003 +0000 31.3 @@ -0,0 +1,26 @@ 31.4 +/* 31.5 + * linux/kernel/ldt.c 31.6 + * 31.7 + * Copyright (C) 1992 Krishna Balasubramanian and Linus Torvalds 31.8 + * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com> 31.9 + */ 31.10 + 31.11 +#include <linux/errno.h> 31.12 +#include <linux/sched.h> 31.13 +#include <linux/string.h> 31.14 +#include <linux/mm.h> 31.15 + 31.16 +/* 31.17 + * XXX KAF (28/7/02): This stuff is only used for DOS emulation, and is 31.18 + * the default way of finding current TCB in linuxthreads. Supporting 31.19 + * table update svia the hypervisor is feasible, but a hassle: for now, 31.20 + * recompiling linuxthreads is the most sensible option. 31.21 + * 31.22 + * Oh, this may become an issue depending on what JVM we use for 31.23 + * running the xeno-daemon. 31.24 + */ 31.25 + 31.26 +asmlinkage int sys_modify_ldt(int func, void *ptr, unsigned long bytecount) 31.27 +{ 31.28 + return -ENOSYS; 31.29 +}
32.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 32.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/kernel/process.c Mon Feb 24 16:55:07 2003 +0000 32.3 @@ -0,0 +1,454 @@ 32.4 +/* 32.5 + * linux/arch/i386/kernel/process.c 32.6 + * 32.7 + * Copyright (C) 1995 Linus Torvalds 32.8 + * 32.9 + * Pentium III FXSR, SSE support 32.10 + * Gareth Hughes <gareth@valinux.com>, May 2000 32.11 + */ 32.12 + 32.13 +/* 32.14 + * This file handles the architecture-dependent parts of process handling.. 32.15 + */ 32.16 + 32.17 +#define __KERNEL_SYSCALLS__ 32.18 +#include <stdarg.h> 32.19 + 32.20 +#include <linux/errno.h> 32.21 +#include <linux/sched.h> 32.22 +#include <linux/kernel.h> 32.23 +#include <linux/mm.h> 32.24 +#include <linux/smp.h> 32.25 +#include <linux/smp_lock.h> 32.26 +#include <linux/stddef.h> 32.27 +#include <linux/unistd.h> 32.28 +#include <linux/ptrace.h> 32.29 +#include <linux/slab.h> 32.30 +#include <linux/vmalloc.h> 32.31 +#include <linux/user.h> 32.32 +#include <linux/a.out.h> 32.33 +#include <linux/interrupt.h> 32.34 +#include <linux/config.h> 32.35 +#include <linux/delay.h> 32.36 +#include <linux/reboot.h> 32.37 +#include <linux/init.h> 32.38 +#include <linux/mc146818rtc.h> 32.39 +#include <linux/kdb.h> 32.40 + 32.41 +#include <asm/uaccess.h> 32.42 +#include <asm/pgtable.h> 32.43 +#include <asm/system.h> 32.44 +#include <asm/io.h> 32.45 +#include <asm/ldt.h> 32.46 +#include <asm/processor.h> 32.47 +#include <asm/i387.h> 32.48 +#include <asm/desc.h> 32.49 +#include <asm/mmu_context.h> 32.50 + 32.51 +#include <linux/irq.h> 32.52 + 32.53 +asmlinkage void ret_from_fork(void) __asm__("ret_from_fork"); 32.54 + 32.55 +int hlt_counter; 32.56 + 32.57 +/* 32.58 + * Powermanagement idle function, if any.. 32.59 + */ 32.60 +void (*pm_idle)(void); 32.61 + 32.62 +/* 32.63 + * Power off function, if any 32.64 + */ 32.65 +void (*pm_power_off)(void); 32.66 + 32.67 +void disable_hlt(void) 32.68 +{ 32.69 + hlt_counter++; 32.70 +} 32.71 + 32.72 +void enable_hlt(void) 32.73 +{ 32.74 + hlt_counter--; 32.75 +} 32.76 + 32.77 +/* 32.78 + * The idle thread. There's no useful work to be 32.79 + * done, so just try to conserve power and have a 32.80 + * low exit latency (ie sit in a loop waiting for 32.81 + * somebody to say that they'd like to reschedule) 32.82 + */ 32.83 +void cpu_idle (void) 32.84 +{ 32.85 + /* endless idle loop with no priority at all */ 32.86 + init_idle(); 32.87 + current->nice = 20; 32.88 + current->counter = -100; 32.89 + 32.90 + while (1) { 32.91 + while (!current->need_resched) 32.92 + HYPERVISOR_do_sched_op(NULL); 32.93 + schedule(); 32.94 + check_pgt_cache(); 32.95 + } 32.96 +} 32.97 + 32.98 +void machine_restart(char * __unused) 32.99 +{ 32.100 + HYPERVISOR_exit(); 32.101 +} 32.102 + 32.103 +void machine_halt(void) 32.104 +{ 32.105 + HYPERVISOR_exit(); 32.106 +} 32.107 + 32.108 +void machine_power_off(void) 32.109 +{ 32.110 + HYPERVISOR_exit(); 32.111 +} 32.112 + 32.113 +extern void show_trace(unsigned long* esp); 32.114 + 32.115 +void show_regs(struct pt_regs * regs) 32.116 +{ 32.117 + printk("\n"); 32.118 + printk("Pid: %d, comm: %20s\n", current->pid, current->comm); 32.119 + printk("EIP: %04x:[<%08lx>] CPU: %d",0xffff & regs->xcs,regs->eip, smp_processor_id()); 32.120 + if (regs->xcs & 2) 32.121 + printk(" ESP: %04x:%08lx",0xffff & regs->xss,regs->esp); 32.122 + printk(" EFLAGS: %08lx %s\n",regs->eflags, print_tainted()); 32.123 + printk("EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n", 32.124 + regs->eax,regs->ebx,regs->ecx,regs->edx); 32.125 + printk("ESI: %08lx EDI: %08lx EBP: %08lx", 32.126 + regs->esi, regs->edi, regs->ebp); 32.127 + printk(" DS: %04x ES: %04x\n", 32.128 + 0xffff & regs->xds,0xffff & regs->xes); 32.129 + 32.130 + show_trace(®s->esp); 32.131 +} 32.132 + 32.133 +/* 32.134 + * No need to lock the MM as we are the last user 32.135 + */ 32.136 +void release_segments(struct mm_struct *mm) 32.137 +{ 32.138 + void * ldt = mm->context.segments; 32.139 + 32.140 + /* 32.141 + * free the LDT 32.142 + */ 32.143 + if (ldt) { 32.144 + mm->context.segments = NULL; 32.145 + clear_LDT(); 32.146 + vfree(ldt); 32.147 + } 32.148 +} 32.149 + 32.150 +/* 32.151 + * Create a kernel thread 32.152 + */ 32.153 +int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) 32.154 +{ 32.155 + long retval, d0; 32.156 + 32.157 + __asm__ __volatile__( 32.158 + "movl %%esp,%%esi\n\t" 32.159 + "int $0x80\n\t" /* Linux/i386 system call */ 32.160 + "cmpl %%esp,%%esi\n\t" /* child or parent? */ 32.161 + "je 1f\n\t" /* parent - jump */ 32.162 + /* Load the argument into eax, and push it. That way, it does 32.163 + * not matter whether the called function is compiled with 32.164 + * -mregparm or not. */ 32.165 + "movl %4,%%eax\n\t" 32.166 + "pushl %%eax\n\t" 32.167 + "call *%5\n\t" /* call fn */ 32.168 + "movl %3,%0\n\t" /* exit */ 32.169 + "int $0x80\n" 32.170 + "1:\t" 32.171 + :"=&a" (retval), "=&S" (d0) 32.172 + :"0" (__NR_clone), "i" (__NR_exit), 32.173 + "r" (arg), "r" (fn), 32.174 + "b" (flags | CLONE_VM) 32.175 + : "memory"); 32.176 + 32.177 + return retval; 32.178 +} 32.179 + 32.180 +/* 32.181 + * Free current thread data structures etc.. 32.182 + */ 32.183 +void exit_thread(void) 32.184 +{ 32.185 + /* nothing to do ... */ 32.186 +} 32.187 + 32.188 +void flush_thread(void) 32.189 +{ 32.190 + struct task_struct *tsk = current; 32.191 + 32.192 + memset(tsk->thread.debugreg, 0, sizeof(unsigned long)*8); 32.193 + 32.194 + /* 32.195 + * Forget coprocessor state.. 32.196 + */ 32.197 + clear_fpu(tsk); 32.198 + tsk->used_math = 0; 32.199 +} 32.200 + 32.201 +void release_thread(struct task_struct *dead_task) 32.202 +{ 32.203 + if (dead_task->mm) { 32.204 + void * ldt = dead_task->mm->context.segments; 32.205 + 32.206 + // temporary debugging check 32.207 + if (ldt) { 32.208 + printk("WARNING: dead process %8s still has LDT? <%p>\n", 32.209 + dead_task->comm, ldt); 32.210 + BUG(); 32.211 + } 32.212 + } 32.213 +} 32.214 + 32.215 +/* 32.216 + * we do not have to muck with descriptors here, that is 32.217 + * done in switch_mm() as needed. 32.218 + */ 32.219 +void copy_segments(struct task_struct *p, struct mm_struct *new_mm) 32.220 +{ 32.221 + struct mm_struct * old_mm; 32.222 + void *old_ldt, *ldt; 32.223 + 32.224 + ldt = NULL; 32.225 + old_mm = current->mm; 32.226 + if (old_mm && (old_ldt = old_mm->context.segments) != NULL) { 32.227 + /* 32.228 + * Completely new LDT, we initialize it from the parent: 32.229 + */ 32.230 + ldt = vmalloc(LDT_ENTRIES*LDT_ENTRY_SIZE); 32.231 + if (!ldt) 32.232 + printk(KERN_WARNING "ldt allocation failed\n"); 32.233 + else 32.234 + memcpy(ldt, old_ldt, LDT_ENTRIES*LDT_ENTRY_SIZE); 32.235 + } 32.236 + new_mm->context.segments = ldt; 32.237 + new_mm->context.cpuvalid = ~0UL; /* valid on all CPU's - they can't have stale data */ 32.238 +} 32.239 + 32.240 +/* 32.241 + * Save a segment. 32.242 + */ 32.243 +#define savesegment(seg,value) \ 32.244 + asm volatile("movl %%" #seg ",%0":"=m" (*(int *)&(value))) 32.245 + 32.246 +int copy_thread(int nr, unsigned long clone_flags, unsigned long esp, 32.247 + unsigned long unused, 32.248 + struct task_struct * p, struct pt_regs * regs) 32.249 +{ 32.250 + struct pt_regs * childregs; 32.251 + 32.252 + childregs = ((struct pt_regs *) (THREAD_SIZE + (unsigned long) p)) - 1; 32.253 + struct_cpy(childregs, regs); 32.254 + childregs->eax = 0; 32.255 + childregs->esp = esp; 32.256 + 32.257 + p->thread.esp = (unsigned long) childregs; 32.258 + p->thread.esp0 = (unsigned long) (childregs+1); 32.259 + 32.260 + p->thread.eip = (unsigned long) ret_from_fork; 32.261 + 32.262 + savesegment(fs,p->thread.fs); 32.263 + savesegment(gs,p->thread.gs); 32.264 + 32.265 + unlazy_fpu(current); 32.266 + struct_cpy(&p->thread.i387, ¤t->thread.i387); 32.267 + 32.268 + return 0; 32.269 +} 32.270 + 32.271 +/* 32.272 + * fill in the user structure for a core dump.. 32.273 + */ 32.274 +void dump_thread(struct pt_regs * regs, struct user * dump) 32.275 +{ 32.276 + int i; 32.277 + 32.278 +/* changed the size calculations - should hopefully work better. lbt */ 32.279 + dump->magic = CMAGIC; 32.280 + dump->start_code = 0; 32.281 + dump->start_stack = regs->esp & ~(PAGE_SIZE - 1); 32.282 + dump->u_tsize = ((unsigned long) current->mm->end_code) >> PAGE_SHIFT; 32.283 + dump->u_dsize = ((unsigned long) (current->mm->brk + (PAGE_SIZE-1))) >> PAGE_SHIFT; 32.284 + dump->u_dsize -= dump->u_tsize; 32.285 + dump->u_ssize = 0; 32.286 + for (i = 0; i < 8; i++) 32.287 + dump->u_debugreg[i] = current->thread.debugreg[i]; 32.288 + 32.289 + if (dump->start_stack < TASK_SIZE) 32.290 + dump->u_ssize = ((unsigned long) (TASK_SIZE - dump->start_stack)) >> PAGE_SHIFT; 32.291 + 32.292 + dump->regs.ebx = regs->ebx; 32.293 + dump->regs.ecx = regs->ecx; 32.294 + dump->regs.edx = regs->edx; 32.295 + dump->regs.esi = regs->esi; 32.296 + dump->regs.edi = regs->edi; 32.297 + dump->regs.ebp = regs->ebp; 32.298 + dump->regs.eax = regs->eax; 32.299 + dump->regs.ds = regs->xds; 32.300 + dump->regs.es = regs->xes; 32.301 + savesegment(fs,dump->regs.fs); 32.302 + savesegment(gs,dump->regs.gs); 32.303 + dump->regs.orig_eax = regs->orig_eax; 32.304 + dump->regs.eip = regs->eip; 32.305 + dump->regs.cs = regs->xcs; 32.306 + dump->regs.eflags = regs->eflags; 32.307 + dump->regs.esp = regs->esp; 32.308 + dump->regs.ss = regs->xss; 32.309 + 32.310 + dump->u_fpvalid = dump_fpu (regs, &dump->i387); 32.311 +} 32.312 + 32.313 +/* 32.314 + * switch_to(x,yn) should switch tasks from x to y. 32.315 + * 32.316 + * We fsave/fwait so that an exception goes off at the right time 32.317 + * (as a call from the fsave or fwait in effect) rather than to 32.318 + * the wrong process. Lazy FP saving no longer makes any sense 32.319 + * with modern CPU's, and this simplifies a lot of things (SMP 32.320 + * and UP become the same). 32.321 + * 32.322 + * NOTE! We used to use the x86 hardware context switching. The 32.323 + * reason for not using it any more becomes apparent when you 32.324 + * try to recover gracefully from saved state that is no longer 32.325 + * valid (stale segment register values in particular). With the 32.326 + * hardware task-switch, there is no way to fix up bad state in 32.327 + * a reasonable manner. 32.328 + * 32.329 + * The fact that Intel documents the hardware task-switching to 32.330 + * be slow is a fairly red herring - this code is not noticeably 32.331 + * faster. However, there _is_ some room for improvement here, 32.332 + * so the performance issues may eventually be a valid point. 32.333 + * More important, however, is the fact that this allows us much 32.334 + * more flexibility. 32.335 + */ 32.336 +void __switch_to(struct task_struct *prev_p, struct task_struct *next_p) 32.337 +{ 32.338 + struct thread_struct *prev = &prev_p->thread, 32.339 + *next = &next_p->thread; 32.340 + 32.341 + unlazy_fpu(prev_p); 32.342 + 32.343 + HYPERVISOR_stack_and_ldt_switch(__KERNEL_DS, next->esp0, 0); 32.344 + 32.345 + /* 32.346 + * Save away %fs and %gs. No need to save %es and %ds, as 32.347 + * those are always kernel segments while inside the kernel. 32.348 + */ 32.349 + asm volatile("movl %%fs,%0":"=m" (*(int *)&prev->fs)); 32.350 + asm volatile("movl %%gs,%0":"=m" (*(int *)&prev->gs)); 32.351 + 32.352 + /* 32.353 + * Restore %fs and %gs. 32.354 + */ 32.355 + loadsegment(fs, next->fs); 32.356 + loadsegment(gs, next->gs); 32.357 + 32.358 + /* 32.359 + * Now maybe reload the debug registers 32.360 + */ 32.361 + if ( next->debugreg[7] != 0 ) 32.362 + { 32.363 + HYPERVISOR_set_debugreg(0, next->debugreg[0]); 32.364 + HYPERVISOR_set_debugreg(1, next->debugreg[1]); 32.365 + HYPERVISOR_set_debugreg(2, next->debugreg[2]); 32.366 + HYPERVISOR_set_debugreg(3, next->debugreg[3]); 32.367 + /* no 4 and 5 */ 32.368 + HYPERVISOR_set_debugreg(6, next->debugreg[6]); 32.369 + HYPERVISOR_set_debugreg(7, next->debugreg[7]); 32.370 + } 32.371 +} 32.372 + 32.373 +asmlinkage int sys_fork(struct pt_regs regs) 32.374 +{ 32.375 + return do_fork(SIGCHLD, regs.esp, ®s, 0); 32.376 +} 32.377 + 32.378 +asmlinkage int sys_clone(struct pt_regs regs) 32.379 +{ 32.380 + unsigned long clone_flags; 32.381 + unsigned long newsp; 32.382 + 32.383 + clone_flags = regs.ebx; 32.384 + newsp = regs.ecx; 32.385 + if (!newsp) 32.386 + newsp = regs.esp; 32.387 + return do_fork(clone_flags, newsp, ®s, 0); 32.388 +} 32.389 + 32.390 +/* 32.391 + * This is trivial, and on the face of it looks like it 32.392 + * could equally well be done in user mode. 32.393 + * 32.394 + * Not so, for quite unobvious reasons - register pressure. 32.395 + * In user mode vfork() cannot have a stack frame, and if 32.396 + * done by calling the "clone()" system call directly, you 32.397 + * do not have enough call-clobbered registers to hold all 32.398 + * the information you need. 32.399 + */ 32.400 +asmlinkage int sys_vfork(struct pt_regs regs) 32.401 +{ 32.402 + return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs.esp, ®s, 0); 32.403 +} 32.404 + 32.405 +/* 32.406 + * sys_execve() executes a new program. 32.407 + */ 32.408 +asmlinkage int sys_execve(struct pt_regs regs) 32.409 +{ 32.410 + int error; 32.411 + char * filename; 32.412 + 32.413 + filename = getname((char *) regs.ebx); 32.414 + error = PTR_ERR(filename); 32.415 + if (IS_ERR(filename)) 32.416 + goto out; 32.417 + error = do_execve(filename, (char **) regs.ecx, (char **) regs.edx, ®s); 32.418 + if (error == 0) 32.419 + current->ptrace &= ~PT_DTRACE; 32.420 + putname(filename); 32.421 + out: 32.422 + return error; 32.423 +} 32.424 + 32.425 +/* 32.426 + * These bracket the sleeping functions.. 32.427 + */ 32.428 +extern void scheduling_functions_start_here(void); 32.429 +extern void scheduling_functions_end_here(void); 32.430 +#define first_sched ((unsigned long) scheduling_functions_start_here) 32.431 +#define last_sched ((unsigned long) scheduling_functions_end_here) 32.432 + 32.433 +unsigned long get_wchan(struct task_struct *p) 32.434 +{ 32.435 + unsigned long ebp, esp, eip; 32.436 + unsigned long stack_page; 32.437 + int count = 0; 32.438 + if (!p || p == current || p->state == TASK_RUNNING) 32.439 + return 0; 32.440 + stack_page = (unsigned long)p; 32.441 + esp = p->thread.esp; 32.442 + if (!stack_page || esp < stack_page || esp > 8188+stack_page) 32.443 + return 0; 32.444 + /* include/asm-i386/system.h:switch_to() pushes ebp last. */ 32.445 + ebp = *(unsigned long *) esp; 32.446 + do { 32.447 + if (ebp < stack_page || ebp > 8184+stack_page) 32.448 + return 0; 32.449 + eip = *(unsigned long *) (ebp+4); 32.450 + if (eip < first_sched || eip >= last_sched) 32.451 + return eip; 32.452 + ebp = *(unsigned long *) ebp; 32.453 + } while (count++ < 16); 32.454 + return 0; 32.455 +} 32.456 +#undef last_sched 32.457 +#undef first_sched
33.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 33.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/kernel/ptrace.c Mon Feb 24 16:55:07 2003 +0000 33.3 @@ -0,0 +1,463 @@ 33.4 +/* ptrace.c */ 33.5 +/* By Ross Biro 1/23/92 */ 33.6 +/* 33.7 + * Pentium III FXSR, SSE support 33.8 + * Gareth Hughes <gareth@valinux.com>, May 2000 33.9 + */ 33.10 + 33.11 +#include <linux/kernel.h> 33.12 +#include <linux/sched.h> 33.13 +#include <linux/mm.h> 33.14 +#include <linux/smp.h> 33.15 +#include <linux/smp_lock.h> 33.16 +#include <linux/errno.h> 33.17 +#include <linux/ptrace.h> 33.18 +#include <linux/user.h> 33.19 + 33.20 +#include <asm/uaccess.h> 33.21 +#include <asm/pgtable.h> 33.22 +#include <asm/system.h> 33.23 +#include <asm/processor.h> 33.24 +#include <asm/i387.h> 33.25 +#include <asm/debugreg.h> 33.26 + 33.27 +/* 33.28 + * does not yet catch signals sent when the child dies. 33.29 + * in exit.c or in signal.c. 33.30 + */ 33.31 + 33.32 +/* determines which flags the user has access to. */ 33.33 +/* 1 = access 0 = no access */ 33.34 +#define FLAG_MASK 0x00044dd5 33.35 + 33.36 +/* set's the trap flag. */ 33.37 +#define TRAP_FLAG 0x100 33.38 + 33.39 +/* 33.40 + * Offset of eflags on child stack.. 33.41 + */ 33.42 +#define EFL_OFFSET ((EFL-2)*4-sizeof(struct pt_regs)) 33.43 + 33.44 +/* 33.45 + * this routine will get a word off of the processes privileged stack. 33.46 + * the offset is how far from the base addr as stored in the TSS. 33.47 + * this routine assumes that all the privileged stacks are in our 33.48 + * data space. 33.49 + */ 33.50 +static inline int get_stack_long(struct task_struct *task, int offset) 33.51 +{ 33.52 + unsigned char *stack; 33.53 + 33.54 + stack = (unsigned char *)task->thread.esp0; 33.55 + stack += offset; 33.56 + return (*((int *)stack)); 33.57 +} 33.58 + 33.59 +/* 33.60 + * this routine will put a word on the processes privileged stack. 33.61 + * the offset is how far from the base addr as stored in the TSS. 33.62 + * this routine assumes that all the privileged stacks are in our 33.63 + * data space. 33.64 + */ 33.65 +static inline int put_stack_long(struct task_struct *task, int offset, 33.66 + unsigned long data) 33.67 +{ 33.68 + unsigned char * stack; 33.69 + 33.70 + stack = (unsigned char *) task->thread.esp0; 33.71 + stack += offset; 33.72 + *(unsigned long *) stack = data; 33.73 + return 0; 33.74 +} 33.75 + 33.76 +static int putreg(struct task_struct *child, 33.77 + unsigned long regno, unsigned long value) 33.78 +{ 33.79 + switch (regno >> 2) { 33.80 + case FS: 33.81 + if (value && (value & 3) != 3) 33.82 + return -EIO; 33.83 + child->thread.fs = value; 33.84 + return 0; 33.85 + case GS: 33.86 + if (value && (value & 3) != 3) 33.87 + return -EIO; 33.88 + child->thread.gs = value; 33.89 + return 0; 33.90 + case DS: 33.91 + case ES: 33.92 + if (value && (value & 3) != 3) 33.93 + return -EIO; 33.94 + value &= 0xffff; 33.95 + break; 33.96 + case SS: 33.97 + case CS: 33.98 + if ((value & 3) != 3) 33.99 + return -EIO; 33.100 + value &= 0xffff; 33.101 + break; 33.102 + case EFL: 33.103 + value &= FLAG_MASK; 33.104 + value |= get_stack_long(child, EFL_OFFSET) & ~FLAG_MASK; 33.105 + break; 33.106 + } 33.107 + if (regno > GS*4) 33.108 + regno -= 2*4; 33.109 + put_stack_long(child, regno - sizeof(struct pt_regs), value); 33.110 + return 0; 33.111 +} 33.112 + 33.113 +static unsigned long getreg(struct task_struct *child, 33.114 + unsigned long regno) 33.115 +{ 33.116 + unsigned long retval = ~0UL; 33.117 + 33.118 + switch (regno >> 2) { 33.119 + case FS: 33.120 + retval = child->thread.fs; 33.121 + break; 33.122 + case GS: 33.123 + retval = child->thread.gs; 33.124 + break; 33.125 + case DS: 33.126 + case ES: 33.127 + case SS: 33.128 + case CS: 33.129 + retval = 0xffff; 33.130 + /* fall through */ 33.131 + default: 33.132 + if (regno > GS*4) 33.133 + regno -= 2*4; 33.134 + regno = regno - sizeof(struct pt_regs); 33.135 + retval &= get_stack_long(child, regno); 33.136 + } 33.137 + return retval; 33.138 +} 33.139 + 33.140 +/* 33.141 + * Called by kernel/ptrace.c when detaching.. 33.142 + * 33.143 + * Make sure the single step bit is not set. 33.144 + */ 33.145 +void ptrace_disable(struct task_struct *child) 33.146 +{ 33.147 + long tmp; 33.148 + 33.149 + tmp = get_stack_long(child, EFL_OFFSET) & ~TRAP_FLAG; 33.150 + put_stack_long(child, EFL_OFFSET, tmp); 33.151 +} 33.152 + 33.153 +asmlinkage int sys_ptrace(long request, long pid, long addr, long data) 33.154 +{ 33.155 + struct task_struct *child; 33.156 + struct user * dummy = NULL; 33.157 + int i, ret; 33.158 + 33.159 + lock_kernel(); 33.160 + ret = -EPERM; 33.161 + if (request == PTRACE_TRACEME) { 33.162 + /* are we already being traced? */ 33.163 + if (current->ptrace & PT_PTRACED) 33.164 + goto out; 33.165 + /* set the ptrace bit in the process flags. */ 33.166 + current->ptrace |= PT_PTRACED; 33.167 + ret = 0; 33.168 + goto out; 33.169 + } 33.170 + ret = -ESRCH; 33.171 + read_lock(&tasklist_lock); 33.172 + child = find_task_by_pid(pid); 33.173 + if (child) 33.174 + get_task_struct(child); 33.175 + read_unlock(&tasklist_lock); 33.176 + if (!child) 33.177 + goto out; 33.178 + 33.179 + ret = -EPERM; 33.180 + if (pid == 1) /* you may not mess with init */ 33.181 + goto out_tsk; 33.182 + 33.183 + if (request == PTRACE_ATTACH) { 33.184 + ret = ptrace_attach(child); 33.185 + goto out_tsk; 33.186 + } 33.187 + 33.188 + ret = ptrace_check_attach(child, request == PTRACE_KILL); 33.189 + if (ret < 0) 33.190 + goto out_tsk; 33.191 + 33.192 + switch (request) { 33.193 + /* when I and D space are separate, these will need to be fixed. */ 33.194 + case PTRACE_PEEKTEXT: /* read word at location addr. */ 33.195 + case PTRACE_PEEKDATA: { 33.196 + unsigned long tmp; 33.197 + int copied; 33.198 + 33.199 + copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 0); 33.200 + ret = -EIO; 33.201 + if (copied != sizeof(tmp)) 33.202 + break; 33.203 + ret = put_user(tmp,(unsigned long *) data); 33.204 + break; 33.205 + } 33.206 + 33.207 + /* read the word at location addr in the USER area. */ 33.208 + case PTRACE_PEEKUSR: { 33.209 + unsigned long tmp; 33.210 + 33.211 + ret = -EIO; 33.212 + if ((addr & 3) || addr < 0 || 33.213 + addr > sizeof(struct user) - 3) 33.214 + break; 33.215 + 33.216 + tmp = 0; /* Default return condition */ 33.217 + if(addr < FRAME_SIZE*sizeof(long)) 33.218 + tmp = getreg(child, addr); 33.219 + if(addr >= (long) &dummy->u_debugreg[0] && 33.220 + addr <= (long) &dummy->u_debugreg[7]){ 33.221 + addr -= (long) &dummy->u_debugreg[0]; 33.222 + addr = addr >> 2; 33.223 + tmp = child->thread.debugreg[addr]; 33.224 + } 33.225 + ret = put_user(tmp,(unsigned long *) data); 33.226 + break; 33.227 + } 33.228 + 33.229 + /* when I and D space are separate, this will have to be fixed. */ 33.230 + case PTRACE_POKETEXT: /* write the word at location addr. */ 33.231 + case PTRACE_POKEDATA: 33.232 + ret = 0; 33.233 + if (access_process_vm(child, addr, &data, sizeof(data), 1) == sizeof(data)) 33.234 + break; 33.235 + ret = -EIO; 33.236 + break; 33.237 + 33.238 + case PTRACE_POKEUSR: /* write the word at location addr in the USER area */ 33.239 + ret = -EIO; 33.240 + if ((addr & 3) || addr < 0 || 33.241 + addr > sizeof(struct user) - 3) 33.242 + break; 33.243 + 33.244 + if (addr < FRAME_SIZE*sizeof(long)) { 33.245 + ret = putreg(child, addr, data); 33.246 + break; 33.247 + } 33.248 + /* We need to be very careful here. We implicitly 33.249 + want to modify a portion of the task_struct, and we 33.250 + have to be selective about what portions we allow someone 33.251 + to modify. */ 33.252 + 33.253 + ret = -EIO; 33.254 + if(addr >= (long) &dummy->u_debugreg[0] && 33.255 + addr <= (long) &dummy->u_debugreg[7]){ 33.256 + 33.257 + if(addr == (long) &dummy->u_debugreg[4]) break; 33.258 + if(addr == (long) &dummy->u_debugreg[5]) break; 33.259 + if(addr < (long) &dummy->u_debugreg[4] && 33.260 + ((unsigned long) data) >= TASK_SIZE-3) break; 33.261 + 33.262 + if(addr == (long) &dummy->u_debugreg[7]) { 33.263 + data &= ~DR_CONTROL_RESERVED; 33.264 + for(i=0; i<4; i++) 33.265 + if ((0x5f54 >> ((data >> (16 + 4*i)) & 0xf)) & 1) 33.266 + goto out_tsk; 33.267 + } 33.268 + 33.269 + addr -= (long) &dummy->u_debugreg; 33.270 + addr = addr >> 2; 33.271 + child->thread.debugreg[addr] = data; 33.272 + ret = 0; 33.273 + } 33.274 + break; 33.275 + 33.276 + case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */ 33.277 + case PTRACE_CONT: { /* restart after signal. */ 33.278 + long tmp; 33.279 + 33.280 + ret = -EIO; 33.281 + if ((unsigned long) data > _NSIG) 33.282 + break; 33.283 + if (request == PTRACE_SYSCALL) 33.284 + child->ptrace |= PT_TRACESYS; 33.285 + else 33.286 + child->ptrace &= ~PT_TRACESYS; 33.287 + child->exit_code = data; 33.288 + /* make sure the single step bit is not set. */ 33.289 + tmp = get_stack_long(child, EFL_OFFSET) & ~TRAP_FLAG; 33.290 + put_stack_long(child, EFL_OFFSET,tmp); 33.291 + wake_up_process(child); 33.292 + ret = 0; 33.293 + break; 33.294 + } 33.295 + 33.296 +/* 33.297 + * make the child exit. Best I can do is send it a sigkill. 33.298 + * perhaps it should be put in the status that it wants to 33.299 + * exit. 33.300 + */ 33.301 + case PTRACE_KILL: { 33.302 + long tmp; 33.303 + 33.304 + ret = 0; 33.305 + if (child->state == TASK_ZOMBIE) /* already dead */ 33.306 + break; 33.307 + child->exit_code = SIGKILL; 33.308 + /* make sure the single step bit is not set. */ 33.309 + tmp = get_stack_long(child, EFL_OFFSET) & ~TRAP_FLAG; 33.310 + put_stack_long(child, EFL_OFFSET, tmp); 33.311 + wake_up_process(child); 33.312 + break; 33.313 + } 33.314 + 33.315 + case PTRACE_SINGLESTEP: { /* set the trap flag. */ 33.316 + long tmp; 33.317 + 33.318 + ret = -EIO; 33.319 + if ((unsigned long) data > _NSIG) 33.320 + break; 33.321 + child->ptrace &= ~PT_TRACESYS; 33.322 + if ((child->ptrace & PT_DTRACE) == 0) { 33.323 + /* Spurious delayed TF traps may occur */ 33.324 + child->ptrace |= PT_DTRACE; 33.325 + } 33.326 + tmp = get_stack_long(child, EFL_OFFSET) | TRAP_FLAG; 33.327 + put_stack_long(child, EFL_OFFSET, tmp); 33.328 + child->exit_code = data; 33.329 + /* give it a chance to run. */ 33.330 + wake_up_process(child); 33.331 + ret = 0; 33.332 + break; 33.333 + } 33.334 + 33.335 + case PTRACE_DETACH: 33.336 + /* detach a process that was attached. */ 33.337 + ret = ptrace_detach(child, data); 33.338 + break; 33.339 + 33.340 + case PTRACE_GETREGS: { /* Get all gp regs from the child. */ 33.341 + if (!access_ok(VERIFY_WRITE, (unsigned *)data, FRAME_SIZE*sizeof(long))) { 33.342 + ret = -EIO; 33.343 + break; 33.344 + } 33.345 + for ( i = 0; i < FRAME_SIZE*sizeof(long); i += sizeof(long) ) { 33.346 + __put_user(getreg(child, i),(unsigned long *) data); 33.347 + data += sizeof(long); 33.348 + } 33.349 + ret = 0; 33.350 + break; 33.351 + } 33.352 + 33.353 + case PTRACE_SETREGS: { /* Set all gp regs in the child. */ 33.354 + unsigned long tmp; 33.355 + if (!access_ok(VERIFY_READ, (unsigned *)data, FRAME_SIZE*sizeof(long))) { 33.356 + ret = -EIO; 33.357 + break; 33.358 + } 33.359 + for ( i = 0; i < FRAME_SIZE*sizeof(long); i += sizeof(long) ) { 33.360 + __get_user(tmp, (unsigned long *) data); 33.361 + putreg(child, i, tmp); 33.362 + data += sizeof(long); 33.363 + } 33.364 + ret = 0; 33.365 + break; 33.366 + } 33.367 + 33.368 + case PTRACE_GETFPREGS: { /* Get the child FPU state. */ 33.369 + if (!access_ok(VERIFY_WRITE, (unsigned *)data, 33.370 + sizeof(struct user_i387_struct))) { 33.371 + ret = -EIO; 33.372 + break; 33.373 + } 33.374 + ret = 0; 33.375 + if ( !child->used_math ) { 33.376 + /* Simulate an empty FPU. */ 33.377 + set_fpu_cwd(child, 0x037f); 33.378 + set_fpu_swd(child, 0x0000); 33.379 + set_fpu_twd(child, 0xffff); 33.380 + } 33.381 + get_fpregs((struct user_i387_struct *)data, child); 33.382 + break; 33.383 + } 33.384 + 33.385 + case PTRACE_SETFPREGS: { /* Set the child FPU state. */ 33.386 + if (!access_ok(VERIFY_READ, (unsigned *)data, 33.387 + sizeof(struct user_i387_struct))) { 33.388 + ret = -EIO; 33.389 + break; 33.390 + } 33.391 + child->used_math = 1; 33.392 + set_fpregs(child, (struct user_i387_struct *)data); 33.393 + ret = 0; 33.394 + break; 33.395 + } 33.396 + 33.397 + case PTRACE_GETFPXREGS: { /* Get the child extended FPU state. */ 33.398 + if (!access_ok(VERIFY_WRITE, (unsigned *)data, 33.399 + sizeof(struct user_fxsr_struct))) { 33.400 + ret = -EIO; 33.401 + break; 33.402 + } 33.403 + if ( !child->used_math ) { 33.404 + /* Simulate an empty FPU. */ 33.405 + set_fpu_cwd(child, 0x037f); 33.406 + set_fpu_swd(child, 0x0000); 33.407 + set_fpu_twd(child, 0xffff); 33.408 + set_fpu_mxcsr(child, 0x1f80); 33.409 + } 33.410 + ret = get_fpxregs((struct user_fxsr_struct *)data, child); 33.411 + break; 33.412 + } 33.413 + 33.414 + case PTRACE_SETFPXREGS: { /* Set the child extended FPU state. */ 33.415 + if (!access_ok(VERIFY_READ, (unsigned *)data, 33.416 + sizeof(struct user_fxsr_struct))) { 33.417 + ret = -EIO; 33.418 + break; 33.419 + } 33.420 + child->used_math = 1; 33.421 + ret = set_fpxregs(child, (struct user_fxsr_struct *)data); 33.422 + break; 33.423 + } 33.424 + 33.425 + case PTRACE_SETOPTIONS: { 33.426 + if (data & PTRACE_O_TRACESYSGOOD) 33.427 + child->ptrace |= PT_TRACESYSGOOD; 33.428 + else 33.429 + child->ptrace &= ~PT_TRACESYSGOOD; 33.430 + ret = 0; 33.431 + break; 33.432 + } 33.433 + 33.434 + default: 33.435 + ret = -EIO; 33.436 + break; 33.437 + } 33.438 +out_tsk: 33.439 + free_task_struct(child); 33.440 +out: 33.441 + unlock_kernel(); 33.442 + return ret; 33.443 +} 33.444 + 33.445 +asmlinkage void syscall_trace(void) 33.446 +{ 33.447 + if ((current->ptrace & (PT_PTRACED|PT_TRACESYS)) != 33.448 + (PT_PTRACED|PT_TRACESYS)) 33.449 + return; 33.450 + /* the 0x80 provides a way for the tracing parent to distinguish 33.451 + between a syscall stop and SIGTRAP delivery */ 33.452 + current->exit_code = SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) 33.453 + ? 0x80 : 0); 33.454 + current->state = TASK_STOPPED; 33.455 + notify_parent(current, SIGCHLD); 33.456 + schedule(); 33.457 + /* 33.458 + * this isn't the same as continuing with a signal, but it will do 33.459 + * for normal use. strace only continues with a signal if the 33.460 + * stopping signal is not SIGTRAP. -brl 33.461 + */ 33.462 + if (current->exit_code) { 33.463 + send_sig(current->exit_code, current, 1); 33.464 + current->exit_code = 0; 33.465 + } 33.466 +}
34.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 34.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/kernel/semaphore.c Mon Feb 24 16:55:07 2003 +0000 34.3 @@ -0,0 +1,292 @@ 34.4 +/* 34.5 + * i386 semaphore implementation. 34.6 + * 34.7 + * (C) Copyright 1999 Linus Torvalds 34.8 + * 34.9 + * Portions Copyright 1999 Red Hat, Inc. 34.10 + * 34.11 + * This program is free software; you can redistribute it and/or 34.12 + * modify it under the terms of the GNU General Public License 34.13 + * as published by the Free Software Foundation; either version 34.14 + * 2 of the License, or (at your option) any later version. 34.15 + * 34.16 + * rw semaphores implemented November 1999 by Benjamin LaHaise <bcrl@redhat.com> 34.17 + */ 34.18 +#include <linux/config.h> 34.19 +#include <linux/sched.h> 34.20 +#include <asm/semaphore.h> 34.21 + 34.22 +/* 34.23 + * Semaphores are implemented using a two-way counter: 34.24 + * The "count" variable is decremented for each process 34.25 + * that tries to acquire the semaphore, while the "sleeping" 34.26 + * variable is a count of such acquires. 34.27 + * 34.28 + * Notably, the inline "up()" and "down()" functions can 34.29 + * efficiently test if they need to do any extra work (up 34.30 + * needs to do something only if count was negative before 34.31 + * the increment operation. 34.32 + * 34.33 + * "sleeping" and the contention routine ordering is 34.34 + * protected by the semaphore spinlock. 34.35 + * 34.36 + * Note that these functions are only called when there is 34.37 + * contention on the lock, and as such all this is the 34.38 + * "non-critical" part of the whole semaphore business. The 34.39 + * critical part is the inline stuff in <asm/semaphore.h> 34.40 + * where we want to avoid any extra jumps and calls. 34.41 + */ 34.42 + 34.43 +/* 34.44 + * Logic: 34.45 + * - only on a boundary condition do we need to care. When we go 34.46 + * from a negative count to a non-negative, we wake people up. 34.47 + * - when we go from a non-negative count to a negative do we 34.48 + * (a) synchronize with the "sleeper" count and (b) make sure 34.49 + * that we're on the wakeup list before we synchronize so that 34.50 + * we cannot lose wakeup events. 34.51 + */ 34.52 + 34.53 +void __up(struct semaphore *sem) 34.54 +{ 34.55 + wake_up(&sem->wait); 34.56 +} 34.57 + 34.58 +static spinlock_t semaphore_lock = SPIN_LOCK_UNLOCKED; 34.59 + 34.60 +void __down(struct semaphore * sem) 34.61 +{ 34.62 + struct task_struct *tsk = current; 34.63 + DECLARE_WAITQUEUE(wait, tsk); 34.64 + tsk->state = TASK_UNINTERRUPTIBLE; 34.65 + add_wait_queue_exclusive(&sem->wait, &wait); 34.66 + 34.67 + spin_lock_irq(&semaphore_lock); 34.68 + sem->sleepers++; 34.69 + for (;;) { 34.70 + int sleepers = sem->sleepers; 34.71 + 34.72 + /* 34.73 + * Add "everybody else" into it. They aren't 34.74 + * playing, because we own the spinlock. 34.75 + */ 34.76 + if (!atomic_add_negative(sleepers - 1, &sem->count)) { 34.77 + sem->sleepers = 0; 34.78 + break; 34.79 + } 34.80 + sem->sleepers = 1; /* us - see -1 above */ 34.81 + spin_unlock_irq(&semaphore_lock); 34.82 + 34.83 + schedule(); 34.84 + tsk->state = TASK_UNINTERRUPTIBLE; 34.85 + spin_lock_irq(&semaphore_lock); 34.86 + } 34.87 + spin_unlock_irq(&semaphore_lock); 34.88 + remove_wait_queue(&sem->wait, &wait); 34.89 + tsk->state = TASK_RUNNING; 34.90 + wake_up(&sem->wait); 34.91 +} 34.92 + 34.93 +int __down_interruptible(struct semaphore * sem) 34.94 +{ 34.95 + int retval = 0; 34.96 + struct task_struct *tsk = current; 34.97 + DECLARE_WAITQUEUE(wait, tsk); 34.98 + tsk->state = TASK_INTERRUPTIBLE; 34.99 + add_wait_queue_exclusive(&sem->wait, &wait); 34.100 + 34.101 + spin_lock_irq(&semaphore_lock); 34.102 + sem->sleepers ++; 34.103 + for (;;) { 34.104 + int sleepers = sem->sleepers; 34.105 + 34.106 + /* 34.107 + * With signals pending, this turns into 34.108 + * the trylock failure case - we won't be 34.109 + * sleeping, and we* can't get the lock as 34.110 + * it has contention. Just correct the count 34.111 + * and exit. 34.112 + */ 34.113 + if (signal_pending(current)) { 34.114 + retval = -EINTR; 34.115 + sem->sleepers = 0; 34.116 + atomic_add(sleepers, &sem->count); 34.117 + break; 34.118 + } 34.119 + 34.120 + /* 34.121 + * Add "everybody else" into it. They aren't 34.122 + * playing, because we own the spinlock. The 34.123 + * "-1" is because we're still hoping to get 34.124 + * the lock. 34.125 + */ 34.126 + if (!atomic_add_negative(sleepers - 1, &sem->count)) { 34.127 + sem->sleepers = 0; 34.128 + break; 34.129 + } 34.130 + sem->sleepers = 1; /* us - see -1 above */ 34.131 + spin_unlock_irq(&semaphore_lock); 34.132 + 34.133 + schedule(); 34.134 + tsk->state = TASK_INTERRUPTIBLE; 34.135 + spin_lock_irq(&semaphore_lock); 34.136 + } 34.137 + spin_unlock_irq(&semaphore_lock); 34.138 + tsk->state = TASK_RUNNING; 34.139 + remove_wait_queue(&sem->wait, &wait); 34.140 + wake_up(&sem->wait); 34.141 + return retval; 34.142 +} 34.143 + 34.144 +/* 34.145 + * Trylock failed - make sure we correct for 34.146 + * having decremented the count. 34.147 + * 34.148 + * We could have done the trylock with a 34.149 + * single "cmpxchg" without failure cases, 34.150 + * but then it wouldn't work on a 386. 34.151 + */ 34.152 +int __down_trylock(struct semaphore * sem) 34.153 +{ 34.154 + int sleepers; 34.155 + unsigned long flags; 34.156 + 34.157 + spin_lock_irqsave(&semaphore_lock, flags); 34.158 + sleepers = sem->sleepers + 1; 34.159 + sem->sleepers = 0; 34.160 + 34.161 + /* 34.162 + * Add "everybody else" and us into it. They aren't 34.163 + * playing, because we own the spinlock. 34.164 + */ 34.165 + if (!atomic_add_negative(sleepers, &sem->count)) 34.166 + wake_up(&sem->wait); 34.167 + 34.168 + spin_unlock_irqrestore(&semaphore_lock, flags); 34.169 + return 1; 34.170 +} 34.171 + 34.172 + 34.173 +/* 34.174 + * The semaphore operations have a special calling sequence that 34.175 + * allow us to do a simpler in-line version of them. These routines 34.176 + * need to convert that sequence back into the C sequence when 34.177 + * there is contention on the semaphore. 34.178 + * 34.179 + * %ecx contains the semaphore pointer on entry. Save the C-clobbered 34.180 + * registers (%eax, %edx and %ecx) except %eax when used as a return 34.181 + * value.. 34.182 + */ 34.183 +asm( 34.184 +".text\n" 34.185 +".align 4\n" 34.186 +".globl __down_failed\n" 34.187 +"__down_failed:\n\t" 34.188 +#if defined(CONFIG_FRAME_POINTER) 34.189 + "pushl %ebp\n\t" 34.190 + "movl %esp,%ebp\n\t" 34.191 +#endif 34.192 + "pushl %eax\n\t" 34.193 + "pushl %edx\n\t" 34.194 + "pushl %ecx\n\t" 34.195 + "call __down\n\t" 34.196 + "popl %ecx\n\t" 34.197 + "popl %edx\n\t" 34.198 + "popl %eax\n\t" 34.199 +#if defined(CONFIG_FRAME_POINTER) 34.200 + "movl %ebp,%esp\n\t" 34.201 + "popl %ebp\n\t" 34.202 +#endif 34.203 + "ret" 34.204 +); 34.205 + 34.206 +asm( 34.207 +".text\n" 34.208 +".align 4\n" 34.209 +".globl __down_failed_interruptible\n" 34.210 +"__down_failed_interruptible:\n\t" 34.211 +#if defined(CONFIG_FRAME_POINTER) 34.212 + "pushl %ebp\n\t" 34.213 + "movl %esp,%ebp\n\t" 34.214 +#endif 34.215 + "pushl %edx\n\t" 34.216 + "pushl %ecx\n\t" 34.217 + "call __down_interruptible\n\t" 34.218 + "popl %ecx\n\t" 34.219 + "popl %edx\n\t" 34.220 +#if defined(CONFIG_FRAME_POINTER) 34.221 + "movl %ebp,%esp\n\t" 34.222 + "popl %ebp\n\t" 34.223 +#endif 34.224 + "ret" 34.225 +); 34.226 + 34.227 +asm( 34.228 +".text\n" 34.229 +".align 4\n" 34.230 +".globl __down_failed_trylock\n" 34.231 +"__down_failed_trylock:\n\t" 34.232 +#if defined(CONFIG_FRAME_POINTER) 34.233 + "pushl %ebp\n\t" 34.234 + "movl %esp,%ebp\n\t" 34.235 +#endif 34.236 + "pushl %edx\n\t" 34.237 + "pushl %ecx\n\t" 34.238 + "call __down_trylock\n\t" 34.239 + "popl %ecx\n\t" 34.240 + "popl %edx\n\t" 34.241 +#if defined(CONFIG_FRAME_POINTER) 34.242 + "movl %ebp,%esp\n\t" 34.243 + "popl %ebp\n\t" 34.244 +#endif 34.245 + "ret" 34.246 +); 34.247 + 34.248 +asm( 34.249 +".text\n" 34.250 +".align 4\n" 34.251 +".globl __up_wakeup\n" 34.252 +"__up_wakeup:\n\t" 34.253 + "pushl %eax\n\t" 34.254 + "pushl %edx\n\t" 34.255 + "pushl %ecx\n\t" 34.256 + "call __up\n\t" 34.257 + "popl %ecx\n\t" 34.258 + "popl %edx\n\t" 34.259 + "popl %eax\n\t" 34.260 + "ret" 34.261 +); 34.262 + 34.263 +/* 34.264 + * rw spinlock fallbacks 34.265 + */ 34.266 +#if defined(CONFIG_SMP) 34.267 +asm( 34.268 +" 34.269 +.align 4 34.270 +.globl __write_lock_failed 34.271 +__write_lock_failed: 34.272 + " LOCK "addl $" RW_LOCK_BIAS_STR ",(%eax) 34.273 +1: rep; nop 34.274 + cmpl $" RW_LOCK_BIAS_STR ",(%eax) 34.275 + jne 1b 34.276 + 34.277 + " LOCK "subl $" RW_LOCK_BIAS_STR ",(%eax) 34.278 + jnz __write_lock_failed 34.279 + ret 34.280 + 34.281 + 34.282 +.align 4 34.283 +.globl __read_lock_failed 34.284 +__read_lock_failed: 34.285 + lock ; incl (%eax) 34.286 +1: rep; nop 34.287 + cmpl $1,(%eax) 34.288 + js 1b 34.289 + 34.290 + lock ; decl (%eax) 34.291 + js __read_lock_failed 34.292 + ret 34.293 +" 34.294 +); 34.295 +#endif
35.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 35.2 +++ b/old/xenolinux-2.4.16-sparse/arch/xeno/kernel/setup.c Mon Feb 24 16:55:07 2003 +0000 35.3 @@ -0,0 +1,996 @@ 35.4 +/* 35.5 + * linux/arch/i386/kernel/setup.c 35.6 + * 35.7 + * Copyright (C) 1995 Linus Torvalds 35.8 + */ 35.9 + 35.10 +/* 35.11 + * This file handles the architecture-dependent parts of initialization 35.12 + */ 35.13 + 35.14 +#include <linux/errno.h> 35.15 +#include <linux/sched.h> 35.16 +#include <linux/kernel.h> 35.17 +#include <linux/mm.h> 35.18 +#include <linux/stddef.h> 35.19 +#include <linux/unistd.h> 35.20 +#include <linux/ptrace.h> 35.21 +#include <linux/slab.h> 35.22 +#include <linux/user.h> 35.23 +#include <linux/a.out.h> 35.24 +#include <linux/tty.h> 35.25 +#include <linux/ioport.h> 35.26 +#include <linux/delay.h> 35.27 +#include <linux/config.h> 35.28 +#include <linux/init.h> 35.29 +#include <linux/apm_bios.h> 35.30 +#ifdef CONFIG_BLK_DEV_RAM 35.31 +#include <linux/blk.h> 35.32 +#endif 35.33 +#include <linux/highmem.h> 35.34 +#include <linux/bootmem.h> 35.35 +#include <linux/seq_file.h> 35.36 +#include <asm/processor.h> 35.37 +#include <linux/console.h> 35.38 +#include <asm/mtrr.h> 35.39 +#include <asm/uaccess.h> 35.40 +#include <asm/system.h> 35.41 +#include <asm/io.h> 35.42 +#include <asm/smp.h> 35.43 +#include <asm/msr.h> 35.44 +#include <asm/desc.h> 35.45 +#include <asm/dma.h> 35.46 +#include <asm/mpspec.h> 35.47 +#include <asm/mmu_context.h> 35.48 +#include <asm/hypervisor.h> 35.49 + 35.50 +shared_info_t *HYPERVISOR_shared_info; 35.51 + 35.52 +unsigned long *phys_to_machine_mapping; 35.53 + 35.54 +/* 35.55 + * Machine setup.. 35.56 + */ 35.57 + 35.58 +char ignore_irq13; /* set if exception 16 works */ 35.59 +struct cpuinfo_x86 boot_cpu_data = { 0, 0, 0, 0, -1, 1, 0, 0, -1 }; 35.60 + 35.61 +unsigned long mmu_cr4_features; 35.62 + 35.63 +/* 35.64 + * Bus types .. 35.65 + */ 35.66 +#ifdef CONFIG_EISA 35.67 +int EISA_bus; 35.68 +#endif 35.69 +int MCA_bus; 35.70 + 35.71 +/* for MCA, but anyone else can use it if they want */ 35.72 +unsigned int machine_id; 35.73 +unsigned int machine_submodel_id; 35.74 +unsigned int BIOS_revision; 35.75 +unsigned int mca_pentium_flag; 35.76 + 35.77 +/* For PCI or other memory-mapped resources */ 35.78 +unsigned long pci_mem_start = 0x10000000; 35.79 + 35.80 +/* 35.81 + * Setup options 35.82 + */ 35.83 +struct drive_info_struct { char dummy[32]; } drive_info; 35.84 +struct screen_info screen_info; 35.85 +struct apm_info apm_info; 35.86 +struct sys_desc_table_struct { 35.87 + unsigned short length; 35.88 + unsigned char table[0]; 35.89 +}; 35.90 + 35.91 +unsigned char aux_device_present; 35.92 + 35.93 +extern int root_mountflags; 35.94 +extern char _text, _etext, _edata, _end; 35.95 + 35.96 +int enable_acpi_smp_table; 35.97 + 35.98 +/* Raw start-of-day parameters from the hypervisor. */ 35.99 +union start_info_union start_info_union; 35.100 + 35.101 +#define COMMAND_LINE_SIZE 256 35.102 +static char command_line[COMMAND_LINE_SIZE]; 35.103 +char saved_command_line[COMMAND_LINE_SIZE]; 35.104 + 35.105 +static void __init parse_mem_cmdline (char ** cmdline_p) 35.106 +{ 35.107 + char c = ' ', *to = command_line, *from = saved_command_line; 35.108 + int len = 0; 35.109 + 35.110 + /* Save unparsed command line copy for /proc/cmdline */ 35.111 + memcpy(saved_command_line, start_info.cmd_line, COMMAND_LINE_SIZE); 35.112 + saved_command_line[COMMAND_LINE_SIZE-1] = '\0'; 35.113 + 35.114 + for (;;) { 35.115 + /* 35.116 + * "mem=nopentium" disables the 4MB page tables. 35.117 + * "mem=XXX[kKmM]" defines a memory region from HIGH_MEM 35.118 + * to <mem>, overriding the bios size. 35.119 + * "mem=XXX[KkmM]@XXX[KkmM]" defines a memory region from 35.120 + * <start> to <start>+<mem>, overriding the bios size. 35.121 + */ 35.122 + if (c == ' ' && !memcmp(from, "mem=", 4)) { 35.123 + if (to != command_line) 35.124 + to--; 35.125 + if (!memcmp(from+4, "nopentium", 9)) { 35.126 + from += 9+4; 35.127 + } else if (!memcmp(from+4, "exactmap", 8)) { 35.128 + from += 8+4; 35.129 + } else { 35.130 + (void)memparse(from+4, &from); 35.131 + if (*from == '@') 35.132 + (void)memparse(from+1, &from); 35.133 + } 35.134 + } 35.135 + 35.136 + c = *(from++); 35.137 + if (!c) 35.138 + break; 35.139 + if (COMMAND_LINE_SIZE <= ++len) 35.140 + break; 35.141 + *(to++) = c; 35.142 + } 35.143 + *to = '\0'; 35.144 + *cmdline_p = command_line; 35.145 +} 35.146 + 35.147 +void __init setup_arch(char **cmdline_p) 35.148 +{ 35.149 + unsigned long start_pfn, max_pfn, max_low_pfn; 35.150 + unsigned long bootmap_size; 35.151 + unsigned long i; 35.152 + 35.153 + extern void hypervisor_callback(void); 35.154 + extern void failsafe_callback(void); 35.155 + 35.156 + extern unsigned long cpu0_pte_quicklist[]; 35.157 + extern unsigned long cpu0_pgd_quicklist[]; 35.158 + 35.159 + HYPERVISOR_shared_info->event_address = 35.160 + (unsigned long)hypervisor_callback; 35.161 + HYPERVISOR_shared_info->failsafe_address = 35.162 + (unsigned long)failsafe_callback; 35.163 + 35.164 + boot_cpu_data.pgd_quick = cpu0_pgd_quicklist; 35.165 + boot_cpu_data.pte_quick = cpu0_pte_quicklist; 35.166 + 35.167 + ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); 35.168 + memset(&drive_info, 0, sizeof(drive_info)); 35.169 + memset(&screen_info, 0, sizeof(screen_info)); 35.170 + memset(&apm_info.bios, 0, sizeof(apm_info.bios)); 35.171 + aux_device_present = 0; 35.172 + 35.173 +#ifdef CONFIG_BLK_DEV_RAM 35.174 + rd_image_start = 0; 35.175 + rd_prompt = 0; 35.176 + rd_doload = 0; 35.177 +#endif 35.178 + 35.179 + root_mountflags &= ~MS_RDONLY; 35.180 + init_mm.start_code = (unsigned long) &_text; 35.181 + init_mm.end_code = (unsigned long) &_etext; 35.182 + init_mm.end_data = (unsigned long) &_edata; 35.183 + init_mm.brk = (unsigned long) &_end; 35.184 + 35.185 + parse_mem_cmdline(cmdline_p); 35.186 + 35.187 +#define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) 35.188 +#define PFN_DOWN(x) ((x) >> PAGE_SHIFT) 35.189 +#define PFN_PHYS(x) ((x) << PAGE_SHIFT) 35.190 + 35.191 +/* 35.192 + * 128MB for vmalloc and initrd 35.193 + */ 35.194 +#define VMALLOC_RESERVE (unsigned long)(128 << 20) 35.195 +#define MAXMEM (unsigned long)(HYPERVISOR_VIRT_START-PAGE_OFFSET-VMALLOC_RESERVE) 35.196 +#define MAXMEM_PFN PFN_DOWN(MAXMEM) 35.197 +#define MAX_NONPAE_PFN (1 << 20) 35.198 + 35.199 + /* 35.200 + * partially used pages are not usable - thus 35.201 + * we are rounding upwards: 35.202 + */ 35.203 +#ifdef CONFIG_BLK_DEV_INITRD 35.204 + if ( start_info.mod_start ) 35.205 + start_pfn = PFN_UP(__pa(start_info.mod_start + start_info.mod_len)); 35.206 + else 35.207 +#endif 35.208 + start_pfn = PFN_UP(__pa(&_end)); 35.209 + max_pfn = start_info.nr_pages; 35.210 + 35.211 + /* 35.212 + * Determine low and high memory ranges: 35.213 + */ 35.214 + max_low_pfn = max_pfn; 35.215 + if (max_low_pfn > MAXMEM_PFN) { 35.216 + max_low_pfn = MAXMEM_PFN; 35.217 +#ifndef CONFIG_HIGHMEM 35.218 + /* Maximum memory usable is what is directly addressable */ 35.219 + printk(KERN_WARNING "Warning only %ldMB will be used.\n", 35.220 + MAXMEM>>20); 35.221 + if (max_pfn > MAX_NONPAE_PFN) 35.222 + printk(KERN_WARNING "Use a PAE enabled kernel.\n"); 35.223 + else 35.224 + printk(KERN_WARNING "Use a HIGHMEM enabled kernel.\n"); 35.225 +#else /* !CONFIG_HIGHMEM */ 35.226 +#ifndef CONFIG_X86_PAE 35.227 + if (max_pfn > MAX_NONPAE_PFN) { 35.228 + max_pfn = MAX_NONPAE_PFN; 35.229 + printk(KERN_WARNING "Warning only 4GB will be used.\n"); 35.230 + printk(KERN_WARNING "Use a PAE enabled kernel.\n"); 35.231 + } 35.232 +#endif /* !CONFIG_X86_PAE */ 35.233 +#endif /* !CONFIG_HIGHMEM */ 35.234 + } 35.235 + 35.236 +#ifdef CONFIG_HIGHMEM 35.237 + highstart_pfn = highend_pfn = max_pfn; 35.238 + if (max_pfn > MAXMEM_PFN) { 35.239 + highstart_pfn = MAXMEM_PFN; 35.240 + printk(KERN_NOTICE "%ldMB HIGHMEM available.\n", 35.241 + pages_to_mb(highend_pfn - highstart_pfn)); 35.242 + } 35.243 +#endif 35.244 + 35.245 + /* 35.246 + * Initialize the boot-time allocator, and free up all RAM. 35.247 + * Then reserve space for OS image, and the bootmem bitmap. 35.248 + */ 35.249 + bootmap_size = init_bootmem(start_pfn, max_low_pfn); 35.250 + free_bootmem(0, PFN_PHYS(max_low_pfn)); 35.251 + reserve_bootmem(0, PFN_PHYS(start_pfn) + bootmap_size + PAGE_SIZE-1); 35.252 + 35.253 + /* Now reserve space for the hypervisor-provided page tables. */ 35.254 + { 35.255 + unsigned long *pgd = (unsigned long *)start_info.pt_base; 35.256 + unsigned long pte; 35.257 + int i; 35.258 + reserve_bootmem(__pa(pgd), PAGE_SIZE); 35.259 + for ( i = 0; i < (HYPERVISOR_VIRT_START>>22); i++ ) 35.260 + { 35.261 + unsigned long pgde = *pgd++; 35.262 + if ( !(pgde & 1) ) continue; 35.263 + pte = machine_to_phys(pgde & PAGE_MASK); 35.264 + reserve_bootmem(pte, PAGE_SIZE); 35.265 + } 35.266 + } 35.267 + cur_pgd = init_mm.pgd = (pgd_t *)start_info.pt_base; 35.268 + 35.269 + /* Now initialise the physical->machine mapping table. */ 35.270 + phys_to_machine_mapping = alloc_bootmem(max_pfn * sizeof(unsigned long)); 35.271 + for ( i = 0; i < max_pfn; i++ ) 35.272 + { 35.273 + unsigned long pgde, *ppte; 35.274 + unsigned long pfn = i + (PAGE_OFFSET >> PAGE_SHIFT); 35.275 + pgde = *((unsigned long *)start_info.pt_base + (pfn >> 10)); 35.276 + ppte = (unsigned long *)machine_to_phys(pgde & PAGE_MASK) + (pfn&1023); 35.277 + phys_to_machine_mapping[i] = 35.278 + (*(unsigned long *)__va(ppte)) >> PAGE_SHIFT; 35.279 + } 35.280 + 35.281 +#ifdef CONFIG_BLK_DEV_INITRD 35.282 + if (start_info.mod_start) { 35.283 + if ((__pa(start_info.mod_start) + start_info.mod_len) <= 35.284 + (max_low_pfn << PAGE_SHIFT)) { 35.285 + initrd_start = start_info.mod_start; 35.286 + initrd_end = initrd_start + start_info.mod_len; 35.287 + initrd_below_start_ok = 1; 35.288 + } 35.289 + else { 35.290 + printk(KERN_ERR "initrd extends beyond end of memory " 35.291 + "(0x%08lx > 0x%08lx)\ndisabling initrd\n", 35.292 + __pa(start_info.mod_start) + start_info.mod_len, 35.293 + max_low_pfn << PAGE_SHIFT); 35.294 + initrd_start = 0; 35.295 + } 35.296 + } 35.297 +#endif 35.298 + 35.299 + paging_init(); 35.300 +} 35.301 + 35.302 +static int cachesize_override __initdata = -1; 35.303 +static int __init cachesize_setup(char *str) 35.304 +{ 35.305 + get_option (&str, &cachesize_override); 35.306 + return 1; 35.307 +} 35.308 +__setup("cachesize=", cachesize_setup); 35.309 + 35.310 + 35.311 +static int __init get_model_name(struct cpuinfo_x86 *c) 35.312 +{ 35.313 + unsigned int *v; 35.314 + char *p, *q; 35.315 + 35.316 + if (cpuid_eax(0x80000000) < 0x80000004) 35.317 + return 0; 35.318 + 35.319 + v = (unsigned int *) c->x86_model_id; 35.320 + cpuid(0x80000002, &v[0], &v[1], &v[2], &v[3]); 35.321 + cpuid(0x80000003, &v[4], &v[5], &v[6], &v[7]); 35.322 + cpuid(0x80000004, &v[8], &v[9], &v[10], &v[11]); 35.323 + c->x86_model_id[48] = 0; 35.324 + 35.325 + /* Intel chips right-justify this string for some dumb reason; 35.326 + undo that brain damage */ 35.327 + p = q = &c->x86_model_id[0]; 35.328 + while ( *p == ' ' ) 35.329 + p++; 35.330 + if ( p != q ) { 35.331 + while ( *p ) 35.332 + *q++ = *p++; 35.333 + while ( q <= &c->x86_model_id[48] ) 35.334 + *q++ = '\0'; /* Zero-pad the rest */ 35.335 + } 35.336 + 35.337 + return 1; 35.338 +} 35.339 + 35.340 + 35.341 +static void __init display_cacheinfo(struct cpuinfo_x86 *c) 35.342 +{ 35.343 + unsigned int n, dummy, ecx, edx, l2size; 35.344 + 35.345 + n = cpuid_eax(0x80000000); 35.346 + 35.347 + if (n >= 0x80000005) { 35.348 + cpuid(0x80000005, &dummy, &dummy, &ecx, &edx); 35.349 + printk(KERN_INFO "CPU: L1 I Cache: %dK (%d bytes/line), D cache %dK (%d bytes/line)\n", 35.350 + edx>>24, edx&0xFF, ecx>>24, ecx&0xFF); 35.351 + c->x86_cache_size=(ecx>>24)+(edx>>24); 35.352 + } 35.353 + 35.354 + if (n < 0x80000006) /* Some chips just has a large L1. */ 35.355 + return; 35.356 + 35.357 + ecx = cpuid_ecx(0x80000006); 35.358 + l2size = ecx >> 16; 35.359 + 35.360 + /* AMD errata T13 (order #21922) */ 35.361 + if ((c->x86_vendor == X86_VENDOR_AMD) && (c->x86 == 6)) { 35.362 + if (c->x86_model == 3 && c->x86_mask == 0) /* Duron Rev A0 */ 35.363 + l2size = 64; 35.364 + if (c->x86_model == 4 && 35.365 + (c->x86_mask==0 || c->x86_mask==1)) /* Tbird rev A1/A2 */ 35.366 + l2size = 256; 35.367 + } 35.368 + 35.369 + /* Intel PIII Tualatin. This comes in two flavours. 35.370 + * One has 256kb of cache, the other 512. We have no way 35.371 + * to determine which, so we use a boottime override 35.372 + * for the 512kb model, and assume 256 otherwise. 35.373 + */ 35.374 + if ((c->x86_vendor == X86_VENDOR_INTEL) && (c->x86 == 6) && 35.375 + (c->x86_model == 11) && (l2size == 0)) 35.376 + l2size = 256; 35.377 + 35.378 + /* VIA C3 CPUs (670-68F) need further shifting. */ 35.379 + if (c->x86_vendor == X86_VENDOR_CENTAUR && (c->x86 == 6) && 35.380 + ((c->x86_model == 7) || (c->x86_model == 8))) { 35.381 + l2size = l2size >> 8; 35.382 + } 35.383 + 35.384 + /* Allow user to override all this if necessary. */ 35.385 + if (cachesize_override != -1) 35.386 + l2size = cachesize_override; 35.387 + 35.388 + if ( l2size == 0 ) 35.389 + return; /* Again, no L2 cache is possible */ 35.390 + 35.391 + c->x86_cache_size = l2size; 35.392 + 35.393 + printk(KERN_INFO "CPU: L2 Cache: %dK (%d bytes/line)\n", 35.394 + l2size, ecx & 0xFF); 35.395 +} 35.396 + 35.397 + 35.398 +static int __init init_amd(struct cpuinfo_x86 *c) 35.399 +{ 35.400 + int r; 35.401 + 35.402 + /* Bit 31 in normal CPUID used for nonstandard 3DNow ID; 35.403 + 3DNow is IDd by bit 31 in extended CPUID (1*32+31) anyway */ 35.404 + clear_bit(0*32+31, &c->x86_capability); 35.405 + 35.406 + r = get_model_name(c); 35.407 + 35.408 + switch(c->x86) 35.409 + { 35.410 + case 6: /* An Athlon/Duron. We can trust the BIOS probably */ 35.411 + break; 35.412 + default: 35.413 + panic("Unsupported AMD processor\n"); 35.414 + } 35.415 + 35.416 + display_cacheinfo(c); 35.417 + return r; 35.418 +} 35.419 + 35.420 + 35.421 +static void __init init_intel(struct cpuinfo_x86 *c) 35.422 +{ 35.423 + char *p = NULL; 35.424 + unsigned int l1i = 0, l1d = 0, l2 = 0, l3 = 0; /* Cache sizes */ 35.425 + 35.426 + if (c->cpuid_level > 1) { 35.427 + /* supports eax=2 call */ 35.428 + int i, j, n; 35.429 + int regs[4]; 35.430 + unsigned char *dp = (unsigned char *)regs; 35.431 + 35.432 + /* Number of times to iterate */ 35.433 + n = cpuid_eax(2) & 0xFF; 35.434 + 35.435 + for ( i = 0 ; i < n ; i++ ) { 35.436 + cpuid(2, ®s[0], ®s[1], ®s[2], ®s[3]); 35.437 + 35.438 + /* If bit 31 is set, this is an unknown format */ 35.439 + for ( j = 0 ; j < 3 ; j++ ) { 35.440 + if ( regs[j] < 0 ) regs[j] = 0; 35.441 + } 35.442 + 35.443 + /* Byte 0 is level count, not a descriptor */ 35.444 + for ( j = 1 ; j < 16 ; j++ ) { 35.445 + unsigned char des = dp[j]; 35.446 + unsigned char dl, dh; 35.447 + unsigned int cs; 35.448 + 35.449 + dh = des >> 4; 35.450 + dl = des & 0x0F; 35.451 + 35.452 + /* Black magic... */ 35.453 + 35.454 + switch ( dh ) 35.455 + { 35.456 + case 0: 35.457 + switch ( dl ) { 35.458 + case 6: 35.459 + /* L1 I cache */ 35.460 + l1i += 8; 35.461 + break; 35.462 + case 8: 35.463 + /* L1 I cache */ 35.464 + l1i += 16; 35.465 + break; 35.466 + case 10: 35.467 + /* L1 D cache */ 35.468 + l1d += 8; 35.469 + break; 35.470 + case 12: 35.471 + /* L1 D cache */ 35.472 + l1d += 16; 35.473 + break; 35.474 + default:; 35.475 + /* TLB, or unknown */ 35.476 + } 35.477 + break; 35.478 + case 2: 35.479 + if ( dl ) { 35.480 + /* L3 cache */ 35.481 + cs = (dl-1) << 9; 35.482 + l3 += cs; 35.483 + } 35.484 + break; 35.485 + case 4: 35.486 + if ( c->x86 > 6 && dl ) { 35.487 + /* P4 family */ 35.488 + /* L3 cache */ 35.489 + cs = 128 << (dl-1); 35.490 + l3 += cs; 35.491 + break; 35.492 + } 35.493 + /* else same as 8 - fall through */ 35.494 + case 8: 35.495 + if ( dl ) { 35.496 + /* L2 cache */ 35.497 + cs = 128 << (dl-1); 35.498 + l2 += cs; 35.499 + } 35.500 + break; 35.501 + case 6: 35.502 + if (dl > 5) { 35.503 + /* L1 D cache */ 35.504 + cs = 8<<(dl-6); 35.505 + l1d += cs; 35.506 + } 35.507 + break; 35.508 + case 7: 35.509 + if ( dl >= 8 ) 35.510 + { 35.511 + /* L2 cache */ 35.512 + cs = 64<<(dl-8); 35.513 + l2 += cs; 35.514 + } else { 35.515 + /* L0 I cache, count as L1 */ 35.516 + cs = dl ? (16 << (dl-1)) : 12; 35.517 + l1i += cs; 35.518 + } 35.519 + break; 35.520 + default: 35.521 + /* TLB, or something else we don't know about */ 35.522 + break; 35.523 + } 35.524 + } 35.525 + } 35.526 + if ( l1i || l1d ) 35.527 + printk(KERN_INFO "CPU: L1 I cache: %dK, L1 D cache: %dK\n", 35.528 + l1i, l1d); 35.529 + if ( l2 ) 35.530 + printk(KERN_INFO "CPU: L2 cache: %dK\n", l2); 35.531 + if ( l3 ) 35.532 + printk(KERN_INFO "CPU: L3 cache: %dK\n", l3); 35.533 + 35.534 + /* 35.535 + * This assumes the L3 cache is shared; it typically lives in 35.536 + * the northbridge. The L1 caches are included by the L2 35.537 + * cache, and so should not be included for the purpose of 35.538 + * SMP switching weights. 35.539 + */ 35.540 + c->x86_cache_size = l2 ? l2 : (l1i+l1d); 35.541 + } 35.542 + 35.543 + /* SEP CPUID bug: Pentium Pro reports SEP but doesn't have it */ 35.544 + if ( c->x86 == 6 && c->x86_model < 3 && c->x86_mask < 3 ) 35.545 + clear_bit(X86_FEATURE_SEP, &c->x86_capability); 35.546 + 35.547 + /* Names for the Pentium II/Celeron processors 35.548 + detectable only by also checking the cache size. 35.549 + Dixon is NOT a Celeron. */ 35.550 + if (c->x86 == 6) { 35.551 + switch (c->x86_model) { 35.552 + case 5: 35.553 + if (l2 == 0) 35.554 + p = "Celeron (Covington)"; 35.555 + if (l2 == 256) 35.556 + p = "Mobile Pentium II (Dixon)"; 35.557 + break; 35.558 + 35.559 + case 6: 35.560 + if (l2 == 128) 35.561 + p = "Celeron (Mendocino)"; 35.562 + break; 35.563 + 35.564 + case 8: 35.565 + if (l2 == 128) 35.566 + p = "Celeron (Coppermine)"; 35.567 + break; 35.568 + } 35.569 + } 35.570 + 35.571 + if ( p ) 35.572 + strcpy(c->x86_model_id, p); 35.573 +} 35.574 + 35.575 +void __init get_cpu_vendor(struct cpuinfo_x86 *c) 35.576 +{ 35.577 + char *v = c->x86_vendor_id; 35.578 + 35.579 + if (!strcmp(v, "GenuineIntel")) 35.580 + c->x86_vendor = X86_VENDOR_INTEL; 35.581 + else if (!strcmp(v, "AuthenticAMD")) 35.582 + c->x86_vendor = X86_VENDOR_AMD; 35.583 + else 35.584 + c->x86_vendor = X86_VENDOR_UNKNOWN; 35.585 +} 35.586 + 35.587 +struct cpu_model_info { 35.588 + int vendor; 35.589 + int family; 35.590 + char *model_names[16]; 35.591 +}; 35.592 + 35.593 +/* Naming convention should be: <Name> [(<Codename>)] */ 35.594 +/* This table only is used unless init_<vendor>() below doesn't set it; */ 35.595 +/* in particular, if CPUID levels 0x80000002..4 are supported, this isn't used */ 35.596 +static struct cpu_model_info cpu_models[] __initdata = { 35.597 + { X86_VENDOR_INTEL, 6, 35.598 + { "Pentium Pro A-step", "Pentium Pro", NULL, "Pentium II (Klamath)", 35.599 + NULL, "Pentium II (Deschutes)", "Mobile Pentium II", 35.600 + "Pentium III (Katmai)", "Pentium III (Coppermine)", NULL, 35.601 + "Pentium III (Cascades)", NULL, NULL, NULL, NULL }}, 35.602 + { X86_VENDOR_AMD, 6, /* Is this this really necessary?? */ 35.603 + { "Athlon", "Athlon", 35.604 + "Athlon", NULL, "Athlon", NULL, 35.605 + NULL, NULL, NULL, 35.606 + NULL, NULL, NULL, NULL, NULL, NULL, NULL }} 35.607 +}; 35.608 + 35.609 +/* Look up CPU names by table lookup. */ 35.610 +static char __init *table_lookup_model(struct cpuinfo_x86 *c) 35.611 +{ 35.612 + struct cpu_model_info *info = cpu_models; 35.613 + int i; 35.614 + 35.615 + if ( c->x86_model >= 16 ) 35.616 + return NULL; /* Range check */ 35.617 + 35.618 + for ( i = 0 ; i < sizeof(cpu_models)/sizeof(struct cpu_model_info) ; i++ ) { 35.619 + if ( info->vendor == c->x86_vendor && 35.620 + info->family == c->x86 ) { 35.621 + return info->model_names[c->x86_model]; 35.622 + } 35.623 + info++; 35.624 + } 35.625 + return NULL; /* Not found */ 35.626 +} 35.627 + 35.628 + 35.629 + 35.630 +/* Standard macro to see if a specific flag is changeable */ 35.631 +static inline int flag_is_changeable_p(u32 flag) 35.632 +{ 35.633 + u32 f1, f2; 35.634 + 35.635 + asm("pushfl\n\t" 35.636 + "pushfl\n\t" 35.637 + "popl %0\n\t" 35.638 + "movl %0,%1\n\t" 35.639 + "xorl %2,%0\n\t" 35.640 + "pushl %0\n\t" 35.641 + "popfl\n\t" 35.642 + "pushfl\n\t" 35.643 + "popl %0\n\t" 35.644 + "popfl\n\t" 35.645 + : "=&r" (f1), "=&r" (f2) 35.646 + : "ir" (flag)); 35.647 + 35.648 + return ((f1^f2) & flag) != 0; 35.649 +} 35.650 + 35.651 + 35.652 +/* Probe for the CPUID instruction */ 35.653 +static int __init have_cpuid_p(void) 35.654 +{ 35.655 + return flag_is_changeable_p(X86_EFLAGS_ID); 35.656 +} 35.657 + 35.658 + 35.659 + 35.660 +/* 35.661 + * This does the hard work of actually picking apart the CPU stuff... 35.662 + */ 35.663 +void __init identify_cpu(struct cpuinfo_x86 *c) 35.664 +{ 35.665 + int junk, i; 35.666 + u32 xlvl, tfms; 35.667 + 35.668 + c->loops_per_jiffy = loops_per_jiffy; 35.669 + c->x86_cache_size = -1; 35.670 + c->x86_vendor = X86_VENDOR_UNKNOWN; 35.671 + c->cpuid_level = -1; /* CPUID not detected */ 35.672 + c->x86_model = c->x86_mask = 0; /* So far unknown... */ 35.673 + c->x86_vendor_id[0] = '\0'; /* Unset */ 35.674 + c->x86_model_id[0] = '\0'; /* Unset */ 35.675 + memset(&c->x86_capability, 0, sizeof c->x86_capability); 35.676 + c->hard_math = 1; 35.677 + 35.678 + if ( !have_cpuid_p() ) { 35.679 + panic("Processor must support CPUID\n"); 35.680 + } else { 35.681 + /* CPU does have CPUID */ 35.682 + 35.683 + /* Get vendor name */ 35.684 + cpuid(0x00000000, &c->cpuid_level, 35.685 + (int *)&c->x86_vendor_id[0], 35.686 + (int *)&c->x86_vendor_id[8], 35.687 + (int *)&c->x86_vendor_id[4]); 35.688 + 35.689 + get_cpu_vendor(c); 35.690 + /* Initialize the standard set of capabilities */ 35.691 + /* Note that the vendor-specific code below might override */ 35.692 + 35.693 + /* Intel-defined flags: level 0x00000001 */ 35.694 + if ( c->cpuid_level >= 0x00000001 ) { 35.695 + cpuid(0x00000001, &tfms, &junk, &junk, 35.696 + &c->x86_capability[0]); 35.697 + c->x86 = (tfms >> 8) & 15; 35.698 + c->x86_model = (tfms >> 4) & 15; 35.699 + c->x86_mask = tfms & 15; 35.700 + } else { 35.701 + /* Have CPUID level 0 only - unheard of */ 35.702 + c->x86 = 4; 35.703 + } 35.704 + 35.705 + /* AMD-defined flags: level 0x80000001 */ 35.706 + xlvl = cpuid_eax(0x80000000); 35.707 + if ( (xlvl & 0xffff0000) == 0x80000000 ) { 35.708 + if ( xlvl >= 0x80000001 ) 35.709 + c->x86_capability[1] = cpuid_edx(0x80000001); 35.710 + if ( xlvl >= 0x80000004 ) 35.711 + get_model_name(c); /* Default name */ 35.712 + } 35.713 + 35.714 + /* Transmeta-defined flags: level 0x80860001 */ 35.715 + xlvl = cpuid_eax(0x80860000); 35.716 + if ( (xlvl & 0xffff0000) == 0x80860000 ) { 35.717 + if ( xlvl >= 0x80860001 ) 35.718 + c->x86_capability[2] = cpuid_edx(0x80860001); 35.719 + } 35.720 + } 35.721 + 35.722 + printk(KERN_DEBUG "CPU: Before vendor init, caps: %08x %08x %08x, vendor = %d\n", 35.723 + c->x86_capability[0], 35.724 + c->x86_capability[1], 35.725 + c->x86_capability[2], 35.726 + c->x86_vendor); 35.727 + 35.728 + /* 35.729 + * Vendor-specific initialization. In this section we 35.730 + * canonicalize the feature flags, meaning if there are 35.731 + * features a certain CPU supports which CPUID doesn't 35.732 + * tell us, CPUID claiming incorrect flags, or other bugs, 35.733 + * we handle them here. 35.734 + * 35.735 + * At the end of this section, c->x86_capability better 35.736 + * indicate the features this CPU genuinely supports! 35.737 + */ 35.738 + switch ( c->x86_vendor ) { 35.739 + case X86_VENDOR_AMD: 35.740 + init_amd(c); 35.741 + break; 35.742 + 35.743 + case X86_VENDOR_INTEL: 35.744 + init_intel(c); 35.745 + break; 35.746 + 35.747 + default: 35.748 + panic("Unsupported CPU vendor\n"); 35.749 + } 35.750 + 35.751 + printk(KERN_DEBUG "CPU: After vendor init, caps: %08x %08x %08x %08x\n", 35.752 + c->x86_capability[0], 35.753 + c->x86_capability[1], 35.754 + c->x86_capability[2], 35.755 + c->x86_capability[3]); 35.756 + 35.757 + 35.758 + /* If the model name is still unset, do table lookup. */ 35.759 + if ( !c->x86_model_id[0] ) { 35.760 + char *p; 35.761 + p = table_lookup_model(c); 35.762 + if ( p ) 35.763 + strcpy(c->x86_model_id, p); 35.764 + else 35.765 + /* Last resort... */ 35.766 + sprintf(c->x86_model_id, "%02x/%02x", 35.767 + c->x86_vendor, c->x86_model); 35.768 + } 35.769 + 35.770 + /* Now the feature flags better reflect actual CPU features! */ 35.771 + 35.772 + printk(KERN_DEBUG "CPU: After generic, caps: %08x %08x %08x %08x\n", 35.773 + c->x86_capability[0], 35.774 + c->x86_capability[1], 35.775 + c->x86_capability[2], 35.776 + c->x86_capability[3]); 35.777 + 35.778 + /* 35.779 + * On SMP, boot_cpu_data holds the common feature set between 35.780 + * all CPUs; so make sure that we indicate which features are 35.781 + * common between the CPUs. The first time this routine gets 35.782 + * executed, c == &boot_cpu_data. 35.783 + */ 35.784 + if ( c != &boot_cpu_data ) { 35.785 + /* AND the already accumulated flags with these */ 35.786 + for ( i = 0 ; i < NCAPINTS ; i++ ) 35.787 + boot_cpu_data.x86_capability[i] &= c->x86_capability[i]; 35.788 + } 35.789 + 35.790 + printk(KERN_DEBUG "CPU: Common caps: %08x %08x %08x %08x\n", 35.791 + boot_cpu_data.x86_capability[0], 35.792 + boot_cpu_data.x86_capability[1], 35.793 + boot_cpu_data.x86_capability[2], 35.794 + boot_cpu_data.x86_capability[3]); 35.795 +} 35.796 + 35.797 + 35.798 +/* These need to match <asm/processor.h> */ 35.799 +static char *cpu_vendor_names[] __initdata = { 35.800 + "Intel", "Cyrix", "AMD", "UMC", "NexGen", "Centaur", "Rise", "Transmeta" }; 35.801 + 35.802 + 35.803 +void __init print_cpu_info(struct cpuinfo_x86 *c) 35.804 +{ 35.805 + char *vendor = NULL; 35.806 + 35.807 + if (c->x86_vendor < sizeof(cpu_vendor_names)/sizeof(char *)) 35.808 + vendor = cpu_vendor_names[c->x86_vendor]; 35.809 + else if (c->cpuid_level >= 0) 35.810 + vendor = c->x86_vendor_id; 35.811 + 35.812 + if (vendor && strncmp(c->x86_model_id, vendor, strlen(vendor))) 35.813 + printk("%s ", vendor); 35.814 + 35.815 + if (!c->x86_model_id[0]) 35.816 + printk("%d86", c->x86); 35.817 + else 35.818 + printk("%s", c->x86_model_id); 35.819 + 35.820 + if (c->x86_mask || c->cpuid_level >= 0) 35.821 + printk(" stepping %02x\n", c->x86_mask); 35.822 + else 35.823 + printk("\n"); 35.824 +} 35.825 + 35.826 +/* 35.827 + * Get CPU information for use by the procfs. 35.828 + */ 35.829 +static int show_cpuinfo(struct seq_file *m, void *v) 35.830 +{ 35.831 + /* 35.832 + * These flag bits must match the definitions in <asm/cpufeature.h>. 35.833 + * NULL means this bit is undefined or reserved; either way it doesn't 35.834 + * have meaning as far as Linux is concerned. Note that it's important 35.835 + * to realize there is a difference between this table and CPUID -- if 35.836 + * applications want to get the raw CPUID data, they should access 35.837 + * /dev/cpu/<cpu_nr>/cpuid instead. 35.838 + */ 35.839 + static char *x86_cap_flags[] = { 35.840 + /* Intel-defined */ 35.841 + "fpu", "vme", "de", "pse", "tsc", "msr", "pae", "mce", 35.842 + "cx8", "apic", NULL, "sep", "mtrr", "pge", "mca", "cmov", 35.843 + "pat", "pse36", "pn", "clflush", NULL, "dts", "acpi", "mmx", 35.844 + "fxsr", "sse", "sse2", "ss", NULL, "tm", "ia64", NULL, 35.845 + 35.846 + /* AMD-defined */ 35.847 + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 35.848 + NULL, NULL, NULL, "syscall", NULL, NULL, NULL, NULL, 35.849 + NULL, NULL, NULL, NULL, NULL, NULL, "mmxext", NULL, 35.850 + NULL, NULL, NULL, NULL, NULL, "lm", "3dnowext", "3dnow", 35.851 + 35.852 + /* Transmeta-defined */ 35.853 + "recovery", "longrun", NULL, "lrti", NULL, NULL, NULL, NULL, 35.854 + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 35.855 + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 35.856 + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 35.857 + 35.858 + /* Other (Linux-defined) */ 35.859 + "cxmmx", "k6_mtrr", "cyrix_arr", "centaur_mcr", NULL, NULL, NULL, NULL, 35.860 + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 35.861 + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 35.862 + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 35.863 + }; 35.864 + struct cpuinfo_x86 *c = v; 35.865 + int i, n = c - cpu_data; 35.866 + int fpu_exception; 35.867 + 35.868 +#ifdef CONFIG_SMP 35.869 + if (!(cpu_online_map & (1<<n)))