diff options
author | Andrea Adami <andrea.adami@gmail.com> | 2011-04-26 00:47:42 +0200 |
---|---|---|
committer | Andrea Adami <andrea.adami@gmail.com> | 2011-04-26 01:11:56 +0200 |
commit | 730c85ac8fc2afae24020dacd2807bb244c33c5d (patch) | |
tree | 72946603fda0a3d203acf2a0ea567a3e3e8e3ea2 /recipes/linux/linux-colinux-2.4.28 | |
parent | 1710d7230e1cb23c590533191ddffe2f1de27928 (diff) | |
download | openembedded-730c85ac8fc2afae24020dacd2807bb244c33c5d.tar.gz |
linux-colinux: move unsupported 2.4 kernel to /obsolete
Signed-off-by: Andrea Adami <andrea.adami@gmail.com>
Diffstat (limited to 'recipes/linux/linux-colinux-2.4.28')
7 files changed, 0 insertions, 6007 deletions
diff --git a/recipes/linux/linux-colinux-2.4.28/colinux-0.6.1.patch b/recipes/linux/linux-colinux-2.4.28/colinux-0.6.1.patch deleted file mode 100644 index fca3c277ee..0000000000 --- a/recipes/linux/linux-colinux-2.4.28/colinux-0.6.1.patch +++ /dev/null @@ -1,5156 +0,0 @@ - -# -# Patch managed by http://www.mn-logistik.de/unsupported/pxa250/patcher -# - ---- linux-2.4.28/CREDITS~colinux-0.6.1 2004-11-17 06:54:20.000000000 -0500 -+++ linux-2.4.28/CREDITS 2004-11-27 15:59:21.283010512 -0500 -@@ -54,6 +54,12 @@ - S: CH-1015 Lausanne - S: Switzerland - -+A: Dan Aloni -+E: da-x@gmx.net -+D: Cooperative Linux -+D: Various kernel patches -+S: Israel -+ - N: Tim Alpaerts - E: tim_alpaerts@toyota-motor-europe.com - D: 802.2 class II logical link control layer, ---- linux-2.4.28/Documentation/devices.txt~colinux-0.6.1 2004-02-18 08:36:30.000000000 -0500 -+++ linux-2.4.28/Documentation/devices.txt 2004-11-27 15:59:21.285010208 -0500 -@@ -1926,6 +1926,13 @@ - 17 = /dev/cosa1c1 2nd board, 2nd channel - ... - -+ block coLinux Block devices -+ 0 = /dev/cobd0 First coLinux device -+ 1 = /dev/cobd1 Second coLinux device -+ ... -+ -+ These block devices map to files or devices in the host FS. -+ - 118 char Solidum ??? - 0 = /dev/solnp0 - 1 = /dev/solnp1 ---- linux-2.4.28/Makefile~colinux-0.6.1 2004-11-17 06:54:22.000000000 -0500 -+++ linux-2.4.28/Makefile 2004-11-27 15:59:30.235649504 -0500 -@@ -1,7 +1,7 @@ - VERSION = 2 - PATCHLEVEL = 4 - SUBLEVEL = 28 --EXTRAVERSION = -+EXTRAVERSION = -co-0.6.1 - - KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) - -@@ -27,7 +27,11 @@ - - AS = $(CROSS_COMPILE)as - LD = $(CROSS_COMPILE)ld --CC = $(CROSS_COMPILE)gcc -+ifeq ($(GCCTRACE),Y) -+CC = $(CROSS_COMPILE)$(COLINUX_ROOT)/bin/tracewrapper.py gcc -+else -+CC = $(CROSS_COMPILE)gcc -+endif - CPP = $(CC) -E - AR = $(CROSS_COMPILE)ar - NM = $(CROSS_COMPILE)nm ---- linux-2.4.28/arch/i386/config.in~colinux-0.6.1 2004-11-17 06:54:21.000000000 -0500 -+++ linux-2.4.28/arch/i386/config.in 2004-11-27 15:59:21.286010056 -0500 -@@ -226,13 +226,20 @@ - bool 'MTRR (Memory Type Range Register) support' CONFIG_MTRR - bool 'Symmetric multi-processing support' CONFIG_SMP - if [ "$CONFIG_SMP" != "y" ]; then -- bool 'Local APIC support on uniprocessors' CONFIG_X86_UP_APIC -- dep_bool 'IO-APIC support on uniprocessors' CONFIG_X86_UP_IOAPIC $CONFIG_X86_UP_APIC -- if [ "$CONFIG_X86_UP_APIC" = "y" ]; then -- define_bool CONFIG_X86_LOCAL_APIC y -- fi -- if [ "$CONFIG_X86_UP_IOAPIC" = "y" ]; then -- define_bool CONFIG_X86_IO_APIC y -+ if [ "$CONFIG_COOPERATIVE" = "y" ]; then -+ bool 'Cooperative PIC (COPIC) support' CONFIG_X86_UP_COPIC -+ if [ "$CONFIG_X86_UP_COPIC" = "y" ]; then -+ define_bool CONFIG_X86_COPIC y -+ fi -+ else -+ bool 'Local APIC support on uniprocessors' CONFIG_X86_UP_APIC -+ dep_bool 'IO-APIC support on uniprocessors' CONFIG_X86_UP_IOAPIC $CONFIG_X86_UP_APIC -+ if [ "$CONFIG_X86_UP_APIC" = "y" ]; then -+ define_bool CONFIG_X86_LOCAL_APIC y -+ fi -+ if [ "$CONFIG_X86_UP_IOAPIC" = "y" ]; then -+ define_bool CONFIG_X86_IO_APIC y -+ fi - fi - else - int 'Maximum number of CPUs (2-32)' CONFIG_NR_CPUS 32 -@@ -343,12 +350,13 @@ - bool ' Use real mode APM BIOS call to power off' CONFIG_APM_REAL_MODE_POWER_OFF - fi - -+bool 'Cooperative Mode' CONFIG_COOPERATIVE -+ - source drivers/acpi/Config.in - - endmenu - - source drivers/mtd/Config.in -- - source drivers/parport/Config.in - - source drivers/pnp/Config.in -@@ -445,7 +453,11 @@ - if [ "$CONFIG_VT" = "y" ]; then - mainmenu_option next_comment - comment 'Console drivers' -- bool 'VGA text console' CONFIG_VGA_CONSOLE -+ if [ "$CONFIG_COOPERATIVE" = "n" ]; then -+ bool 'VGA text console' CONFIG_VGA_CONSOLE -+ else -+ bool 'coLinux Pseudo-VGA text console' CONFIG_COOPERATIVE_CONSOLE -+ fi - bool 'Video mode selection support' CONFIG_VIDEO_SELECT - if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then - tristate 'MDA text console (dual-headed) (EXPERIMENTAL)' CONFIG_MDA_CONSOLE ---- linux-2.4.28/arch/i386/kernel/Makefile~colinux-0.6.1 2003-11-28 13:26:19.000000000 -0500 -+++ linux-2.4.28/arch/i386/kernel/Makefile 2004-11-27 15:59:21.287009904 -0500 -@@ -18,7 +18,7 @@ - - obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o vm86.o \ - ptrace.o i8259.o ioport.o ldt.o setup.o time.o sys_i386.o \ -- pci-dma.o i386_ksyms.o i387.o bluesmoke.o dmi_scan.o -+ pci-dma.o i386_ksyms.o i387.o bluesmoke.o dmi_scan.o cooperative.o \ - - - ifdef CONFIG_PCI ---- /dev/null 2004-04-06 13:56:48.000000000 -0400 -+++ linux-2.4.28/arch/i386/kernel/cooperative.c 2004-11-27 15:59:21.287009904 -0500 -@@ -0,0 +1,160 @@ -+#include <linux/kernel.h> -+#include <linux/string.h> -+#include <linux/interrupt.h> -+#include <linux/mm.h> -+ -+#include <asm/keyboard.h> -+#include <linux/kbd_ll.h> -+#include <linux/cooperative.h> -+#include <asm/smp.h> -+#include <asm/desc.h> -+ -+CO_TRACE_STOP; -+ -+ -+/* -+ * The next asm code is the first Linux code that runs in the -+ * coLinux kernel context. It receives %ecx which contains the -+ * address of the passage page. The passage page code sets %ecx -+ * to this value in its context restore part. -+ */ -+ -+asm( -+ "" -+ ".section .text\n" -+ ".globl colinux_start\n" -+ "colinux_start:\n" -+ " call colinux_start_arch\n" -+ ".previous\n" -+ ""); -+ -+static void colinux_early_cpu_init(void) -+{ -+ /* -+ * On the first switch to Linux we must set up a valid TR because -+ * the passage page code assumes such one exists. This is basically -+ * copied code from cpu_init(). -+ * -+ * P.S this is protected by CO_TRACE_STOP so that we don't -+ * have a monitor context switch. -+ */ -+ -+ int nr = smp_processor_id(); -+ struct tss_struct * t = &init_tss[nr]; -+ -+ set_tss_desc(nr,t); -+ gdt_table[__TSS(nr)].b &= 0xfffffdff; -+ load_TR(nr); -+ gdt_table[__TSS(nr)].b &= 0xfffffdff; -+ -+ __asm__ __volatile__("movl %%cr4, %0" : "=r" (mmu_cr4_features)); -+} -+ -+void colinux_start_arch() -+{ -+ colinux_early_cpu_init(); -+ colinux_start_c(); -+} -+ -+extern void ctrl_alt_del(void); -+ -+void co_handle_device_interrupt(co_linux_message_t *message) -+{ -+ unsigned long flags; -+ -+ local_irq_save(flags); -+ -+ switch (message->device) { -+ case CO_DEVICE_TIMER: { -+ co_linux_message_idle_t data = *(co_linux_message_idle_t *)message->data; -+ -+ if (data.tick_count > HZ) { -+ xtime.tv_sec += data.tick_count / HZ; -+ data.tick_count -= ((data.tick_count / HZ) * HZ); -+ } -+ -+ -+ while (data.tick_count > 0) { -+ struct pt_regs regs = {0, }; -+ regs.orig_eax = TIMER_IRQ; -+ do_IRQ(regs); -+ -+ data.tick_count--; -+ } -+ break; -+ } -+ case CO_DEVICE_POWER: { -+ co_linux_message_power_t *type = (co_scan_code_t *)message->data; -+ switch (type->type) { -+ case CO_LINUX_MESSAGE_POWER_ALT_CTRL_DEL: { -+ ctrl_alt_del(); -+ break; -+ } -+ } -+ break; -+ } -+ -+ case CO_DEVICE_KEYBOARD: { -+ struct pt_regs regs; -+ co_received_message(message); -+ regs.orig_eax = KEYBOARD_IRQ; -+ do_IRQ(regs); -+ break; -+ } -+ -+ case CO_DEVICE_NETWORK: { -+ struct pt_regs regs; -+ if (message->size > 1600) { -+ printk("co_handle_device_interrupt: warning, packet len: %d\n", message->size); -+ break; -+ } -+ co_received_message(message); -+ regs.orig_eax = NETWORK_IRQ; -+ do_IRQ(regs); -+ break; -+ } -+ default: -+ break; -+ } -+ -+ local_irq_restore(flags); -+} -+ -+void co_switch_wrapper_protected(void) -+{ -+ /* -+ * We don't trust the passage page code to safely restore %gs and %fs. -+ * -+ * This wrapper ensures that if %fs or %gs are invalid, the processes -+ * exits with a segmentation fault rather than bringing down the -+ * machine. -+ **/ -+ unsigned long fs = 0; -+ unsigned long gs = 0; -+ -+ asm volatile("movl %%fs,%0": "=m" (fs)); -+ asm volatile("movl %%gs,%0": "=m" (gs)); -+ -+ /* -+ * Nullify the registers so the passage page code restores to -+ * null segment values on return. -+ */ -+ asm volatile("movl %0, %%fs; movl %0, %%gs" : : "r" (0)); -+ -+ /* And switch... */ -+ co_switch(); -+ -+ /* -+ * Safely restore the registers. -+ */ -+ loadsegment(fs, fs); -+ loadsegment(gs, gs); -+} -+ -+void co_switch_wrapper(void) -+{ -+ co_switch_wrapper_protected(); -+} -+ -+CO_TRACE_CONTINUE; -+ ---- linux-2.4.28/arch/i386/kernel/head.S~colinux-0.6.1 2003-11-28 13:26:19.000000000 -0500 -+++ linux-2.4.28/arch/i386/kernel/head.S 2004-11-27 15:59:21.287009904 -0500 -@@ -320,7 +320,7 @@ - ret - - ENTRY(stack_start) -- .long SYMBOL_NAME(init_task_union)+8192 -+ .long SYMBOL_NAME(init_task_union)+8192-100 - .long __KERNEL_DS - - /* This is the default interrupt "handler" :-) */ -@@ -361,12 +361,14 @@ - - ALIGN - .word 0 -+.globl idt_descr - idt_descr: - .word IDT_ENTRIES*8-1 # idt contains 256 entries - SYMBOL_NAME(idt): - .long SYMBOL_NAME(idt_table) - - .word 0 -+.globl gdt_descr - gdt_descr: - .word GDT_ENTRIES*8-1 - SYMBOL_NAME(gdt): ---- linux-2.4.28/arch/i386/kernel/i387.c~colinux-0.6.1 2003-08-25 07:44:39.000000000 -0400 -+++ linux-2.4.28/arch/i386/kernel/i387.c 2004-11-27 15:59:21.288009752 -0500 -@@ -342,6 +342,8 @@ - return 1; - } - -+CO_TRACE_STOP; -+ - int save_i387( struct _fpstate *buf ) - { - if ( !current->used_math ) -@@ -363,6 +365,8 @@ - } - } - -+CO_TRACE_CONTINUE; -+ - static inline int restore_i387_fsave( struct _fpstate *buf ) - { - struct task_struct *tsk = current; -@@ -383,6 +387,8 @@ - return err ? 1 : convert_fxsr_from_user( &tsk->thread.i387.fxsave, buf ); - } - -+CO_TRACE_STOP; -+ - int restore_i387( struct _fpstate *buf ) - { - int err; -@@ -400,6 +406,8 @@ - return err; - } - -+CO_TRACE_CONTINUE; -+ - /* - * ptrace request handlers. - */ ---- linux-2.4.28/arch/i386/kernel/i8259.c~colinux-0.6.1 2004-08-07 19:26:04.000000000 -0400 -+++ linux-2.4.28/arch/i386/kernel/i8259.c 2004-11-27 15:59:21.288009752 -0500 -@@ -24,6 +24,7 @@ - #include <asm/apic.h> - - #include <linux/irq.h> -+#include <linux/cooperative.h> - - /* - * Common place to define all x86 IRQ vectors -@@ -121,6 +122,81 @@ - #undef IRQ - #undef IRQLIST_16 - -+#ifdef CONFIG_COOPERATIVE -+ -+CO_TRACE_STOP; -+ -+void proxy_interrupt_handler(unsigned long interrupt, struct pt_regs regs) -+{ -+ co_passage_page->operation = CO_OPERATION_FORWARD_INTERRUPT; -+ co_passage_page->params[0] = interrupt + 0x20; -+ co_passage_page->params[1] = regs.eip; -+ co_passage_page->params[2] = (unsigned long)(&((&interrupt)[10])); -+ co_passage_page->host_state.flags &= ~(1 << 9); /* Turn IF off */ -+ -+ co_switch_wrapper(); -+ co_callback(); -+} -+ -+CO_TRACE_CONTINUE; -+ -+#define IRQLIST_16(x) \ -+ IRQ(x,0) IRQ(x,1) IRQ(x,2) IRQ(x,3) \ -+ IRQ(x,4) IRQ(x,5) IRQ(x,6) IRQ(x,7) \ -+ IRQ(x,8) IRQ(x,9) IRQ(x,a) IRQ(x,b) \ -+ IRQ(x,c) IRQ(x,d) IRQ(x,e) IRQ(x,f) -+ -+#define IRQLIST_224 \ -+ IRQLIST_16(0x0) IRQLIST_16(0x1) IRQLIST_16(0x2) IRQLIST_16(0x3) \ -+ IRQLIST_16(0x4) IRQLIST_16(0x5) IRQLIST_16(0x6) IRQLIST_16(0x7) \ -+ IRQLIST_16(0x8) IRQLIST_16(0x9) IRQLIST_16(0xa) IRQLIST_16(0xb) \ -+ IRQLIST_16(0xc) IRQLIST_16(0xd) -+ -+#define IRQ(x,y) \ -+ extern asmlinkage void IRQ_proxy_##x##y##_interrupt(void); -+IRQLIST_224; -+#undef IRQ -+ -+struct _fpstate co_interrupt_register_state; -+ -+#define BIRQ(id) \ -+asm( \ -+ "\n"__ALIGN_STR"\n" \ -+ ".section .text\n" \ -+ ".globl IRQ_proxy_" #id "_interrupt\n" \ -+ "IRQ_proxy_" #id "_interrupt:\n" \ -+ "push %eax\n\t" \ -+ SAVE_ALL \ -+ \ -+ "pushl $co_interrupt_register_state\n\t" \ -+ "call save_i387\n\t" \ -+ "popl %ebx\n\t" \ -+ "pushl $" #id "\n\t" \ -+ "call proxy_interrupt_handler\n\t" \ -+ "popl %ebx\n\t" \ -+ "pushl $co_interrupt_register_state\n\t" \ -+ "call restore_i387\n\t" \ -+ "popl %ebx\n\t" \ -+ \ -+ "jmp ret_from_intr\n" \ -+ ".previous\n" \ -+ ); \ -+ -+#define IRQ(x,y) BIRQ(x##y) -+IRQLIST_224; -+#undef IRQ -+ -+#define IRQ(x,y) &IRQ_proxy_##x##y##_interrupt, -+void (*proxy_interrupt[NR_IRQS])(void) = { -+ IRQLIST_224 -+}; -+#undef IRQ -+ -+#undef IRQLIST_16 -+#undef IRQLIST_224 -+ -+#endif -+ - /* - * This is the 'legacy' 8259A Programmable Interrupt Controller, - * present in the majority of PC/AT boxes. -@@ -441,15 +517,74 @@ - } - } - -+#ifdef CONFIG_X86_COPIC -+ -+/* -+ * Not like you have any other choice other than using -+ * COPIC in Cooperative mode. -+ */ -+ -+static void end_COPIC_irq(unsigned int irq) -+{ -+} -+ -+#define shutdown_COPIC_irq disable_COPIC_irq -+ -+static void mask_and_ack_COPIC(unsigned int irq) -+{ -+} -+ -+static unsigned int startup_COPIC_irq(unsigned int irq) -+{ -+ return 0; -+} -+ -+void disable_COPIC_irq(unsigned int irq) -+{ -+} -+ -+void enable_COPIC_irq(unsigned int irq) -+{ -+} -+ -+static struct hw_interrupt_type co_pic_irq_type = { -+ "CO-PIC", -+ startup_COPIC_irq, -+ shutdown_COPIC_irq, -+ enable_COPIC_irq, -+ disable_COPIC_irq, -+ mask_and_ack_COPIC, -+ end_COPIC_irq, -+ NULL -+}; -+ -+void __init init_COPIC_irqs(void) -+{ -+ int i; -+ -+ for (i = 0; i < NR_IRQS; i++) { -+ irq_desc[i].status = IRQ_DISABLED; -+ irq_desc[i].action = 0; -+ irq_desc[i].depth = 1; -+ -+ irq_desc[i].handler = &co_pic_irq_type; -+ } -+ -+} -+ -+#endif -+ - void __init init_IRQ(void) - { - int i; - -+#ifndef CONFIG_COOPERATIVE - #ifndef CONFIG_X86_VISWS_APIC - init_ISA_irqs(); - #else - init_VISWS_APIC_irqs(); - #endif -+ - /* - * Cover the whole vector space, no vector can escape - * us. (some of these will be overridden and become -@@ -490,6 +625,8 @@ - set_intr_gate(ERROR_APIC_VECTOR, error_interrupt); - #endif - -+ -+#ifndef CONFIG_COOPERATIVE - /* - * Set the clock to HZ Hz, we already have a valid - * vector now: -@@ -509,4 +646,20 @@ - */ - if (boot_cpu_data.hard_math && !cpu_has_fpu) - setup_irq(13, &irq13); -+#endif -+ -+#else -+ printk("Setting proxy interrupt vectors\n"); -+ -+#ifdef CONFIG_X86_COPIC -+ init_COPIC_irqs(); -+#endif -+ -+ for (i = 0; i < NR_IRQS; i++) { -+ int vector = FIRST_EXTERNAL_VECTOR + i; -+ if (vector != SYSCALL_VECTOR) { -+ set_intr_gate(vector, proxy_interrupt[i]); -+ } -+ } -+#endif - } ---- linux-2.4.28/arch/i386/kernel/ioport.c~colinux-0.6.1 2003-06-13 10:51:29.000000000 -0400 -+++ linux-2.4.28/arch/i386/kernel/ioport.c 2004-11-27 15:59:21.289009600 -0500 -@@ -54,6 +54,7 @@ - */ - asmlinkage int sys_ioperm(unsigned long from, unsigned long num, int turn_on) - { -+#ifndef CONFIG_COOPERATIVE - struct thread_struct * t = ¤t->thread; - struct tss_struct * tss = init_tss + smp_processor_id(); - -@@ -86,6 +87,10 @@ - } - - return 0; -+#else -+ /* No ports for yer VM */ -+ return -EPERM; -+#endif - } - - /* -@@ -101,6 +106,7 @@ - - asmlinkage int sys_iopl(unsigned long unused) - { -+#ifndef CONFIG_COOPERATIVE - struct pt_regs * regs = (struct pt_regs *) &unused; - unsigned int level = regs->ebx; - unsigned int old = (regs->eflags >> 12) & 3; -@@ -114,4 +120,8 @@ - } - regs->eflags = (regs->eflags & 0xffffcfff) | (level << 12); - return 0; -+#else -+ /* No IPL for yer VM */ -+ return -EPERM; -+#endif - } ---- linux-2.4.28/arch/i386/kernel/process.c~colinux-0.6.1 2004-11-17 06:54:21.000000000 -0500 -+++ linux-2.4.28/arch/i386/kernel/process.c 2004-11-27 15:59:21.289009600 -0500 -@@ -51,6 +51,7 @@ - #include <asm/apic.h> - - #include <linux/irq.h> -+#include <linux/cooperative.h> - - asmlinkage void ret_from_fork(void) __asm__("ret_from_fork"); - -@@ -131,11 +132,15 @@ - current->counter = -100; - - while (1) { -+#ifdef CONFIG_COOPERATIVE -+ co_idle_processor(); -+#else - void (*idle)(void) = pm_idle; - if (!idle) - idle = default_idle; - while (!current->need_resched) - idle(); -+#endif - schedule(); - check_pgt_cache(); - } -@@ -280,6 +285,7 @@ - */ - void machine_real_restart(unsigned char *code, int length) - { -+#ifndef CONFIG_COOPERATIVE - unsigned long flags; - - cli(); -@@ -363,10 +369,14 @@ - __asm__ __volatile__ ("ljmp $0x0008,%0" - : - : "i" ((void *) (0x1000 - sizeof (real_mode_switch) - 100))); -+#else -+ co_terminate(CO_TERMINATE_REBOOT); -+#endif - } - - void machine_restart(char * __unused) - { -+#ifndef CONFIG_COOPERATIVE - #if CONFIG_SMP - int cpuid; - -@@ -430,16 +440,26 @@ - } - - machine_real_restart(jump_to_bios, sizeof(jump_to_bios)); -+#else -+ co_terminate(CO_TERMINATE_REBOOT); -+#endif - } - - void machine_halt(void) - { -+#ifdef CONFIG_COOPERATIVE -+ co_terminate(CO_TERMINATE_HALT); -+#endif - } - - void machine_power_off(void) - { -+#ifndef CONFIG_COOPERATIVE - if (pm_power_off) - pm_power_off(); -+#else -+ co_terminate(CO_TERMINATE_POWEROFF); -+#endif - } - - extern void show_trace(unsigned long* esp); -@@ -657,12 +677,20 @@ - */ - tss->esp0 = next->esp0; - -+#ifdef CONFIG_COOPERATIVE -+ /* -+ * We would save %fs and %gs using an atomic operation in the -+ * just before the LDT of the next process is loaded. It is -+ * not here, it's in... -+ */ -+#else - /* - * Save away %fs and %gs. No need to save %es and %ds, as - * those are always kernel segments while inside the kernel. - */ - asm volatile("movl %%fs,%0":"=m" (*(int *)&prev->fs)); - asm volatile("movl %%gs,%0":"=m" (*(int *)&prev->gs)); -+#endif - - /* - * Restore %fs and %gs. ---- linux-2.4.28/arch/i386/kernel/setup.c~colinux-0.6.1 2004-08-07 19:26:04.000000000 -0400 -+++ linux-2.4.28/arch/i386/kernel/setup.c 2004-11-27 15:59:21.291009296 -0500 -@@ -108,6 +108,7 @@ - #include <asm/processor.h> - #include <linux/console.h> - #include <linux/module.h> -+#include <linux/cooperative.h> - #include <asm/mtrr.h> - #include <asm/uaccess.h> - #include <asm/system.h> -@@ -782,9 +783,18 @@ - int len = 0; - int userdef = 0; - -+#ifdef CONFIG_COOPERATIVE -+ /* -+ * Better to have 'root=/dev/cobd0' here. -+ */ -+ from = co_boot_parameters; -+ snprintf(saved_command_line, COMMAND_LINE_SIZE, "%s", -+ co_boot_parameters); -+#else - /* Save unparsed command line copy for /proc/cmdline */ - memcpy(saved_command_line, COMMAND_LINE, COMMAND_LINE_SIZE); - saved_command_line[COMMAND_LINE_SIZE-1] = '\0'; -+#endif - - for (;;) { - if (c != ' ') -@@ -1044,16 +1054,23 @@ - static unsigned long __init setup_memory(void) - { - unsigned long bootmap_size, start_pfn, max_low_pfn; -- -+#ifdef CONFIG_COOPERATIVE -+ unsigned long bootmem_size; -+ unsigned long bootmem_start; -+#endif - /* - * partially used pages are not usable - thus - * we are rounding upwards: - */ - start_pfn = PFN_UP(__pa(&_end)); - -+#ifdef CONFIG_COOPERATIVE -+ max_low_pfn = max_pfn = co_memory_size / PAGE_SIZE; -+#else - find_max_pfn(); - - max_low_pfn = find_max_low_pfn(); -+#endif - - #ifdef CONFIG_HIGHMEM - highstart_pfn = highend_pfn = max_pfn; -@@ -1065,12 +1082,19 @@ - #endif - printk(KERN_NOTICE "%ldMB LOWMEM available.\n", - pages_to_mb(max_low_pfn)); -+ - /* - * Initialize the boot-time allocator (with low memory only): - */ - bootmap_size = init_bootmem(start_pfn, max_low_pfn); - -- register_bootmem_low_pages(max_low_pfn); -+#ifdef CONFIG_COOPERATIVE -+ bootmap_size = (bootmap_size + PAGE_SIZE - 1) & PAGE_MASK; -+ bootmem_size = (0x800 << PAGE_SHIFT) - bootmap_size; -+ bootmem_start = co_core_end + bootmap_size; -+ -+ free_bootmem(__pa(bootmem_start), bootmem_size); -+#else - - /* - * Reserve the bootmem bitmap itself as well. We do this in two -@@ -1124,7 +1148,7 @@ - } - } - #endif -- -+#endif - return max_low_pfn; - } - -@@ -1176,7 +1200,9 @@ - - void __init setup_arch(char **cmdline_p) - { -+#ifndef CONFIG_COOPERATIVE - unsigned long max_low_pfn; -+#endif - - #ifdef CONFIG_VISWS - visws_get_board_type_and_rev(); -@@ -1186,6 +1212,7 @@ - blk_nohighio = 1; - #endif - -+ boot_cpu_data.hard_math = 1; - ROOT_DEV = to_kdev_t(ORIG_ROOT_DEV); - drive_info = DRIVE_INFO; - screen_info = SCREEN_INFO; -@@ -1203,7 +1230,10 @@ - rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0); - rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0); - #endif -+ -+#ifndef CONFIG_COOPERATIVE - setup_memory_region(); -+#endif - copy_edd(); - - if (!MOUNT_ROOT_RDONLY) -@@ -1230,8 +1260,10 @@ - #ifdef CONFIG_SMP - smp_alloc_memory(); /* AP processor realmode stacks in low memory*/ - #endif -+ - paging_init(); - -+#ifndef CONFIG_COOPERATIVE - dmi_scan_machine(); - - /* -@@ -1248,14 +1280,19 @@ - #endif - - register_memory(max_low_pfn); -+#endif - - #ifdef CONFIG_VT -+#ifdef CONFIG_COOPERATIVE_CONSOLE -+ conswitchp = &colinux_con; -+#else - #if defined(CONFIG_VGA_CONSOLE) - conswitchp = &vga_con; - #elif defined(CONFIG_DUMMY_CONSOLE) - conswitchp = &dummy_con; - #endif - #endif -+#endif - } - - static int cachesize_override __initdata = -1; -@@ -3216,29 +3253,41 @@ - if(current->mm) - BUG(); - enter_lazy_tlb(&init_mm, current, nr); -- - t->esp0 = current->thread.esp0; -+ - set_tss_desc(nr,t); - gdt_table[__TSS(nr)].b &= 0xfffffdff; -+ - load_TR(nr); - load_LDT(&init_mm.context); - - /* - * Clear all 6 debug registers: - */ -- -+#ifndef CONFIG_COOPERATIVE - #define CD(register) __asm__("movl %0,%%db" #register ::"r"(0) ); - - CD(0); CD(1); CD(2); CD(3); /* no db4 and db5 */; CD(6); CD(7); - - #undef CD -- -+#endif - /* - * Force FPU initialization: - */ - current->flags &= ~PF_USEDFPU; - current->used_math = 0; -+#ifndef CONFIG_COOPERATIVE - stts(); -+#else -+#if (0) -+ clear_in_cr4(X86_CR4_PVI); -+ clear_in_cr4(X86_CR4_DE); -+ clear_in_cr4(X86_CR4_MCE); -+ clear_in_cr4(X86_CR4_PGE); -+ flush_tlb_all(); -+ clear_in_cr4(X86_CR4_OSXMMEXCPT); -+#endif -+#endif - } - - /* ---- linux-2.4.28/arch/i386/kernel/time.c~colinux-0.6.1 2004-02-18 08:36:30.000000000 -0500 -+++ linux-2.4.28/arch/i386/kernel/time.c 2004-11-27 15:59:21.292009144 -0500 -@@ -84,8 +84,24 @@ - - spinlock_t rtc_lock = SPIN_LOCK_UNLOCKED; - --static inline unsigned long do_fast_gettimeoffset(void) -+static inline unsigned long long rdtsc_u64(void) -+{ -+ register unsigned long eax, edx; -+ -+ rdtsc(eax,edx); -+ -+ return ((((unsigned long long)edx) << 32) | eax); -+} -+ -+#ifdef CONFIG_COOPERATIVE -+static unsigned long long co_last_interrupt_time; -+static unsigned long co_tsc_per_5_ticks; -+static long co_last_time_offset; -+#endif -+ -+static inline long do_fast_gettimeoffset(void) - { -+#ifndef CONFIG_COOPERATIVE - register unsigned long eax, edx; - - /* Read the Time Stamp Counter */ -@@ -111,6 +127,32 @@ - - /* our adjusted time offset in microseconds */ - return delay_at_last_interrupt + edx; -+#else -+ union { -+ unsigned long long ll_var; -+ struct { unsigned long low, high; }; -+ } differential; -+ unsigned long edx; -+ unsigned long ret = 0; -+ -+ differential.ll_var = rdtsc_u64() - co_last_interrupt_time; -+ if (differential.high) -+ return 0; -+ -+ if (co_tsc_per_5_ticks == 0) -+ return 0; -+ -+ differential.ll_var *= 50000; -+ -+ __asm__("divl %2" -+ :"=a" (ret), "=d" (edx) -+ :"r" (co_tsc_per_5_ticks), -+ "0" (differential.low), "1" (differential.high)); -+ -+ ret += co_last_time_offset; -+ -+ return ret; -+#endif - } - - #define TICK_SIZE tick -@@ -121,6 +163,8 @@ - - extern spinlock_t i8259A_lock; - -+#ifndef CONFIG_COOPERATIVE -+ - #ifndef CONFIG_X86_TSC - - /* This function must be called with interrupts disabled -@@ -254,7 +298,16 @@ - return count; - } - --static unsigned long (*do_gettimeoffset)(void) = do_slow_gettimeoffset; -+#else -+ -+static unsigned long do_slow_gettimeoffset(void) -+{ -+ return 0; -+} -+ -+#endif -+ -+static long (*do_gettimeoffset)(void) = do_slow_gettimeoffset; - - - /* IBM Summit (EXA) Cyclone Timer code*/ -@@ -305,7 +358,7 @@ - delay_at_last_interrupt = (count + LATCH/2) / LATCH; - } - --static unsigned long do_gettimeoffset_cyclone(void) -+static long do_gettimeoffset_cyclone(void) - { - u32 offset; - -@@ -443,7 +496,8 @@ - void do_gettimeofday(struct timeval *tv) - { - unsigned long flags; -- unsigned long usec, sec; -+ unsigned long sec; -+ long usec; - - read_lock_irqsave(&xtime_lock, flags); - usec = do_gettimeoffset(); -@@ -461,6 +515,11 @@ - sec++; - } - -+ if (usec < 0) { -+ usec = usec + 1000000; -+ sec -= 1; -+ } -+ - tv->tv_sec = sec; - tv->tv_usec = usec; - } -@@ -502,6 +561,7 @@ - */ - static int set_rtc_mmss(unsigned long nowtime) - { -+#ifndef CONFIG_COOPERATIVE - int retval = 0; - int real_seconds, real_minutes, cmos_minutes; - unsigned char save_control, save_freq_select; -@@ -554,8 +614,13 @@ - CMOS_WRITE(save_control, RTC_CONTROL); - CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT); - spin_unlock(&rtc_lock); -- - return retval; -+#else -+ /* -+ * Don't let Linux change the system time of the host machine. -+ */ -+ return -1; -+#endif - } - - /* last time the cmos clock got updated */ -@@ -603,6 +668,7 @@ - smp_local_timer_interrupt(regs); - #endif - -+#ifndef CONFIG_COOPERATIVE - /* - * If we have an externally synchronized Linux clock, then update - * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be -@@ -617,6 +683,7 @@ - else - last_rtc_update = xtime.tv_sec - 600; /* do it again in 60 s */ - } -+#endif - - #ifdef CONFIG_MCA - if( MCA_bus ) { -@@ -655,6 +722,7 @@ - */ - write_lock(&xtime_lock); - -+#ifndef CONFIG_COOPERATIVE - if(use_cyclone) - mark_timeoffset_cyclone(); - else if (use_tsc) { -@@ -706,7 +774,15 @@ - count = ((LATCH-1) - count) * TICK_SIZE; - delay_at_last_interrupt = (count + LATCH/2) / LATCH; - } -- -+#else -+ if (use_tsc) { -+ if (co_last_interrupt_time == 0) -+ co_last_time_offset = 0; -+ else -+ co_last_time_offset = ((long)do_fast_gettimeoffset()) - 10000; -+ co_last_interrupt_time = rdtsc_u64(); -+ } -+#endif - do_timer_interrupt(irq, NULL, regs); - - write_unlock(&xtime_lock); -@@ -716,6 +792,7 @@ - /* not static: needed by APM */ - unsigned long get_cmos_time(void) - { -+#ifndef CONFIG_COOPERATIVE - unsigned int year, mon, day, hour, min, sec; - int i; - -@@ -753,6 +830,9 @@ - if ((year += 1900) < 1970) - year += 100; - return mktime(year, mon, day, hour, min, sec); -+#else -+ return co_get_host_time(); -+#endif - } - - static struct irqaction irq0 = { timer_interrupt, SA_INTERRUPT, 0, "timer", NULL, NULL}; -@@ -818,6 +898,10 @@ - if (endlow <= CALIBRATE_TIME) - goto bad_ctc; - -+#ifdef CONFIG_COOPERATIVE -+ co_tsc_per_5_ticks = endlow; -+#endif -+ - __asm__("divl %2" - :"=a" (endlow), "=d" (endhigh) - :"r" (endlow), "0" (0), "1" (CALIBRATE_TIME)); -@@ -870,7 +954,13 @@ - - if(use_cyclone) - init_cyclone_clock(); -- -+ -+#ifdef CONFIG_COOPERATIVE -+ /* -+ * We pretty much depend on this at the moment... -+ */ -+ set_bit(X86_FEATURE_TSC, &boot_cpu_data.x86_capability); -+#endif - if (cpu_has_tsc) { - unsigned long tsc_quotient = calibrate_tsc(); - if (tsc_quotient) { ---- linux-2.4.28/arch/i386/kernel/traps.c~colinux-0.6.1 2002-11-28 18:53:09.000000000 -0500 -+++ linux-2.4.28/arch/i386/kernel/traps.c 2004-11-27 15:59:21.293008992 -0500 -@@ -852,11 +852,20 @@ - "rorl $16,%%eax" \ - : "=m"(*(n)) : "a" (addr), "r"(n), "ir"(limit), "i"(type)) - -+CO_TRACE_STOP; -+ -+/* -+ * We use this in colinux_early_cpu_init(), so it must be protected -+ * from traces. -+ */ -+ - void set_tss_desc(unsigned int n, void *addr) - { - _set_tssldt_desc(gdt_table+__TSS(n), (int)addr, 235, 0x89); - } - -+CO_TRACE_CONTINUE; -+ - void set_ldt_desc(unsigned int n, void *addr, unsigned int size) - { - _set_tssldt_desc(gdt_table+__LDT(n), (int)addr, ((size << 3)-1), 0x82); ---- linux-2.4.28/arch/i386/mm/fault.c~colinux-0.6.1 2004-08-07 19:26:04.000000000 -0400 -+++ linux-2.4.28/arch/i386/mm/fault.c 2004-11-27 15:59:21.293008992 -0500 -@@ -380,7 +380,11 @@ - pte_t *pte_k; - - asm("movl %%cr3,%0":"=r" (pgd)); -+#ifndef CONFIG_COOPERATIVE - pgd = offset + (pgd_t *)__va(pgd); -+#else -+ pgd = offset + (pgd_t *)CO_VA(((unsigned long)pgd)); -+#endif - pgd_k = init_mm.pgd + offset; - - if (!pgd_present(*pgd_k)) ---- linux-2.4.28/arch/i386/mm/init.c~colinux-0.6.1 2004-04-14 09:05:25.000000000 -0400 -+++ linux-2.4.28/arch/i386/mm/init.c 2004-11-27 15:59:21.294008840 -0500 -@@ -38,6 +38,8 @@ - #include <asm/apic.h> - #include <asm/tlb.h> - -+#include <linux/cooperative.h> -+ - mmu_gather_t mmu_gathers[NR_CPUS]; - unsigned long highstart_pfn, highend_pfn; - static unsigned long totalram_pages; -@@ -122,7 +124,7 @@ - - /* References to section boundaries */ - --extern char _text, _etext, _edata, __bss_start, _end; -+extern char _text, _etext, _edata, _sdata, __bss_start, _end; - extern char __init_begin, __init_end; - - static inline void set_pte_phys (unsigned long vaddr, -@@ -204,6 +206,7 @@ - - static void __init pagetable_init (void) - { -+#ifndef CONFIG_COOPERATIVE - unsigned long vaddr, end; - pgd_t *pgd, *pgd_base; - int i, j, k; -@@ -300,6 +303,8 @@ - */ - pgd_base[0] = pgd_base[USER_PTRS_PER_PGD]; - #endif -+#else -+#endif - } - - void __init zap_low_mappings (void) -@@ -325,6 +330,7 @@ - unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0}; - unsigned int max_dma, high, low; - -+#ifndef CONFIG_COOPERATIVE - max_dma = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT; - low = max_low_pfn; - high = highend_pfn; -@@ -338,6 +344,11 @@ - zones_size[ZONE_HIGHMEM] = high - low; - #endif - } -+#else -+ zones_size[ZONE_DMA] = 0; -+ zones_size[ZONE_NORMAL] = max_low_pfn; -+ zones_size[ZONE_HIGHMEM] = 0; -+#endif - free_area_init(zones_size); - } - -@@ -485,6 +496,22 @@ - - bad_ppro = ppro_with_ram_bug(); - -+#ifdef CONFIG_COOPERATIVE -+ /* -+ * Only at this stage, after the buddy allocator's maps -+ * have been allocated, we can let the kernel use its -+ * other pseudo physical space. -+ */ -+ { -+ unsigned long bootmem_end = co_core_end + -+ (0x800 << PAGE_SHIFT); -+ unsigned long physical_end = __PAGE_OFFSET + -+ (max_low_pfn << PAGE_SHIFT); -+ -+ free_bootmem(__pa(bootmem_end), physical_end - bootmem_end); -+ } -+ -+#endif - /* this will put all low memory onto the freelists */ - totalram_pages += free_all_bootmem(); - -@@ -529,7 +556,7 @@ - reservedpages = free_pages_init(); - - codesize = (unsigned long) &_etext - (unsigned long) &_text; -- datasize = (unsigned long) &_edata - (unsigned long) &_etext; -+ datasize = (unsigned long) &_edata - (unsigned long) &_sdata; - initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin; - - printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, %dk init, %ldk highmem)\n", -@@ -546,19 +573,21 @@ - if (!cpu_has_pae) - panic("cannot execute a PAE-enabled kernel on a PAE-less CPU!"); - #endif -+#ifndef CONFIG_COOPERATIVE - if (boot_cpu_data.wp_works_ok < 0) - test_wp_bit(); -- -+#endif - /* - * Subtle. SMP is doing it's boot stuff late (because it has to - * fork idle threads) - but it also needs low mappings for the - * protected-mode entry to work. We zap these entries only after - * the WP-bit has been tested. - */ -+#ifndef CONFIG_COOPERATIVE - #ifndef CONFIG_SMP - zap_low_mappings(); - #endif -- -+#endif - } - - /* Put this after the callers, so that it cannot be inlined */ ---- linux-2.4.28/arch/i386/vmlinux.lds~colinux-0.6.1 2002-02-25 14:37:53.000000000 -0500 -+++ linux-2.4.28/arch/i386/vmlinux.lds 2004-11-27 15:59:21.294008840 -0500 -@@ -7,50 +7,72 @@ - SECTIONS - { - . = 0xC0000000 + 0x100000; -- _text = .; /* Text and read-only data */ -+ _kernel_start = .; - .text : { -+ _text = .; /* Text and read-only data */ - *(.text) - *(.fixup) - *(.gnu.warning) -- } = 0x9090 -- -- _etext = .; /* End of text section */ -+ _etext = .; /* End of text section */ -+ } - - .rodata : { *(.rodata) *(.rodata.*) } - .kstrtab : { *(.kstrtab) } - - . = ALIGN(16); /* Exception table */ -- __start___ex_table = .; -- __ex_table : { *(__ex_table) } -- __stop___ex_table = .; -+ __ex_table : { -+ __start___ex_table = .; -+ *(__ex_table) -+ __stop___ex_table = .; -+ } - -- __start___ksymtab = .; /* Kernel symbol table */ -- __ksymtab : { *(__ksymtab) } -- __stop___ksymtab = .; -+ . = ALIGN(4); -+ __import_table_address : { -+ __start_import_address = .; -+ *(__im_table_address) -+ __stop_import_address = .; -+ } - -+ __ksymtab : { -+ __start___ksymtab = .; /* Kernel symbol table */ -+ *(__ksymtab) -+ __stop___ksymtab = .; -+ } - .data : { /* Data */ -+ _sdata = .; /* Start of data section */ - *(.data) - CONSTRUCTORS -- } -+ _edata = .; /* End of data section */ -+ } - -- _edata = .; /* End of data section */ -+ . = ALIGN(4096); /* gdt */ -+ .data.gdt : { -+ *(.data.gdt) -+ } -+ .data.idt : { -+ *(.data.idt) -+ } - - . = ALIGN(8192); /* init_task */ -- .data.init_task : { *(.data.init_task) } -+ .data.init_task : { -+ *(.data.init_task) -+ } - - . = ALIGN(4096); /* Init code and data */ -- __init_begin = .; -- .text.init : { *(.text.init) } -- .data.init : { *(.data.init) } -- . = ALIGN(16); -- __setup_start = .; -- .setup.init : { *(.setup.init) } -- __setup_end = .; -- __initcall_start = .; -- .initcall.init : { *(.initcall.init) } -- __initcall_end = .; -- . = ALIGN(4096); -- __init_end = .; -+ .init : { -+ __init_begin = .; -+ *(.text.init) -+ *(.data.init) -+ . = ALIGN(16); -+ __setup_start = .; -+ *(.setup.init) -+ __setup_end = .; -+ __initcall_start = .; -+ *(.initcall.init) -+ __initcall_end = .; -+ . = ALIGN(4096); -+ __init_end = .; -+ } - - . = ALIGN(4096); - .data.page_aligned : { *(.data.idt) } -@@ -58,11 +80,11 @@ - . = ALIGN(32); - .data.cacheline_aligned : { *(.data.cacheline_aligned) } - -- __bss_start = .; /* BSS */ - .bss : { -+ __bss_start = .; /* BSS */ - *(.bss) -- } -- _end = . ; -+ _end = . ; -+ } - - /* Sections to be discarded */ - /DISCARD/ : { ---- linux-2.4.28/drivers/block/Config.in~colinux-0.6.1 2004-08-07 19:26:04.000000000 -0400 -+++ linux-2.4.28/drivers/block/Config.in 2004-11-27 15:59:21.294008840 -0500 -@@ -50,6 +50,10 @@ - fi - dep_bool ' Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD $CONFIG_BLK_DEV_RAM - -+if [ "$CONFIG_COOPERATIVE" = "y" ]; then -+ tristate 'coLinux block device support' CONFIG_BLK_DEV_PBD -+fi -+ - bool 'Per partition statistics in /proc/partitions' CONFIG_BLK_STATS - - endmenu ---- linux-2.4.28/drivers/block/Makefile~colinux-0.6.1 2004-08-07 19:26:04.000000000 -0400 -+++ linux-2.4.28/drivers/block/Makefile 2004-11-27 15:59:21.295008688 -0500 -@@ -31,6 +31,7 @@ - obj-$(CONFIG_BLK_DEV_DAC960) += DAC960.o - obj-$(CONFIG_BLK_DEV_UMEM) += umem.o - obj-$(CONFIG_BLK_DEV_NBD) += nbd.o -+obj-$(CONFIG_BLK_DEV_PBD) += cobd.o - obj-$(CONFIG_BLK_DEV_SX8) += sx8.o - - subdir-$(CONFIG_PARIDE) += paride ---- /dev/null 2004-04-06 13:56:48.000000000 -0400 -+++ linux-2.4.28/drivers/block/cobd.c 2004-11-27 15:59:21.295008688 -0500 -@@ -0,0 +1,334 @@ -+/* -+ * Copyright (C) 2003 Dan Aloni <da-x@gmx.net> -+ * -+ * Cooperative Linux Block Device implementation -+ */ -+ -+#include <linux/config.h> -+#include <linux/module.h> -+#include <linux/fs.h> -+#include <linux/errno.h> -+#include <linux/major.h> -+#include <linux/slab.h> -+#include <linux/devfs_fs_kernel.h> -+ -+#define MAJOR_NR COLINUX_MAJOR -+#define DEVICE_NR(device) MINOR(device) /* has no partition bits */ -+#define DEVICE_NAME "cobd" /* name for messaging */ -+#define DEVICE_NO_RANDOM /* no entropy to contribute */ -+#define DEVICE_REQUEST cobd_request -+#define DEVICE_OFF(d) /* do-nothing */ -+ -+#include <linux/blk.h> -+#include <linux/blkpg.h> -+#include <linux/hdreg.h> -+#include <linux/cooperative.h> -+ -+#include <asm/uaccess.h> -+ -+#define PBD_BLOCK_SIZE 512 -+ -+static int *cobd_sizes; -+static int *cobd_blksizes; -+static int *cobd_hardsects; -+static int cobd_devs; -+static int cobd_rahead = 1; -+ -+struct cobd_device_aliases_minor { -+ int cobd_minor; -+}; -+ -+struct cobd_device_aliases_major { -+ int sizes[0x100]; -+ int blksizes[0x100]; -+ int cobd_hardsects[0x100]; -+ struct cobd_device_aliases_minor *minors[0x100]; -+}; -+ -+static struct cobd_device_aliases_major *alias_majors; -+ -+static int cobd_stat(int dev, co_block_request_t *out_request) -+{ -+ co_block_request_t *request; -+ unsigned long flags; -+ long rc = 0; -+ -+ local_irq_save(flags); -+ co_passage_page->operation = CO_OPERATION_DEVICE; -+ co_passage_page->params[0] = CO_DEVICE_BLOCK; -+ co_passage_page->params[1] = dev; -+ request = (co_block_request_t *)&co_passage_page->params[2]; -+ request->type = CO_BLOCK_STAT; -+ co_switch_wrapper(); -+ rc = request->rc; -+ *out_request = *request; -+ local_irq_restore(flags); -+ -+ return rc; -+} -+ -+static int cobd_ioctl(struct inode * inode, struct file * file, -+ unsigned int cmd, unsigned long arg) -+{ -+ int err; -+ int dev; -+ -+ dev = MINOR(inode->i_rdev); -+ -+ switch(cmd) { -+ -+ case BLKGETSIZE: { -+ unsigned long size; -+ -+ /* Return the device size, expressed in sectors */ -+ if (!arg) -+ return -EINVAL; /* NULL pointer: not valid */ -+ -+ err = !access_ok (VERIFY_WRITE, arg, sizeof(long)); -+ if (err) -+ return -EFAULT; -+ -+ size = (cobd_sizes[dev]) * (1024 / cobd_hardsects[dev]); -+ if (copy_to_user((unsigned long *) arg, &size, sizeof (unsigned long))) -+ return -EFAULT; -+ -+ return 0; -+ } -+ -+ case BLKGETSIZE64: { -+ unsigned long long size; -+ -+ /* Return the device size, expressed in sectors */ -+ if (!arg) -+ return -EINVAL; /* NULL pointer: not valid */ -+ -+ err = !access_ok (VERIFY_WRITE, arg, sizeof(unsigned long long)); -+ if (err) -+ return -EFAULT; -+ -+ size = cobd_sizes[dev]; -+ size = size * 1024; -+ if (copy_to_user((unsigned long long *) arg, &size, sizeof (unsigned long long))) -+ return -EFAULT; -+ -+ return 0; -+ } -+ -+ case BLKRRPART: /* reread partition table: can't do it */ -+ return -ENOTTY; -+ -+ default: -+ /* -+ * For ioctls we don't understand, let the block layer -+ * handle them. -+ */ -+ return blk_ioctl(inode->i_rdev, cmd, arg); -+ } -+ -+ return -ENOTTY; /* unknown command */ -+} -+ -+static int cobd_open(struct inode *inode, struct file *file) -+{ -+ co_block_request_t *co_request; -+ co_block_request_t stat_request; -+ unsigned long flags; -+ int ret = 0; -+ int dev = MINOR(inode->i_rdev); -+ -+ if (dev >= cobd_devs) -+ return -EIO; -+ -+ if (!cobd_stat(dev, &stat_request)) { -+ unsigned long long size; -+ -+ /* Request succeeded */ -+ size = stat_request.disk_size; -+ cobd_sizes[dev] = size / 1024; -+ } else { -+ cobd_sizes[dev] = 0; -+ } -+ -+ local_irq_save(flags); -+ co_passage_page->operation = CO_OPERATION_DEVICE; -+ co_passage_page->params[0] = CO_DEVICE_BLOCK; -+ co_passage_page->params[1] = DEVICE_NR(inode->i_rdev); -+ co_request = (co_block_request_t *)&co_passage_page->params[2]; -+ co_request->type = CO_BLOCK_OPEN; -+ co_switch_wrapper(); -+ if (co_request->rc) -+ ret = -EIO; -+ local_irq_restore(flags); -+ -+ return ret; -+} -+ -+static int cobd_release(struct inode *inode, struct file *file) -+{ -+ co_block_request_t *co_request; -+ unsigned long flags; -+ int ret = 0; -+ local_irq_save(flags); -+ -+ co_passage_page->operation = CO_OPERATION_DEVICE; -+ co_passage_page->params[0] = CO_DEVICE_BLOCK; -+ co_passage_page->params[1] = DEVICE_NR(inode->i_rdev); -+ co_request = (co_block_request_t *)&co_passage_page->params[2]; -+ co_request->type = CO_BLOCK_CLOSE; -+ co_switch_wrapper(); -+ if (co_request->rc) -+ ret = -EIO; -+ local_irq_restore(flags); -+ -+ return ret; -+} -+ -+static int cobd_transfer(int dev, const struct request *req) -+{ -+ co_block_request_t *co_request; -+ unsigned long flags; -+ int ret = 0; -+ -+ local_irq_save(flags); -+ -+ co_passage_page->operation = CO_OPERATION_DEVICE; -+ co_passage_page->params[0] = CO_DEVICE_BLOCK; -+ co_passage_page->params[1] = dev; -+ co_request = (co_block_request_t *)&co_passage_page->params[2]; -+ if (req->cmd == READ) -+ co_request->type = CO_BLOCK_READ; -+ else -+ co_request->type = CO_BLOCK_WRITE; -+ co_request->offset = ((unsigned long long)req->sector) * PBD_BLOCK_SIZE; -+ co_request->size = req->current_nr_sectors * PBD_BLOCK_SIZE; -+ co_request->address = req->buffer; -+ co_request->rc = 0; -+ -+ co_switch_wrapper(); -+ -+ if (!co_request->rc) -+ ret = 1; -+ -+ local_irq_restore(flags); -+ -+ return ret; -+} -+ -+static void cobd_request(request_queue_t *q) -+{ -+ int status; -+ int devno; -+ -+ while (1) { -+ INIT_REQUEST; /* returns when queue is empty */ -+ -+ devno = DEVICE_NR(CURRENT->rq_dev); -+ -+ status = cobd_transfer(devno, CURRENT); -+ -+ end_request(status); -+ } -+} -+ -+static int cobd_check_change(kdev_t dev) -+{ -+ return 1; -+} -+ -+static struct block_device_operations cobd_fops = { -+ owner: THIS_MODULE, -+ open: cobd_open, -+ release: cobd_release, -+ ioctl: cobd_ioctl, -+ check_media_change: cobd_check_change, -+}; -+ -+int __init cobd_init(void) -+{ -+ int result; -+ int i; -+ -+ if (devfs_register_blkdev(MAJOR_NR, "cobd", &cobd_fops)) { -+ printk(KERN_WARNING "Unable to get major number %d for cobd device\n", MAJOR_NR); -+ return -EIO; -+ } -+ -+ blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), cobd_request); -+ -+ read_ahead[MAJOR_NR] = cobd_rahead; -+ result = -ENOMEM; /* for the possible errors */ -+ -+ cobd_devs = CO_MODULE_MAX_COBD; -+ -+ cobd_sizes = kmalloc(cobd_devs * sizeof(int), GFP_KERNEL); -+ if (!cobd_sizes) -+ goto fail_malloc; -+ -+ cobd_blksizes = kmalloc(cobd_devs * sizeof(int), GFP_KERNEL); -+ if (!cobd_blksizes) -+ goto fail_malloc_1; -+ -+ cobd_hardsects = kmalloc(cobd_devs * sizeof(int), GFP_KERNEL); -+ if (!cobd_hardsects) -+ goto fail_malloc_2; -+ -+ for (i=0; i < cobd_devs; i++) { -+ co_block_request_t request; -+ unsigned long long size = 0; -+ -+ if (!cobd_stat(i, &request)) { -+ /* Request successed */ -+ size = request.disk_size; -+ cobd_sizes[i] = size >> 10; -+ } else { -+ cobd_sizes[i] = 0; -+ } -+ -+ if (cobd_sizes[i] != 0) -+ printk(KERN_DEBUG "cobd%d size: %d kb\n", i, cobd_sizes[i]); -+ -+ cobd_blksizes[i] = PAGE_SIZE; -+ cobd_hardsects[i] = PBD_BLOCK_SIZE; -+ } -+ -+ blk_size[MAJOR_NR] = cobd_sizes; -+ blksize_size[MAJOR_NR] = cobd_blksizes; -+ hardsect_size[MAJOR_NR] = cobd_hardsects; -+ -+ devfs_register_series(NULL, "cobd%u", cobd_devs, DEVFS_FL_DEFAULT, -+ MAJOR_NR, 0, -+ S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP, -+ &cobd_fops, NULL); -+ -+ printk(KERN_DEBUG "cobd: loaded (max %d devices)\n", cobd_devs); -+ -+ return 0; -+ -+fail_malloc_2: -+ kfree(cobd_blksizes); -+fail_malloc_1: -+ kfree(cobd_sizes); -+fail_malloc: -+ -+ if (devfs_unregister_blkdev(MAJOR_NR, "cobd")) -+ printk(KERN_WARNING "loop: cannot unregister blkdev\n"); -+ -+ return result; -+} -+ -+void cobd_exit(void) -+{ -+ blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR)); -+ -+ if (devfs_unregister_blkdev(MAJOR_NR, "cobd")) -+ printk(KERN_WARNING "cobd: cannot unregister blkdev\n"); -+ -+ kfree(blk_size[MAJOR_NR]); -+ kfree(blksize_size[MAJOR_NR]); -+ kfree(hardsect_size[MAJOR_NR]); -+} -+ -+module_init(cobd_init); -+module_exit(cobd_exit); -+ -+ ---- linux-2.4.28/drivers/block/ll_rw_blk.c~colinux-0.6.1 2004-11-17 06:54:21.000000000 -0500 -+++ linux-2.4.28/drivers/block/ll_rw_blk.c 2004-11-27 15:59:21.298008232 -0500 -@@ -1576,7 +1576,7 @@ - #ifdef CONFIG_BLK_DEV_FD - floppy_init(); - #else --#if defined(__i386__) /* Do we even need this? */ -+#if defined(__i386__) && !defined(CONFIG_COOPERATIVE) /* Do we even need this? */ - outb_p(0xc, 0x3f2); - #endif - #endif ---- linux-2.4.28/drivers/char/Makefile~colinux-0.6.1 2004-08-07 19:26:04.000000000 -0400 -+++ linux-2.4.28/drivers/char/Makefile 2004-11-27 15:59:21.298008232 -0500 -@@ -169,6 +169,10 @@ - KEYBD = dummy_keyb.o - endif - -+ifeq ($(CONFIG_COOPERATIVE),y) -+ KEYBD = colx_keyb.o -+endif -+ - obj-$(CONFIG_VT) += vt.o vc_screen.o consolemap.o consolemap_deftbl.o $(CONSOLE) selection.o - obj-$(CONFIG_SERIAL) += $(SERIAL) - obj-$(CONFIG_PARPORT_SERIAL) += parport_serial.o ---- /dev/null 2004-04-06 13:56:48.000000000 -0400 -+++ linux-2.4.28/drivers/char/colx_keyb.c 2004-11-27 15:59:21.299008080 -0500 -@@ -0,0 +1,1228 @@ -+/* -+ * linux/drivers/char/pc_keyb.c -+ * -+ * Separation of the PC low-level part by Geert Uytterhoeven, May 1997 -+ * See keyboard.c for the whole history. -+ * -+ * Major cleanup by Martin Mares, May 1997 -+ * -+ * Combined the keyboard and PS/2 mouse handling into one file, -+ * because they share the same hardware. -+ * Johan Myreen <jem@iki.fi> 1998-10-08. -+ * -+ * Code fixes to handle mouse ACKs properly. -+ * C. Scott Ananian <cananian@alumni.princeton.edu> 1999-01-29. -+ * -+ */ -+ -+#include <linux/config.h> -+ -+#include <linux/spinlock.h> -+#include <linux/sched.h> -+#include <linux/interrupt.h> -+#include <linux/tty.h> -+#include <linux/mm.h> -+#include <linux/signal.h> -+#include <linux/init.h> -+#include <linux/kbd_ll.h> -+#include <linux/delay.h> -+#include <linux/random.h> -+#include <linux/poll.h> -+#include <linux/miscdevice.h> -+#include <linux/slab.h> -+#include <linux/kbd_kern.h> -+#include <linux/vt_kern.h> -+#include <linux/smp_lock.h> -+#include <linux/kd.h> -+#include <linux/pm.h> -+ -+#include <asm/keyboard.h> -+#include <asm/bitops.h> -+#include <asm/uaccess.h> -+#include <asm/irq.h> -+#include <asm/system.h> -+ -+#include <asm/io.h> -+ -+/* Some configuration switches are present in the include file... */ -+ -+#include <linux/pc_keyb.h> -+ -+/* Simple translation table for the SysRq keys */ -+ -+#ifdef CONFIG_MAGIC_SYSRQ -+unsigned char pckbd_sysrq_xlate[128] = -+ "\000\0331234567890-=\177\t" /* 0x00 - 0x0f */ -+ "qwertyuiop[]\r\000as" /* 0x10 - 0x1f */ -+ "dfghjkl;'`\000\\zxcv" /* 0x20 - 0x2f */ -+ "bnm,./\000*\000 \000\201\202\203\204\205" /* 0x30 - 0x3f */ -+ "\206\207\210\211\212\000\000789-456+1" /* 0x40 - 0x4f */ -+ "230\177\000\000\213\214\000\000\000\000\000\000\000\000\000\000" /* 0x50 - 0x5f */ -+ "\r\000/"; /* 0x60 - 0x6f */ -+#endif -+ -+static void kbd_write_command_w(int data); -+static void kbd_write_output_w(int data); -+#ifdef CONFIG_PSMOUSE -+static void aux_write_ack(int val); -+static void __aux_write_ack(int val); -+static int aux_reconnect = 0; -+#endif -+ -+#ifndef kbd_controller_present -+#define kbd_controller_present() 1 -+#endif -+static spinlock_t kbd_controller_lock = SPIN_LOCK_UNLOCKED; -+static unsigned char handle_kbd_event(void); -+ -+/* used only by send_data - set by keyboard_interrupt */ -+static volatile unsigned char reply_expected; -+static volatile unsigned char acknowledge; -+static volatile unsigned char resend; -+ -+ -+#if defined CONFIG_PSMOUSE -+/* -+ * PS/2 Auxiliary Device -+ */ -+ -+static int __init psaux_init(void); -+ -+#define AUX_RECONNECT1 0xaa /* scancode1 when ps2 device is plugged (back) in */ -+#define AUX_RECONNECT2 0x00 /* scancode2 when ps2 device is plugged (back) in */ -+ -+static struct aux_queue *queue; /* Mouse data buffer. */ -+static int aux_count; -+/* used when we send commands to the mouse that expect an ACK. */ -+static unsigned char mouse_reply_expected; -+ -+#define AUX_INTS_OFF (KBD_MODE_KCC | KBD_MODE_DISABLE_MOUSE | KBD_MODE_SYS | KBD_MODE_KBD_INT) -+#define AUX_INTS_ON (KBD_MODE_KCC | KBD_MODE_SYS | KBD_MODE_MOUSE_INT | KBD_MODE_KBD_INT) -+ -+#define MAX_RETRIES 60 /* some aux operations take long time*/ -+#endif /* CONFIG_PSMOUSE */ -+ -+/* -+ * Wait for keyboard controller input buffer to drain. -+ * -+ * Don't use 'jiffies' so that we don't depend on -+ * interrupts.. -+ * -+ * Quote from PS/2 System Reference Manual: -+ * -+ * "Address hex 0060 and address hex 0064 should be written only when -+ * the input-buffer-full bit and output-buffer-full bit in the -+ * Controller Status register are set 0." -+ */ -+ -+static void kb_wait(void) -+{ -+ unsigned long timeout = KBC_TIMEOUT; -+ -+ do { -+ /* -+ * "handle_kbd_event()" will handle any incoming events -+ * while we wait - keypresses or mouse movement. -+ */ -+ unsigned char status = handle_kbd_event(); -+ -+ if (! (status & KBD_STAT_IBF)) -+ return; -+ mdelay(1); -+ timeout--; -+ } while (timeout); -+#ifdef KBD_REPORT_TIMEOUTS -+ printk(KERN_WARNING "Keyboard timed out[1]\n"); -+#endif -+} -+ -+/* -+ * Translation of escaped scancodes to keycodes. -+ * This is now user-settable. -+ * The keycodes 1-88,96-111,119 are fairly standard, and -+ * should probably not be changed - changing might confuse X. -+ * X also interprets scancode 0x5d (KEY_Begin). -+ * -+ * For 1-88 keycode equals scancode. -+ */ -+ -+#define E0_KPENTER 96 -+#define E0_RCTRL 97 -+#define E0_KPSLASH 98 -+#define E0_PRSCR 99 -+#define E0_RALT 100 -+#define E0_BREAK 101 /* (control-pause) */ -+#define E0_HOME 102 -+#define E0_UP 103 -+#define E0_PGUP 104 -+#define E0_LEFT 105 -+#define E0_RIGHT 106 -+#define E0_END 107 -+#define E0_DOWN 108 -+#define E0_PGDN 109 -+#define E0_INS 110 -+#define E0_DEL 111 -+ -+#define E1_PAUSE 119 -+ -+/* -+ * The keycodes below are randomly located in 89-95,112-118,120-127. -+ * They could be thrown away (and all occurrences below replaced by 0), -+ * but that would force many users to use the `setkeycodes' utility, where -+ * they needed not before. It does not matter that there are duplicates, as -+ * long as no duplication occurs for any single keyboard. -+ */ -+#define SC_LIM 89 -+ -+#define FOCUS_PF1 85 /* actual code! */ -+#define FOCUS_PF2 89 -+#define FOCUS_PF3 90 -+#define FOCUS_PF4 91 -+#define FOCUS_PF5 92 -+#define FOCUS_PF6 93 -+#define FOCUS_PF7 94 -+#define FOCUS_PF8 95 -+#define FOCUS_PF9 120 -+#define FOCUS_PF10 121 -+#define FOCUS_PF11 122 -+#define FOCUS_PF12 123 -+ -+#define JAP_86 124 -+/* tfj@olivia.ping.dk: -+ * The four keys are located over the numeric keypad, and are -+ * labelled A1-A4. It's an rc930 keyboard, from -+ * Regnecentralen/RC International, Now ICL. -+ * Scancodes: 59, 5a, 5b, 5c. -+ */ -+#define RGN1 124 -+#define RGN2 125 -+#define RGN3 126 -+#define RGN4 127 -+ -+static unsigned char high_keys[128 - SC_LIM] = { -+ RGN1, RGN2, RGN3, RGN4, 0, 0, 0, /* 0x59-0x5f */ -+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x67 */ -+ 0, 0, 0, 0, 0, FOCUS_PF11, 0, FOCUS_PF12, /* 0x68-0x6f */ -+ 0, 0, 0, FOCUS_PF2, FOCUS_PF9, 0, 0, FOCUS_PF3, /* 0x70-0x77 */ -+ FOCUS_PF4, FOCUS_PF5, FOCUS_PF6, FOCUS_PF7, /* 0x78-0x7b */ -+ FOCUS_PF8, JAP_86, FOCUS_PF10, 0 /* 0x7c-0x7f */ -+}; -+ -+/* BTC */ -+#define E0_MACRO 112 -+/* LK450 */ -+#define E0_F13 113 -+#define E0_F14 114 -+#define E0_HELP 115 -+#define E0_DO 116 -+#define E0_F17 117 -+#define E0_KPMINPLUS 118 -+/* -+ * My OmniKey generates e0 4c for the "OMNI" key and the -+ * right alt key does nada. [kkoller@nyx10.cs.du.edu] -+ */ -+#define E0_OK 124 -+/* -+ * New microsoft keyboard is rumoured to have -+ * e0 5b (left window button), e0 5c (right window button), -+ * e0 5d (menu button). [or: LBANNER, RBANNER, RMENU] -+ * [or: Windows_L, Windows_R, TaskMan] -+ */ -+#define E0_MSLW 125 -+#define E0_MSRW 126 -+#define E0_MSTM 127 -+ -+static unsigned char e0_keys[128] = { -+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00-0x07 */ -+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x08-0x0f */ -+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10-0x17 */ -+ 0, 0, 0, 0, E0_KPENTER, E0_RCTRL, 0, 0, /* 0x18-0x1f */ -+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20-0x27 */ -+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x28-0x2f */ -+ 0, 0, 0, 0, 0, E0_KPSLASH, 0, E0_PRSCR, /* 0x30-0x37 */ -+ E0_RALT, 0, 0, 0, 0, E0_F13, E0_F14, E0_HELP, /* 0x38-0x3f */ -+ E0_DO, E0_F17, 0, 0, 0, 0, E0_BREAK, E0_HOME, /* 0x40-0x47 */ -+ E0_UP, E0_PGUP, 0, E0_LEFT, E0_OK, E0_RIGHT, E0_KPMINPLUS, E0_END,/* 0x48-0x4f */ -+ E0_DOWN, E0_PGDN, E0_INS, E0_DEL, 0, 0, 0, 0, /* 0x50-0x57 */ -+ 0, 0, 0, E0_MSLW, E0_MSRW, E0_MSTM, 0, 0, /* 0x58-0x5f */ -+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x67 */ -+ 0, 0, 0, 0, 0, 0, 0, E0_MACRO, /* 0x68-0x6f */ -+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70-0x77 */ -+ 0, 0, 0, 0, 0, 0, 0, 0 /* 0x78-0x7f */ -+}; -+ -+int pckbd_setkeycode(unsigned int scancode, unsigned int keycode) -+{ -+ if (scancode < SC_LIM || scancode > 255 || keycode > 127) -+ return -EINVAL; -+ if (scancode < 128) -+ high_keys[scancode - SC_LIM] = keycode; -+ else -+ e0_keys[scancode - 128] = keycode; -+ return 0; -+} -+ -+int pckbd_getkeycode(unsigned int scancode) -+{ -+ return -+ (scancode < SC_LIM || scancode > 255) ? -EINVAL : -+ (scancode < 128) ? high_keys[scancode - SC_LIM] : -+ e0_keys[scancode - 128]; -+} -+ -+static int do_acknowledge(unsigned char scancode) -+{ -+ if (reply_expected) { -+ /* Unfortunately, we must recognise these codes only if we know they -+ * are known to be valid (i.e., after sending a command), because there -+ * are some brain-damaged keyboards (yes, FOCUS 9000 again) which have -+ * keys with such codes :( -+ */ -+ if (scancode == KBD_REPLY_ACK) { -+ acknowledge = 1; -+ reply_expected = 0; -+ return 0; -+ } else if (scancode == KBD_REPLY_RESEND) { -+ resend = 1; -+ reply_expected = 0; -+ return 0; -+ } -+ /* Should not happen... */ -+#if 0 -+ printk(KERN_DEBUG "keyboard reply expected - got %02x\n", -+ scancode); -+#endif -+ } -+ return 1; -+} -+ -+int pckbd_translate(unsigned char scancode, unsigned char *keycode, -+ char raw_mode) -+{ -+ static int prev_scancode; -+ -+ /* special prefix scancodes.. */ -+ if (scancode == 0xe0 || scancode == 0xe1) { -+ prev_scancode = scancode; -+ return 0; -+ } -+ -+ /* 0xFF is sent by a few keyboards, ignore it. 0x00 is error */ -+ if (scancode == 0x00 || scancode == 0xff) { -+ prev_scancode = 0; -+ return 0; -+ } -+ -+ scancode &= 0x7f; -+ -+ if (prev_scancode) { -+ /* -+ * usually it will be 0xe0, but a Pause key generates -+ * e1 1d 45 e1 9d c5 when pressed, and nothing when released -+ */ -+ if (prev_scancode != 0xe0) { -+ if (prev_scancode == 0xe1 && scancode == 0x1d) { -+ prev_scancode = 0x100; -+ return 0; -+ } else if (prev_scancode == 0x100 && scancode == 0x45) { -+ *keycode = E1_PAUSE; -+ prev_scancode = 0; -+ } else { -+#ifdef KBD_REPORT_UNKN -+ if (!raw_mode) -+ printk(KERN_INFO "keyboard: unknown e1 escape sequence\n"); -+#endif -+ prev_scancode = 0; -+ return 0; -+ } -+ } else { -+ prev_scancode = 0; -+ /* -+ * The keyboard maintains its own internal caps lock and -+ * num lock statuses. In caps lock mode E0 AA precedes make -+ * code and E0 2A follows break code. In num lock mode, -+ * E0 2A precedes make code and E0 AA follows break code. -+ * We do our own book-keeping, so we will just ignore these. -+ */ -+ /* -+ * For my keyboard there is no caps lock mode, but there are -+ * both Shift-L and Shift-R modes. The former mode generates -+ * E0 2A / E0 AA pairs, the latter E0 B6 / E0 36 pairs. -+ * So, we should also ignore the latter. - aeb@cwi.nl -+ */ -+ if (scancode == 0x2a || scancode == 0x36) -+ return 0; -+ -+ if (e0_keys[scancode]) -+ *keycode = e0_keys[scancode]; -+ else { -+#ifdef KBD_REPORT_UNKN -+ if (!raw_mode) -+ printk(KERN_INFO "keyboard: unknown scancode e0 %02x\n", -+ scancode); -+#endif -+ return 0; -+ } -+ } -+ } else if (scancode >= SC_LIM) { -+ /* This happens with the FOCUS 9000 keyboard -+ Its keys PF1..PF12 are reported to generate -+ 55 73 77 78 79 7a 7b 7c 74 7e 6d 6f -+ Moreover, unless repeated, they do not generate -+ key-down events, so we have to zero up_flag below */ -+ /* Also, Japanese 86/106 keyboards are reported to -+ generate 0x73 and 0x7d for \ - and \ | respectively. */ -+ /* Also, some Brazilian keyboard is reported to produce -+ 0x73 and 0x7e for \ ? and KP-dot, respectively. */ -+ -+ *keycode = high_keys[scancode - SC_LIM]; -+ -+ if (!*keycode) { -+ if (!raw_mode) { -+#ifdef KBD_REPORT_UNKN -+ printk(KERN_INFO "keyboard: unrecognized scancode (%02x)" -+ " - ignored\n", scancode); -+#endif -+ } -+ return 0; -+ } -+ } else -+ *keycode = scancode; -+ return 1; -+} -+ -+char pckbd_unexpected_up(unsigned char keycode) -+{ -+ /* unexpected, but this can happen: maybe this was a key release for a -+ FOCUS 9000 PF key; if we want to see it, we have to clear up_flag */ -+ if (keycode >= SC_LIM || keycode == 85) -+ return 0; -+ else -+ return 0200; -+} -+ -+int pckbd_pm_resume(struct pm_dev *dev, pm_request_t rqst, void *data) -+{ -+#if defined CONFIG_PSMOUSE -+ unsigned long flags; -+ -+ if (rqst == PM_RESUME) { -+ if (queue) { /* Aux port detected */ -+ if (aux_count == 0) { /* Mouse not in use */ -+ spin_lock_irqsave(&kbd_controller_lock, flags); -+ /* -+ * Dell Lat. C600 A06 enables mouse after resume. -+ * When user touches the pad, it posts IRQ 12 -+ * (which we do not process), thus holding keyboard. -+ */ -+ kbd_write_command(KBD_CCMD_MOUSE_DISABLE); -+ /* kbd_write_cmd(AUX_INTS_OFF); */ /* Config & lock */ -+ kb_wait(); -+ kbd_write_command(KBD_CCMD_WRITE_MODE); -+ kb_wait(); -+ kbd_write_output(AUX_INTS_OFF); -+ spin_unlock_irqrestore(&kbd_controller_lock, flags); -+ } -+ } -+ } -+#endif -+ return 0; -+} -+ -+ -+static inline void handle_mouse_event(unsigned char scancode) -+{ -+#ifdef CONFIG_PSMOUSE -+ static unsigned char prev_code; -+ if (mouse_reply_expected) { -+ if (scancode == AUX_ACK) { -+ mouse_reply_expected--; -+ return; -+ } -+ mouse_reply_expected = 0; -+ } -+ else if(scancode == AUX_RECONNECT2 && prev_code == AUX_RECONNECT1 -+ && aux_reconnect) { -+ printk (KERN_INFO "PS/2 mouse reconnect detected\n"); -+ queue->head = queue->tail = 0; /* Flush input queue */ -+ __aux_write_ack(AUX_ENABLE_DEV); /* ping the mouse :) */ -+ return; -+ } -+ -+ prev_code = scancode; -+ add_mouse_randomness(scancode); -+ if (aux_count) { -+ int head = queue->head; -+ -+ queue->buf[head] = scancode; -+ head = (head + 1) & (AUX_BUF_SIZE-1); -+ if (head != queue->tail) { -+ queue->head = head; -+ kill_fasync(&queue->fasync, SIGIO, POLL_IN); -+ wake_up_interruptible(&queue->proc_list); -+ } -+ } -+#endif -+} -+ -+static unsigned char kbd_exists = 1; -+ -+void handle_keyboard_event(unsigned char scancode) -+{ -+#ifdef CONFIG_VT -+ kbd_exists = 1; -+ if (do_acknowledge(scancode)) -+ handle_scancode(scancode, !(scancode & 0x80)); -+#endif -+ tasklet_schedule(&keyboard_tasklet); -+} -+ -+/* -+ * This reads the keyboard status port, and does the -+ * appropriate action. -+ * -+ * It requires that we hold the keyboard controller -+ * spinlock. -+ */ -+static unsigned char handle_kbd_event(void) -+{ -+ unsigned char scancode; -+ co_linux_message_t *message; -+ -+ while (co_get_message(&message, CO_DEVICE_KEYBOARD)) { -+ co_scan_code_t *sc = (co_scan_code_t *)message->data; -+ unsigned long scancode = sc->code; -+ -+ if (!sc->down) -+ scancode |= 0x80; -+ -+ handle_keyboard_event(scancode); -+ -+ co_free_message(message); -+ } -+ -+ return 0; -+} -+ -+ -+static void keyboard_interrupt(int irq, void *dev_id, struct pt_regs *regs) -+{ -+#ifdef CONFIG_VT -+ kbd_pt_regs = regs; -+#endif -+ -+ spin_lock_irq(&kbd_controller_lock); -+ handle_kbd_event(); -+ spin_unlock_irq(&kbd_controller_lock); -+} -+ -+/* -+ * send_data sends a character to the keyboard and waits -+ * for an acknowledge, possibly retrying if asked to. Returns -+ * the success status. -+ * -+ * Don't use 'jiffies', so that we don't depend on interrupts -+ */ -+static int send_data(unsigned char data) -+{ -+ return 0; -+} -+ -+void pckbd_leds(unsigned char leds) -+{ -+ if (kbd_exists && (!send_data(KBD_CMD_SET_LEDS) || !send_data(leds))) { -+ send_data(KBD_CMD_ENABLE); /* re-enable kbd if any errors */ -+ kbd_exists = 0; -+ } -+} -+ -+#define DEFAULT_KEYB_REP_DELAY 250 -+#define DEFAULT_KEYB_REP_RATE 30 /* cps */ -+ -+static struct kbd_repeat kbdrate={ -+ DEFAULT_KEYB_REP_DELAY, -+ DEFAULT_KEYB_REP_RATE -+}; -+ -+static unsigned char parse_kbd_rate(struct kbd_repeat *r) -+{ -+ static struct r2v{ -+ int rate; -+ unsigned char val; -+ } kbd_rates[]={ {5,0x14}, -+ {7,0x10}, -+ {10,0x0c}, -+ {15,0x08}, -+ {20,0x04}, -+ {25,0x02}, -+ {30,0x00} -+ }; -+ static struct d2v{ -+ int delay; -+ unsigned char val; -+ } kbd_delays[]={{250,0}, -+ {500,1}, -+ {750,2}, -+ {1000,3} -+ }; -+ int rate=0,delay=0; -+ if (r != NULL){ -+ int i,new_rate=30,new_delay=250; -+ if (r->rate <= 0) -+ r->rate=kbdrate.rate; -+ if (r->delay <= 0) -+ r->delay=kbdrate.delay; -+ for (i=0; i < sizeof(kbd_rates)/sizeof(struct r2v); i++) -+ if (kbd_rates[i].rate == r->rate){ -+ new_rate=kbd_rates[i].rate; -+ rate=kbd_rates[i].val; -+ break; -+ } -+ for (i=0; i < sizeof(kbd_delays)/sizeof(struct d2v); i++) -+ if (kbd_delays[i].delay == r->delay){ -+ new_delay=kbd_delays[i].delay; -+ delay=kbd_delays[i].val; -+ break; -+ } -+ r->rate=new_rate; -+ r->delay=new_delay; -+ } -+ return (delay << 5) | rate; -+} -+ -+static int write_kbd_rate(unsigned char r) -+{ -+ if (!send_data(KBD_CMD_SET_RATE) || !send_data(r)){ -+ send_data(KBD_CMD_ENABLE); /* re-enable kbd if any errors */ -+ return 0; -+ }else -+ return 1; -+} -+ -+static int pckbd_rate(struct kbd_repeat *rep) -+{ -+ if (rep == NULL) -+ return -EINVAL; -+ else{ -+ unsigned char r=parse_kbd_rate(rep); -+ struct kbd_repeat old_rep; -+ memcpy(&old_rep,&kbdrate,sizeof(struct kbd_repeat)); -+ if (write_kbd_rate(r)){ -+ memcpy(&kbdrate,rep,sizeof(struct kbd_repeat)); -+ memcpy(rep,&old_rep,sizeof(struct kbd_repeat)); -+ return 0; -+ } -+ } -+ return -EIO; -+} -+ -+/* -+ * In case we run on a non-x86 hardware we need to initialize both the -+ * keyboard controller and the keyboard. On a x86, the BIOS will -+ * already have initialized them. -+ * -+ * Some x86 BIOSes do not correctly initialize the keyboard, so the -+ * "kbd-reset" command line options can be given to force a reset. -+ * [Ranger] -+ */ -+#ifdef __i386__ -+ int kbd_startup_reset __initdata = 0; -+#else -+ int kbd_startup_reset __initdata = 1; -+#endif -+ -+/* for "kbd-reset" cmdline param */ -+static int __init kbd_reset_setup(char *str) -+{ -+ kbd_startup_reset = 1; -+ return 1; -+} -+ -+__setup("kbd-reset", kbd_reset_setup); -+ -+#define KBD_NO_DATA (-1) /* No data */ -+#define KBD_BAD_DATA (-2) /* Parity or other error */ -+ -+static int __init kbd_read_data(void) -+{ -+ int retval = KBD_NO_DATA; -+ -+#if (0) -+ status = kbd_read_status(); -+ if (status & KBD_STAT_OBF) { -+ unsigned char data = kbd_read_input(); -+ -+ retval = data; -+ if (status & (KBD_STAT_GTO | KBD_STAT_PERR)) -+ retval = KBD_BAD_DATA; -+ } -+#endif -+ return retval; -+} -+ -+static void __init kbd_clear_input(void) -+{ -+ int maxread = 100; /* Random number */ -+ -+ do { -+ if (kbd_read_data() == KBD_NO_DATA) -+ break; -+ } while (--maxread); -+} -+ -+static int __init kbd_wait_for_input(void) -+{ -+ long timeout = KBD_INIT_TIMEOUT; -+ -+ do { -+ int retval = kbd_read_data(); -+ if (retval >= 0) -+ return retval; -+ mdelay(1); -+ } while (--timeout); -+ return -1; -+} -+ -+static void kbd_write_command_w(int data) -+{ -+ unsigned long flags; -+ -+ spin_lock_irqsave(&kbd_controller_lock, flags); -+ kb_wait(); -+ kbd_write_command(data); -+ spin_unlock_irqrestore(&kbd_controller_lock, flags); -+} -+ -+static void kbd_write_output_w(int data) -+{ -+ unsigned long flags; -+ -+ spin_lock_irqsave(&kbd_controller_lock, flags); -+ kb_wait(); -+ kbd_write_output(data); -+ spin_unlock_irqrestore(&kbd_controller_lock, flags); -+} -+ -+#if defined(__alpha__) -+/* -+ * Some Alphas cannot mask some/all interrupts, so we have to -+ * make sure not to allow interrupts AT ALL when polling for -+ * specific return values from the keyboard. -+ * -+ * I think this should work on any architecture, but for now, only Alpha. -+ */ -+static int kbd_write_command_w_and_wait(int data) -+{ -+ unsigned long flags; -+ int input; -+ -+ spin_lock_irqsave(&kbd_controller_lock, flags); -+ kb_wait(); -+ kbd_write_command(data); -+ input = kbd_wait_for_input(); -+ spin_unlock_irqrestore(&kbd_controller_lock, flags); -+ return input; -+} -+ -+static int kbd_write_output_w_and_wait(int data) -+{ -+ unsigned long flags; -+ int input; -+ -+ spin_lock_irqsave(&kbd_controller_lock, flags); -+ kb_wait(); -+ kbd_write_output(data); -+ input = kbd_wait_for_input(); -+ spin_unlock_irqrestore(&kbd_controller_lock, flags); -+ return input; -+} -+#else -+static int kbd_write_command_w_and_wait(int data) -+{ -+ kbd_write_command_w(data); -+ return kbd_wait_for_input(); -+} -+ -+static int kbd_write_output_w_and_wait(int data) -+{ -+ kbd_write_output_w(data); -+ return kbd_wait_for_input(); -+} -+#endif /* __alpha__ */ -+ -+#if defined CONFIG_PSMOUSE -+static void kbd_write_cmd(int cmd) -+{ -+ unsigned long flags; -+ -+ spin_lock_irqsave(&kbd_controller_lock, flags); -+ kb_wait(); -+ kbd_write_command(KBD_CCMD_WRITE_MODE); -+ kb_wait(); -+ kbd_write_output(cmd); -+ spin_unlock_irqrestore(&kbd_controller_lock, flags); -+} -+#endif /* CONFIG_PSMOUSE */ -+ -+static char * __init initialize_kbd(void) -+{ -+ int status; -+ -+ /* -+ * Test the keyboard interface. -+ * This seems to be the only way to get it going. -+ * If the test is successful a x55 is placed in the input buffer. -+ */ -+ kbd_write_command_w(KBD_CCMD_SELF_TEST); -+ if (kbd_wait_for_input() != 0x55) -+ return "Keyboard failed self test"; -+ -+ /* -+ * Perform a keyboard interface test. This causes the controller -+ * to test the keyboard clock and data lines. The results of the -+ * test are placed in the input buffer. -+ */ -+ kbd_write_command_w(KBD_CCMD_KBD_TEST); -+ if (kbd_wait_for_input() != 0x00) -+ return "Keyboard interface failed self test"; -+ -+ /* -+ * Enable the keyboard by allowing the keyboard clock to run. -+ */ -+ kbd_write_command_w(KBD_CCMD_KBD_ENABLE); -+ -+ /* -+ * Reset keyboard. If the read times out -+ * then the assumption is that no keyboard is -+ * plugged into the machine. -+ * This defaults the keyboard to scan-code set 2. -+ * -+ * Set up to try again if the keyboard asks for RESEND. -+ */ -+ do { -+ kbd_write_output_w(KBD_CMD_RESET); -+ status = kbd_wait_for_input(); -+ if (status == KBD_REPLY_ACK) -+ break; -+ if (status != KBD_REPLY_RESEND) -+ return "Keyboard reset failed, no ACK"; -+ } while (1); -+ -+ if (kbd_wait_for_input() != KBD_REPLY_POR) -+ return "Keyboard reset failed, no POR"; -+ -+ /* -+ * Set keyboard controller mode. During this, the keyboard should be -+ * in the disabled state. -+ * -+ * Set up to try again if the keyboard asks for RESEND. -+ */ -+ do { -+ kbd_write_output_w(KBD_CMD_DISABLE); -+ status = kbd_wait_for_input(); -+ if (status == KBD_REPLY_ACK) -+ break; -+ if (status != KBD_REPLY_RESEND) -+ return "Disable keyboard: no ACK"; -+ } while (1); -+ -+ kbd_write_command_w(KBD_CCMD_WRITE_MODE); -+ kbd_write_output_w(KBD_MODE_KBD_INT -+ | KBD_MODE_SYS -+ | KBD_MODE_DISABLE_MOUSE -+ | KBD_MODE_KCC); -+ -+ /* ibm powerpc portables need this to use scan-code set 1 -- Cort */ -+ if (!(kbd_write_command_w_and_wait(KBD_CCMD_READ_MODE) & KBD_MODE_KCC)) -+ { -+ /* -+ * If the controller does not support conversion, -+ * Set the keyboard to scan-code set 1. -+ */ -+ kbd_write_output_w(0xF0); -+ kbd_wait_for_input(); -+ kbd_write_output_w(0x01); -+ kbd_wait_for_input(); -+ } -+ -+ if (kbd_write_output_w_and_wait(KBD_CMD_ENABLE) != KBD_REPLY_ACK) -+ return "Enable keyboard: no ACK"; -+ -+ /* -+ * Finally, set the typematic rate to maximum. -+ */ -+ if (kbd_write_output_w_and_wait(KBD_CMD_SET_RATE) != KBD_REPLY_ACK) -+ return "Set rate: no ACK"; -+ if (kbd_write_output_w_and_wait(0x00) != KBD_REPLY_ACK) -+ return "Set rate: no 2nd ACK"; -+ -+ return NULL; -+} -+ -+void __init pckbd_init_hw(void) -+{ -+ if (!kbd_controller_present()) { -+ kbd_exists = 0; -+ return; -+ } -+ -+ kbd_request_region(); -+ -+ /* Flush any pending input. */ -+ kbd_clear_input(); -+ -+ if (kbd_startup_reset) { -+ char *msg = initialize_kbd(); -+ if (msg) -+ printk(KERN_WARNING "initialize_kbd: %s\n", msg); -+ } -+ -+#if defined CONFIG_PSMOUSE -+ psaux_init(); -+#endif -+ -+ kbd_rate = pckbd_rate; -+ -+ /* Ok, finally allocate the IRQ, and off we go.. */ -+ kbd_request_irq(keyboard_interrupt); -+} -+ -+#if defined CONFIG_PSMOUSE -+ -+static int __init aux_reconnect_setup (char *str) -+{ -+ aux_reconnect = 1; -+ return 1; -+} -+ -+__setup("psaux-reconnect", aux_reconnect_setup); -+ -+/* -+ * Check if this is a dual port controller. -+ */ -+static int __init detect_auxiliary_port(void) -+{ -+ unsigned long flags; -+ int loops = 10; -+ int retval = 0; -+ -+ /* Check if the BIOS detected a device on the auxiliary port. */ -+ if (aux_device_present == 0xaa) -+ return 1; -+ -+ spin_lock_irqsave(&kbd_controller_lock, flags); -+ -+ /* Put the value 0x5A in the output buffer using the "Write -+ * Auxiliary Device Output Buffer" command (0xD3). Poll the -+ * Status Register for a while to see if the value really -+ * turns up in the Data Register. If the KBD_STAT_MOUSE_OBF -+ * bit is also set to 1 in the Status Register, we assume this -+ * controller has an Auxiliary Port (a.k.a. Mouse Port). -+ */ -+ kb_wait(); -+ kbd_write_command(KBD_CCMD_WRITE_AUX_OBUF); -+ -+ kb_wait(); -+ kbd_write_output(0x5a); /* 0x5a is a random dummy value. */ -+ -+ do { -+ unsigned char status = kbd_read_status(); -+ -+ if (status & KBD_STAT_OBF) { -+ (void) kbd_read_input(); -+ if (status & KBD_STAT_MOUSE_OBF) { -+ printk(KERN_INFO "Detected PS/2 Mouse Port.\n"); -+ retval = 1; -+ } -+ break; -+ } -+ mdelay(1); -+ } while (--loops); -+ spin_unlock_irqrestore(&kbd_controller_lock, flags); -+ -+ return retval; -+} -+ -+/* -+ * Send a byte to the mouse. -+ */ -+static void aux_write_dev(int val) -+{ -+ unsigned long flags; -+ -+ spin_lock_irqsave(&kbd_controller_lock, flags); -+ kb_wait(); -+ kbd_write_command(KBD_CCMD_WRITE_MOUSE); -+ kb_wait(); -+ kbd_write_output(val); -+ spin_unlock_irqrestore(&kbd_controller_lock, flags); -+} -+ -+/* -+ * Send a byte to the mouse & handle returned ack -+ */ -+static void __aux_write_ack(int val) -+{ -+ kb_wait(); -+ kbd_write_command(KBD_CCMD_WRITE_MOUSE); -+ kb_wait(); -+ kbd_write_output(val); -+ /* we expect an ACK in response. */ -+ mouse_reply_expected++; -+ kb_wait(); -+} -+ -+static void aux_write_ack(int val) -+{ -+ unsigned long flags; -+ -+ spin_lock_irqsave(&kbd_controller_lock, flags); -+ __aux_write_ack(val); -+ spin_unlock_irqrestore(&kbd_controller_lock, flags); -+} -+ -+static unsigned char get_from_queue(void) -+{ -+ unsigned char result; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&kbd_controller_lock, flags); -+ result = queue->buf[queue->tail]; -+ queue->tail = (queue->tail + 1) & (AUX_BUF_SIZE-1); -+ spin_unlock_irqrestore(&kbd_controller_lock, flags); -+ return result; -+} -+ -+ -+static inline int queue_empty(void) -+{ -+ return queue->head == queue->tail; -+} -+ -+static int fasync_aux(int fd, struct file *filp, int on) -+{ -+ int retval; -+ -+ retval = fasync_helper(fd, filp, on, &queue->fasync); -+ if (retval < 0) -+ return retval; -+ return 0; -+} -+ -+ -+/* -+ * Random magic cookie for the aux device -+ */ -+#define AUX_DEV ((void *)queue) -+ -+static int release_aux(struct inode * inode, struct file * file) -+{ -+ lock_kernel(); -+ fasync_aux(-1, file, 0); -+ if (--aux_count) { -+ unlock_kernel(); -+ return 0; -+ } -+ kbd_write_cmd(AUX_INTS_OFF); /* Disable controller ints */ -+ kbd_write_command_w(KBD_CCMD_MOUSE_DISABLE); -+ aux_free_irq(AUX_DEV); -+ unlock_kernel(); -+ return 0; -+} -+ -+/* -+ * Install interrupt handler. -+ * Enable auxiliary device. -+ */ -+ -+static int open_aux(struct inode * inode, struct file * file) -+{ -+ if (aux_count++) { -+ return 0; -+ } -+ queue->head = queue->tail = 0; /* Flush input queue */ -+ if (aux_request_irq(keyboard_interrupt, AUX_DEV)) { -+ aux_count--; -+ return -EBUSY; -+ } -+ kbd_write_command_w(KBD_CCMD_MOUSE_ENABLE); /* Enable the -+ auxiliary port on -+ controller. */ -+ aux_write_ack(AUX_ENABLE_DEV); /* Enable aux device */ -+ kbd_write_cmd(AUX_INTS_ON); /* Enable controller ints */ -+ -+ mdelay(2); /* Ensure we follow the kbc access delay rules.. */ -+ -+ send_data(KBD_CMD_ENABLE); /* try to workaround toshiba4030cdt problem */ -+ -+ return 0; -+} -+ -+/* -+ * Put bytes from input queue to buffer. -+ */ -+ -+static ssize_t read_aux(struct file * file, char * buffer, -+ size_t count, loff_t *ppos) -+{ -+ DECLARE_WAITQUEUE(wait, current); -+ ssize_t i = count; -+ unsigned char c; -+ -+ if (queue_empty()) { -+ if (file->f_flags & O_NONBLOCK) -+ return -EAGAIN; -+ add_wait_queue(&queue->proc_list, &wait); -+repeat: -+ set_current_state(TASK_INTERRUPTIBLE); -+ if (queue_empty() && !signal_pending(current)) { -+ schedule(); -+ goto repeat; -+ } -+ current->state = TASK_RUNNING; -+ remove_wait_queue(&queue->proc_list, &wait); -+ } -+ while (i > 0 && !queue_empty()) { -+ c = get_from_queue(); -+ put_user(c, buffer++); -+ i--; -+ } -+ if (count-i) { -+ file->f_dentry->d_inode->i_atime = CURRENT_TIME; -+ return count-i; -+ } -+ if (signal_pending(current)) -+ return -ERESTARTSYS; -+ return 0; -+} -+ -+/* -+ * Write to the aux device. -+ */ -+ -+static ssize_t write_aux(struct file * file, const char * buffer, -+ size_t count, loff_t *ppos) -+{ -+ ssize_t retval = 0; -+ -+ if (count) { -+ ssize_t written = 0; -+ -+ if (count > 32) -+ count = 32; /* Limit to 32 bytes. */ -+ do { -+ char c; -+ get_user(c, buffer++); -+ aux_write_dev(c); -+ written++; -+ } while (--count); -+ retval = -EIO; -+ if (written) { -+ retval = written; -+ file->f_dentry->d_inode->i_mtime = CURRENT_TIME; -+ } -+ } -+ -+ return retval; -+} -+ -+/* No kernel lock held - fine */ -+static unsigned int aux_poll(struct file *file, poll_table * wait) -+{ -+ poll_wait(file, &queue->proc_list, wait); -+ if (!queue_empty()) -+ return POLLIN | POLLRDNORM; -+ return 0; -+} -+ -+struct file_operations psaux_fops = { -+ read: read_aux, -+ write: write_aux, -+ poll: aux_poll, -+ open: open_aux, -+ release: release_aux, -+ fasync: fasync_aux, -+}; -+ -+/* -+ * Initialize driver. -+ */ -+static struct miscdevice psaux_mouse = { -+ PSMOUSE_MINOR, "psaux", &psaux_fops -+}; -+ -+static int __init psaux_init(void) -+{ -+ int retval; -+ -+ if (!detect_auxiliary_port()) -+ return -EIO; -+ -+ if ((retval = misc_register(&psaux_mouse))) -+ return retval; -+ -+ queue = (struct aux_queue *) kmalloc(sizeof(*queue), GFP_KERNEL); -+ if (queue == NULL) { -+ printk(KERN_ERR "psaux_init(): out of memory\n"); -+ misc_deregister(&psaux_mouse); -+ return -ENOMEM; -+ } -+ memset(queue, 0, sizeof(*queue)); -+ queue->head = queue->tail = 0; -+ init_waitqueue_head(&queue->proc_list); -+ -+#ifdef INITIALIZE_MOUSE -+ kbd_write_command_w(KBD_CCMD_MOUSE_ENABLE); /* Enable Aux. */ -+ aux_write_ack(AUX_SET_SAMPLE); -+ aux_write_ack(100); /* 100 samples/sec */ -+ aux_write_ack(AUX_SET_RES); -+ aux_write_ack(3); /* 8 counts per mm */ -+ aux_write_ack(AUX_SET_SCALE21); /* 2:1 scaling */ -+#endif /* INITIALIZE_MOUSE */ -+ kbd_write_command(KBD_CCMD_MOUSE_DISABLE); /* Disable aux device. */ -+ kbd_write_cmd(AUX_INTS_OFF); /* Disable controller ints. */ -+ -+ return 0; -+} -+ -+#endif /* CONFIG_PSMOUSE */ -+ -+ -+static int blink_frequency = HZ/2; -+ -+/* Tell the user who may be running in X and not see the console that we have -+ panic'ed. This is to distingush panics from "real" lockups. -+ Could in theory send the panic message as morse, but that is left as an -+ exercise for the reader. */ -+void panic_blink(void) -+{ -+ static unsigned long last_jiffie; -+ static char led; -+ /* Roughly 1/2s frequency. KDB uses about 1s. Make sure it is -+ different. */ -+ if (!blink_frequency) -+ return; -+ if (jiffies - last_jiffie > blink_frequency) { -+ led ^= 0x01 | 0x04; -+ while (kbd_read_status() & KBD_STAT_IBF) mdelay(1); -+ kbd_write_output(KBD_CMD_SET_LEDS); -+ mdelay(1); -+ while (kbd_read_status() & KBD_STAT_IBF) mdelay(1); -+ mdelay(1); -+ kbd_write_output(led); -+ last_jiffie = jiffies; -+ } -+} -+ -+static int __init panicblink_setup(char *str) -+{ -+ int par; -+ if (get_option(&str,&par)) -+ blink_frequency = par*(1000/HZ); -+ return 1; -+} -+ -+/* panicblink=0 disables the blinking as it caused problems with some console -+ switches. otherwise argument is ms of a blink period. */ -+__setup("panicblink=", panicblink_setup); -+ ---- linux-2.4.28/drivers/char/mem.c~colinux-0.6.1 2004-08-07 19:26:04.000000000 -0400 -+++ linux-2.4.28/drivers/char/mem.c 2004-11-27 15:59:21.304007320 -0500 -@@ -667,20 +667,24 @@ - static int memory_open(struct inode * inode, struct file * filp) - { - switch (MINOR(inode->i_rdev)) { -+#ifndef CONFIG_COOPERATIVE - case 1: - filp->f_op = &mem_fops; - break; - case 2: - filp->f_op = &kmem_fops; - break; -+#endif - case 3: - filp->f_op = &null_fops; - break; -+#ifndef CONFIG_COOPERATIVE - #if defined(CONFIG_ISA) || !defined(__mc68000__) - case 4: - filp->f_op = &port_fops; - break; - #endif -+#endif - case 5: - filp->f_op = &zero_fops; - break; -@@ -710,12 +714,16 @@ - umode_t mode; - struct file_operations *fops; - } list[] = { /* list of minor devices */ -+#ifndef CONFIG_COOPERATIVE - {1, "mem", S_IRUSR | S_IWUSR | S_IRGRP, &mem_fops}, - {2, "kmem", S_IRUSR | S_IWUSR | S_IRGRP, &kmem_fops}, -+#endif - {3, "null", S_IRUGO | S_IWUGO, &null_fops}, -+#ifndef CONFIG_COOPERATIVE - #if defined(CONFIG_ISA) || !defined(__mc68000__) - {4, "port", S_IRUSR | S_IWUSR | S_IRGRP, &port_fops}, - #endif -+#endif - {5, "zero", S_IRUGO | S_IWUGO, &zero_fops}, - {7, "full", S_IRUGO | S_IWUGO, &full_fops}, - {8, "random", S_IRUGO | S_IWUSR, &random_fops}, ---- linux-2.4.28/drivers/char/vt.c~colinux-0.6.1 2002-11-28 18:53:12.000000000 -0500 -+++ linux-2.4.28/drivers/char/vt.c 2004-11-27 15:59:21.305007168 -0500 -@@ -90,10 +90,10 @@ - * comments - KDMKTONE doesn't put the process to sleep. - */ - --#if defined(__i386__) || defined(__alpha__) || defined(CONFIG_PPC_ISATIMER) \ -- || (defined(__mips__) && defined(CONFIG_ISA)) \ -- || (defined(__arm__) && defined(CONFIG_HOST_FOOTBRIDGE)) \ -- || defined(__x86_64__) -+#if (defined(__i386__) || defined(__alpha__) || defined(CONFIG_PPC_ISATIMER) \ -+ || (defined(__mips__) && defined(CONFIG_ISA)) \ -+ || (defined(__arm__) && defined(CONFIG_HOST_FOOTBRIDGE)) \ -+ || defined(__x86_64__)) && !defined(CONFIG_COOPERATIVE) - - static void - kd_nosound(unsigned long ignored) ---- linux-2.4.28/drivers/net/Config.in~colinux-0.6.1 2004-08-07 19:26:04.000000000 -0400 -+++ linux-2.4.28/drivers/net/Config.in 2004-11-27 15:59:21.306007016 -0500 -@@ -287,6 +287,10 @@ - dep_tristate 'iSeries Virtual Ethernet driver support' CONFIG_VETH $CONFIG_PPC_ISERIES - fi - -+if [ "$CONFIG_COOPERATIVE" = "y" ]; then -+ tristate 'Coooperative Virtual Ethernet driver support' CONFIG_COOPERATIVE_CONET -+fi -+ - if [ "$CONFIG_4xx" = "y" ]; then - source drivers/net/ibm_emac/Config.in - fi ---- linux-2.4.28/drivers/net/Makefile~colinux-0.6.1 2004-08-07 19:26:04.000000000 -0400 -+++ linux-2.4.28/drivers/net/Makefile 2004-11-27 15:59:21.306007016 -0500 -@@ -212,6 +212,7 @@ - - # This is also a 82596 and should probably be merged - obj-$(CONFIG_LP486E) += lp486e.o -+obj-$(CONFIG_COOPERATIVE_CONET) += conet.o - - obj-$(CONFIG_ETH16I) += eth16i.o - obj-$(CONFIG_ZORRO8390) += zorro8390.o 8390.o ---- /dev/null 2004-04-06 13:56:48.000000000 -0400 -+++ linux-2.4.28/drivers/net/conet.c 2004-11-27 15:59:21.307006864 -0500 -@@ -0,0 +1,309 @@ -+/* -+ * Copyright (C) 2003-2004 Dan Aloni <da-x@gmx.net> -+ * Copyright (C) 2004 Pat Erley -+ * Copyright (C) 2004 George Boutwell -+ * -+ * Cooperative Linux Network Device implementation -+ */ -+ -+#include <linux/config.h> -+#include <linux/version.h> -+#include <linux/module.h> -+ -+#include <linux/kernel.h> -+ -+#include <linux/netdevice.h> -+#include <linux/etherdevice.h> -+#include <linux/skbuff.h> -+#include <linux/ethtool.h> -+ -+#include <linux/cooperative.h> -+#include <asm/irq.h> -+ -+struct conet_priv { -+ struct net_device_stats stats; -+ co_linux_message_t *message; -+ int status; -+ int unit; -+ int enabled; -+}; -+ -+struct net_device *conet_dev[CO_MODULE_MAX_CONET]; -+ -+void conet_interrupt(int irq, void *dev_id, struct pt_regs *reg_ptr); -+ -+static int conet_get_mac(int unit, char *address) -+{ -+ unsigned long flags = 0; -+ co_network_request_t *net_request; -+ int result = 0; -+ -+ local_irq_save(flags); -+ co_passage_page->operation = CO_OPERATION_DEVICE; -+ co_passage_page->params[0] = CO_DEVICE_NETWORK; -+ net_request = (typeof(net_request))&co_passage_page->params[1]; -+ net_request->unit = unit; -+ net_request->type = CO_NETWORK_GET_MAC; -+ co_switch_wrapper(); -+ memcpy(address, net_request->mac_address, ETH_ALEN); -+ result = net_request->result; -+ local_irq_restore(flags); -+ -+ return result; -+} -+ -+int conet_open(struct net_device *dev) -+{ -+ struct conet_priv *priv = (struct conet_priv *)dev->priv; -+ -+ if (priv->enabled) -+ return 0; -+ -+ MOD_INC_USE_COUNT; -+ -+ conet_get_mac(priv->unit, dev->dev_addr); -+ -+ priv->enabled = 1; -+ -+ netif_start_queue(dev); -+ -+ return 0; -+} -+ -+int conet_stop(struct net_device *dev) -+{ -+ struct conet_priv *priv = (struct conet_priv *)dev->priv; -+ -+ priv->enabled = 0; -+ -+ netif_stop_queue(dev); /* can't transmit any more */ -+ -+ MOD_DEC_USE_COUNT; -+ -+ return 0; -+} -+ -+int conet_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) -+{ -+ int len; -+ char *data; -+ struct conet_priv *priv = (struct conet_priv *)dev->priv; -+ -+ len = skb->len < ETH_ZLEN ? ETH_ZLEN : skb->len; -+ data = skb->data; -+ -+ dev->trans_start = jiffies; /* save the timestamp */ -+ -+ co_send_message(CO_MODULE_LINUX, -+ CO_MODULE_CONET0 + priv->unit, -+ CO_PRIORITY_DISCARDABLE, -+ CO_MESSAGE_TYPE_OTHER, -+ len, -+ data); -+ -+ priv->stats.tx_bytes+=skb->len; -+ priv->stats.tx_packets++; -+ -+ dev_kfree_skb(skb); -+ -+ return 0; -+} -+ -+void conet_rx(struct net_device *dev) -+{ -+ struct sk_buff *skb; -+ struct conet_priv *priv = (struct conet_priv *)dev->priv; -+ int len; -+ unsigned char *buf; -+ co_linux_message_t *message; -+ -+ message = priv->message; -+ if (message == NULL) { -+ printk("conet rx: no message\n"); -+ return; -+ } -+ -+ priv->message = NULL; -+ -+ len = message->size; -+ buf = message->data; -+ -+ /* -+ * The packet has been retrieved from the transmission -+ * medium. Build an skb around it, so upper layers can handle it -+ */ -+ skb = dev_alloc_skb(len+2); -+ if (!skb) { -+ printk("conet rx: low on mem - packet dropped\n"); -+ priv->stats.rx_dropped++; -+ co_free_message(message); -+ return; -+ } -+ -+ memcpy(skb_put(skb, len), buf, len); -+ -+ /* Write metadata, and then pass to the receive level */ -+ skb->dev = dev; -+ skb->protocol = eth_type_trans(skb, dev); -+ skb->ip_summed = CHECKSUM_UNNECESSARY; /* don't check it */ -+ -+ priv->stats.rx_bytes += len; -+ priv->stats.rx_packets++; -+ -+ netif_rx(skb); -+ -+ co_free_message(message); -+ return; -+} -+ -+void conet_interrupt(int irq, void *dev_id, struct pt_regs *reg_ptr) -+{ -+ co_linux_message_t *message; -+ -+ while (co_get_message(&message, CO_DEVICE_NETWORK)) { -+ struct net_device *dev; -+ struct conet_priv *priv; -+ -+ if (message->unit < 0 || message->unit >= CO_MODULE_MAX_CONET) { -+ printk("conet intrrupt: buggy network reception\n"); -+ return; -+ } -+ -+ dev = conet_dev[message->unit]; -+ if (!netif_running(dev)) { -+ co_free_message(message); -+ continue; -+ } -+ -+ priv = (struct conet_priv *)dev->priv; -+ if (priv->message != NULL) { -+ printk("conet intrrupt: freeing unhandled packet\n"); -+ co_free_message(message); -+ continue; -+ } -+ -+ priv->message = message; -+ conet_rx(dev); -+ } -+} -+ -+struct net_device_stats* conet_get_stats(struct net_device *dev) -+{ -+ return (struct net_device_stats *)dev->priv; -+} -+ -+int conet_init(struct net_device *dev) -+{ -+ struct conet_priv *priv = (struct conet_priv *)dev->priv; -+ -+ memset(&priv->stats, 0, sizeof(priv->stats)); -+ -+ ether_setup(dev); -+ -+ dev->open = conet_open; -+ dev->stop = conet_stop; -+ dev->hard_start_xmit = conet_hard_start_xmit; -+ dev->get_stats = conet_get_stats; -+ dev->irq = NETWORK_IRQ; -+ -+ SET_MODULE_OWNER(dev); -+ -+ return 0; -+} -+ -+void conet_uninit(struct net_device *dev) -+{ -+} -+ -+static struct net_device *conet_create(int unit) -+{ -+ struct net_device *dev; -+ struct conet_priv *priv; -+ int result = 0; -+ -+ dev = kmalloc(sizeof(struct net_device), GFP_KERNEL); -+ if (!dev) { -+ return ERR_PTR(-ENOMEM); -+ } -+ -+ memset(dev, 0, sizeof(struct net_device)); -+ -+ priv = kmalloc(sizeof(struct conet_priv), GFP_KERNEL); -+ if (priv == NULL) { -+ kfree(dev); -+ return ERR_PTR(-ENOMEM); -+ } -+ -+ memset(priv, 0, sizeof(struct conet_priv)); -+ priv->unit = unit; -+ -+ dev->priv = priv; -+ dev->init = conet_init; -+ dev->uninit = conet_uninit; -+ strcpy(dev->name, "eth%d"); -+ -+ result = register_netdev(dev); -+ if (result) { -+ printk("conet: error %d registering device \"%s\"\n", result, dev->name); -+ kfree(dev->priv); -+ kfree(dev); -+ return ERR_PTR(-ENODEV); -+ } -+ -+ printk("conet%d: initialized\n", priv->unit); -+ -+ return dev; -+} -+ -+static void conet_destroy(struct net_device *dev) -+{ -+ struct conet_priv *priv = (struct conet_priv *) dev->priv; -+ -+ printk("conet%d: freed\n", priv->unit); -+ -+ unregister_netdev(dev); -+ kfree(dev->priv); -+ kfree(dev); -+} -+ -+static int __init conet_init_module(void) -+{ -+ int unit = 0, result; -+ struct net_device *dev; -+ char mac_address[6]; -+ -+ result = request_irq(NETWORK_IRQ, &conet_interrupt, 0, "conet", NULL); -+ -+ printk("conet: loaded (max %d devices)\n", CO_MODULE_MAX_CONET); -+ -+ for (unit=0; unit < CO_MODULE_MAX_CONET; unit++) { -+ conet_dev[unit] = NULL; -+ -+ result = conet_get_mac(unit, mac_address); -+ if (!result) -+ continue; -+ -+ dev = conet_create(unit); -+ if (!IS_ERR(dev)) -+ conet_dev[unit] = dev; -+ } -+ -+ return result; -+} -+ -+static void __exit conet_cleanup_module(void) -+{ -+ int unit = 0; -+ -+ free_irq(NETWORK_IRQ, NULL); -+ -+ for (unit=0; unit < CO_MODULE_MAX_CONET; unit++) { -+ if (!conet_dev[unit]) -+ continue; -+ -+ conet_destroy(conet_dev[unit]); -+ } -+} -+ -+module_init(conet_init_module); -+module_exit(conet_cleanup_module); ---- linux-2.4.28/drivers/video/Makefile~colinux-0.6.1 2004-02-18 08:36:31.000000000 -0500 -+++ linux-2.4.28/drivers/video/Makefile 2004-11-27 15:59:21.307006864 -0500 -@@ -15,7 +15,8 @@ - fbcon-iplan2p8.o fbcon-vga-planes.o fbcon-cfb16.o \ - fbcon-cfb2.o fbcon-cfb24.o fbcon-cfb32.o fbcon-cfb4.o \ - fbcon-cfb8.o fbcon-mac.o fbcon-mfb.o \ -- cyber2000fb.o sa1100fb.o fbcon-hga.o fbgen.o -+ cyber2000fb.o sa1100fb.o fbcon-hga.o fbgen.o cocon.o \ -+ - - # Each configuration option enables a list of files. - -@@ -23,6 +24,7 @@ - obj-$(CONFIG_SGI_NEWPORT_CONSOLE) += newport_con.o - obj-$(CONFIG_PROM_CONSOLE) += promcon.o promcon_tbl.o - obj-$(CONFIG_VGA_CONSOLE) += vgacon.o -+obj-$(CONFIG_COOPERATIVE_CONSOLE) += cocon.o - obj-$(CONFIG_MDA_CONSOLE) += mdacon.o - - obj-$(CONFIG_FONT_SUN8x16) += font_sun8x16.o ---- /dev/null 2004-04-06 13:56:48.000000000 -0400 -+++ linux-2.4.28/drivers/video/cocon.c 2004-11-27 15:59:21.308006712 -0500 -@@ -0,0 +1,484 @@ -+/* -+ * linux/drivers/video/cocon.c -- Cooperative Linux console VGA driver -+ * -+ * This file is subject to the terms and conditions of the GNU General Public -+ * License. See the file COPYING in the main directory of this archive for -+ * more details. -+ * -+ * Based on code copied from vgacon.c. -+ * -+ * Dan Aloni <da-x@gmx.net>, 2003-2004 (c) -+ */ -+ -+#include <linux/config.h> -+#include <linux/module.h> -+#include <linux/types.h> -+#include <linux/sched.h> -+#include <linux/fs.h> -+#include <linux/kernel.h> -+#include <linux/tty.h> -+#include <linux/console.h> -+#include <linux/console_struct.h> -+#include <linux/string.h> -+#include <linux/kd.h> -+#include <linux/slab.h> -+#include <linux/vt_kern.h> -+#include <linux/selection.h> -+#include <linux/init.h> -+ -+#include <linux/cooperative.h> -+ -+/* -+ * Interface used by the world -+ */ -+ -+static const char *cocon_startup(void); -+static void cocon_init(struct vc_data *c, int init); -+static void cocon_deinit(struct vc_data *c); -+static void cocon_clear(struct vc_data *c, int, int, int, int); -+static void cocon_cursor(struct vc_data *c, int mode); -+static int cocon_switch(struct vc_data *c); -+static int cocon_blank(struct vc_data *c, int blank); -+static int cocon_font_op(struct vc_data *c, struct console_font_op *op); -+static int cocon_set_palette(struct vc_data *c, unsigned char *table); -+static int cocon_scrolldelta(struct vc_data *c, int lines); -+static int cocon_set_origin(struct vc_data *c); -+static void cocon_save_screen(struct vc_data *c); -+static int cocon_scroll(struct vc_data *c, int t, int b, int dir, int lines); -+static u8 cocon_build_attr(struct vc_data *c, u8 color, u8 intensity, u8 blink, u8 underline, u8 reverse); -+static void cocon_invert_region(struct vc_data *c, u16 *p, int count); -+ -+static const char __init *cocon_startup(void) -+{ -+ unsigned long flags; -+ co_console_message_t *message; -+ co_message_t *co_message; -+ -+ co_message = co_send_message_save(&flags); -+ message = (co_console_message_t *)co_message->data; -+ co_message->from = CO_MODULE_LINUX; -+ co_message->to = CO_MODULE_CONSOLE; -+ co_message->priority = CO_PRIORITY_DISCARDABLE; -+ co_message->type = CO_MESSAGE_TYPE_STRING; -+ co_message->size = ((char *)(&message->type + 1)) - ((char *)message); -+ message->type = CO_OPERATION_CONSOLE_STARTUP; -+ co_send_message_restore(flags); -+ -+ return "CoCON"; -+} -+ -+static void cocon_init(struct vc_data *c, int init) -+{ -+ unsigned long flags; -+ co_console_message_t *message; -+ co_message_t *co_message; -+ -+ /* We cannot be loaded as a module, therefore init is always 1 */ -+ c->vc_can_do_color = 1; -+ c->vc_cols = 80; -+ c->vc_rows = 25; -+ c->vc_complement_mask = 0x7700; -+ c->vc_visible_origin = 0; -+ c->vc_origin = 0; -+ -+ co_message = co_send_message_save(&flags); -+ message = (co_console_message_t *)co_message->data; -+ co_message->from = CO_MODULE_LINUX; -+ co_message->to = CO_MODULE_CONSOLE; -+ co_message->priority = CO_PRIORITY_DISCARDABLE; -+ co_message->type = CO_MESSAGE_TYPE_STRING; -+ co_message->size = ((char *)(&message->type + 1)) - ((char *)message); -+ message->type = CO_OPERATION_CONSOLE_INIT; -+ co_send_message_restore(flags); -+} -+ -+static void cocon_deinit(struct vc_data *c) -+{ -+ unsigned long flags; -+ co_console_message_t *message; -+ co_message_t *co_message; -+ -+ co_message = co_send_message_save(&flags); -+ message = (co_console_message_t *)co_message->data; -+ co_message->from = CO_MODULE_LINUX; -+ co_message->to = CO_MODULE_CONSOLE; -+ co_message->priority = CO_PRIORITY_DISCARDABLE; -+ co_message->type = CO_MESSAGE_TYPE_STRING; -+ co_message->size = ((char *)(&message->type + 1)) - ((char *)message); -+ message->type = CO_OPERATION_CONSOLE_DEINIT; -+ co_send_message_restore(flags); -+ -+} -+ -+static void cocon_clear(struct vc_data *c, int top, int left, int rows, int cols) -+{ -+ unsigned long flags; -+ co_console_message_t *message; -+ co_message_t *co_message; -+ -+ co_message = co_send_message_save(&flags); -+ message = (co_console_message_t *)co_message->data; -+ co_message->from = CO_MODULE_LINUX; -+ co_message->to = CO_MODULE_CONSOLE; -+ co_message->priority = CO_PRIORITY_DISCARDABLE; -+ co_message->type = CO_MESSAGE_TYPE_STRING; -+ co_message->size = ((char *)(&message->clear + 1)) - ((char *)message); -+ message->type = CO_OPERATION_CONSOLE_CLEAR; -+ message->clear.top = top; -+ message->clear.left = left; -+ message->clear.bottom = top + rows - 1; -+ message->clear.right = left + cols - 1; -+ message->clear.charattr = c->vc_video_erase_char; -+ co_send_message_restore(flags); -+} -+ -+static void cocon_putc(struct vc_data *c, int charattr, int y, int x) -+{ -+ unsigned long flags; -+ co_message_t *co_message; -+ co_console_message_t *message; -+ -+ co_message = co_send_message_save(&flags); -+ message = (co_console_message_t *)co_message->data; -+ co_message->from = CO_MODULE_LINUX; -+ co_message->to = CO_MODULE_CONSOLE; -+ co_message->priority = CO_PRIORITY_DISCARDABLE; -+ co_message->type = CO_MESSAGE_TYPE_STRING; -+ co_message->size = ((char *)(&message->putc + 1)) - ((char *)message); -+ message->type = CO_OPERATION_CONSOLE_PUTC; -+ message->putc.x = x; -+ message->putc.y = y; -+ message->putc.charattr = charattr; -+ co_send_message_restore(flags); -+} -+ -+ -+static void cocon_putcs(struct vc_data *conp, -+ const unsigned short *s, int count, int yy, int xx) -+{ -+ unsigned long flags; -+ co_console_message_t *message; -+ co_message_t *co_message; -+ -+ if (count > CO_MAX_PARAM_SIZE/2 - 16) -+ return; -+ -+ co_message = co_send_message_save(&flags); -+ message = (co_console_message_t *)co_message->data; -+ co_message->from = CO_MODULE_LINUX; -+ co_message->to = CO_MODULE_CONSOLE; -+ co_message->priority = CO_PRIORITY_DISCARDABLE; -+ co_message->type = CO_MESSAGE_TYPE_STRING; -+ co_message->size = ((char *)(&message->putcs + 1)) - ((char *)message) + -+ count * sizeof(unsigned short); -+ message->type = CO_OPERATION_CONSOLE_PUTCS; -+ message->putcs.x = xx; -+ message->putcs.y = yy; -+ message->putcs.count = count; -+ memcpy(&message->putcs.data, s, count * sizeof(unsigned short)); -+ co_send_message_restore(flags); -+} -+ -+static u8 cocon_build_attr(struct vc_data *c, u8 color, u8 intensity, u8 blink, u8 underline, u8 reverse) -+{ -+ u8 attr = color; -+ -+ if (underline) -+ attr = (attr & 0xf0) | c->vc_ulcolor; -+ else if (intensity == 0) -+ attr = (attr & 0xf0) | c->vc_halfcolor; -+ if (reverse) -+ attr = ((attr) & 0x88) | ((((attr) >> 4) | ((attr) << 4)) & 0x77); -+ if (blink) -+ attr ^= 0x80; -+ if (intensity == 2) -+ attr ^= 0x08; -+ -+ return attr; -+} -+ -+static void cocon_invert_region(struct vc_data *c, u16 *p, int count) -+{ -+ unsigned long flags; -+ co_message_t *co_message; -+ co_console_message_t *message; -+ unsigned x = p - c->vc_origin ; // UPDATE: vc_origin = 0; but not yet -+ -+ co_message = co_send_message_save(&flags); -+ message = (co_console_message_t *)co_message->data; -+ co_message->from = CO_MODULE_LINUX; -+ co_message->to = CO_MODULE_CONSOLE; -+ co_message->priority = CO_PRIORITY_DISCARDABLE; -+ co_message->type = CO_MESSAGE_TYPE_STRING; -+ co_message->size = ((char *)(&message->invert + 1)) - ((char *)message); -+ message->type = CO_OPERATION_CONSOLE_INVERT_REGION; -+ message->invert.y = ((unsigned)x)/c->vc_cols; -+ message->invert.x = ((unsigned)x)-(message->invert.y); -+ message->invert.count = count; -+ co_send_message_restore(flags); -+ -+ while (count--) { -+ u16 a = scr_readw(p); -+ a = ((a) & 0x88ff) | (((a) & 0x7000) >> 4) | (((a) & 0x0700) << 4); -+ scr_writew(a, p++); -+ } -+ -+} -+ -+static void cocon_cursor(struct vc_data *c, int mode) -+{ -+ unsigned long flags; -+ co_console_message_t *message; -+ co_message_t *co_message; -+ -+ co_message = co_send_message_save(&flags); -+ message = (co_console_message_t *)co_message->data; -+ co_message->from = CO_MODULE_LINUX; -+ co_message->to = CO_MODULE_CONSOLE; -+ co_message->priority = CO_PRIORITY_DISCARDABLE; -+ co_message->type = CO_MESSAGE_TYPE_STRING; -+ co_message->size = ((char *)(&message->cursor + 1)) - ((char *)message);; -+ if (mode==CM_ERASE) { -+ message->type = CO_OPERATION_CONSOLE_CURSOR_ERASE; -+ message->cursor.height = 0; -+ co_send_message_restore(flags); -+ return; -+ } -+ -+ if(mode==CM_MOVE) { -+ message->type = CO_OPERATION_CONSOLE_CURSOR_MOVE; -+ } else /*(mode==CM_DRAW)*/ { -+ message->type = CO_OPERATION_CONSOLE_CURSOR_DRAW; -+ } -+ message->cursor.x = c->vc_x; -+ message->cursor.y = c->vc_y; -+ -+ switch (c->vc_cursor_type & CUR_HWMASK) { -+ case CUR_UNDERLINE: -+ message->cursor.height = 5; -+ break; -+ case CUR_TWO_THIRDS: -+ message->cursor.height = 66; -+ break; -+ case CUR_LOWER_THIRD: -+ message->cursor.height = 33; -+ break; -+ case CUR_LOWER_HALF: -+ message->cursor.height = 50; -+ break; -+ case CUR_NONE: -+ message->cursor.height = 0; -+ break; -+ default: -+ message->cursor.height = 5; -+ break; -+ } -+ -+ co_send_message_restore(flags); -+} -+ -+static int cocon_switch(struct vc_data *c) -+{ -+ unsigned long flags; -+ co_console_message_t *message; -+ co_message_t *co_message; -+ -+ co_message = co_send_message_save(&flags); -+ message = (co_console_message_t *)co_message->data; -+ co_message->from = CO_MODULE_LINUX; -+ co_message->to = CO_MODULE_CONSOLE; -+ co_message->priority = CO_PRIORITY_DISCARDABLE; -+ co_message->type = CO_MESSAGE_TYPE_STRING; -+ co_message->size = ((char *)(&message->type + 1)) - ((char *)message); -+ message->type = CO_OPERATION_CONSOLE_SWITCH; -+ co_send_message_restore(flags); -+ -+ return 1; /* Redrawing not needed */ -+} -+ -+static int cocon_set_palette(struct vc_data *c, unsigned char *table) -+{ -+ unsigned long flags; -+ co_console_message_t *message; -+ co_message_t *co_message; -+ -+ co_message = co_send_message_save(&flags); -+ message = (co_console_message_t *)co_message->data; -+ co_message->from = CO_MODULE_LINUX; -+ co_message->to = CO_MODULE_CONSOLE; -+ co_message->priority = CO_PRIORITY_DISCARDABLE; -+ co_message->type = CO_MESSAGE_TYPE_STRING; -+ co_message->size = ((char *)(&message->type + 1)) - ((char *)message); -+ message->type = CO_OPERATION_CONSOLE_SET_PALETTE; -+ co_send_message_restore(flags); -+ -+ return 1; -+} -+ -+static int cocon_blank(struct vc_data *c, int blank) -+{ -+ unsigned long flags; -+ co_console_message_t *message; -+ co_message_t *co_message; -+ -+ co_message = co_send_message_save(&flags); -+ message = (co_console_message_t *)co_message->data; -+ co_message->from = CO_MODULE_LINUX; -+ co_message->to = CO_MODULE_CONSOLE; -+ co_message->priority = CO_PRIORITY_DISCARDABLE; -+ co_message->type = CO_MESSAGE_TYPE_STRING; -+ co_message->size = ((char *)(&message->type + 1)) - ((char *)message); -+ message->type = CO_OPERATION_CONSOLE_BLANK; -+ co_send_message_restore(flags); -+ -+ return 1; -+} -+ -+static int cocon_font_op(struct vc_data *c, struct console_font_op *op) -+{ -+ unsigned long flags; -+ co_console_message_t *message; -+ co_message_t *co_message; -+ -+ co_message = co_send_message_save(&flags); -+ message = (co_console_message_t *)co_message->data; -+ co_message->from = CO_MODULE_LINUX; -+ co_message->to = CO_MODULE_CONSOLE; -+ co_message->priority = CO_PRIORITY_DISCARDABLE; -+ co_message->type = CO_MESSAGE_TYPE_STRING; -+ co_message->size = ((char *)(&message->type + 1)) - ((char *)message); -+ message->type = CO_OPERATION_CONSOLE_FONT_OP; -+ co_send_message_restore(flags); -+ -+ return 1; -+} -+ -+static int cocon_scrolldelta(struct vc_data *c, int lines) -+{ -+ unsigned long flags; -+ co_console_message_t *message; -+ co_message_t *co_message; -+ -+ co_message = co_send_message_save(&flags); -+ message = (co_console_message_t *)co_message->data; -+ co_message->from = CO_MODULE_LINUX; -+ co_message->to = CO_MODULE_CONSOLE; -+ co_message->priority = CO_PRIORITY_DISCARDABLE; -+ co_message->type = CO_MESSAGE_TYPE_STRING; -+ co_message->size = ((char *)(&message->type + 1)) - ((char *)message); -+ message->type = CO_OPERATION_CONSOLE_SCROLLDELTA; -+ co_send_message_restore(flags); -+ -+ return 1; -+} -+ -+static int cocon_set_origin(struct vc_data *c) -+{ -+ unsigned long flags; -+ co_console_message_t *message; -+ co_message_t *co_message; -+ -+ co_message = co_send_message_save(&flags); -+ message = (co_console_message_t *)co_message->data; -+ co_message->from = CO_MODULE_LINUX; -+ co_message->to = CO_MODULE_CONSOLE; -+ co_message->priority = CO_PRIORITY_DISCARDABLE; -+ co_message->type = CO_MESSAGE_TYPE_STRING; -+ co_message->size = ((char *)(&message->type + 1)) - ((char *)message); -+ message->type = CO_OPERATION_CONSOLE_SET_ORIGIN; -+ co_send_message_restore(flags); -+ -+ return 1; -+} -+ -+static void cocon_save_screen(struct vc_data *c) -+{ -+ unsigned long flags; -+ co_console_message_t *message; -+ co_message_t *co_message; -+ -+ co_message = co_send_message_save(&flags); -+ message = (co_console_message_t *)co_message->data; -+ co_message->from = CO_MODULE_LINUX; -+ co_message->to = CO_MODULE_CONSOLE; -+ co_message->priority = CO_PRIORITY_DISCARDABLE; -+ co_message->type = CO_MESSAGE_TYPE_STRING; -+ co_message->size = ((char *)(&message->type + 1)) - ((char *)message); -+ message->type = CO_OPERATION_CONSOLE_SAVE_SCREEN; -+ co_send_message_restore(flags); -+} -+ -+static int cocon_scroll(struct vc_data *c, int t, int b, int dir, int lines) -+{ -+ unsigned long flags; -+ co_console_message_t *message; -+ co_message_t *co_message; -+ -+ co_message = co_send_message_save(&flags); -+ message = (co_console_message_t *)co_message->data; -+ co_message->from = CO_MODULE_LINUX; -+ co_message->to = CO_MODULE_CONSOLE; -+ co_message->priority = CO_PRIORITY_DISCARDABLE; -+ co_message->type = CO_MESSAGE_TYPE_STRING; -+ co_message->size = ((char *)(&message->scroll + 1)) - ((char *)message); -+ if (dir == SM_UP) -+ message->type = CO_OPERATION_CONSOLE_SCROLL_UP; -+ else -+ message->type = CO_OPERATION_CONSOLE_SCROLL_DOWN; -+ message->scroll.top = t; -+ message->scroll.bottom = b-1; -+ message->scroll.lines = lines; -+ co_send_message_restore(flags); -+ -+ return 0; -+} -+ -+static void cocon_bmove(struct vc_data *c, int sy, int sx, int dy, int dx, int h, int w) -+{ -+ unsigned long flags; -+ co_console_message_t *message; -+ co_message_t *co_message; -+ -+ co_message = co_send_message_save(&flags); -+ message = (co_console_message_t *)co_message->data; -+ co_message->from = CO_MODULE_LINUX; -+ co_message->to = CO_MODULE_CONSOLE; -+ co_message->priority = CO_PRIORITY_DISCARDABLE; -+ co_message->type = CO_MESSAGE_TYPE_STRING; -+ co_message->size = ((char *)(&message->bmove + 1)) - ((char *)message); -+ message->type = CO_OPERATION_CONSOLE_BMOVE; -+ message->bmove.row = dy; -+ message->bmove.column = dx; -+ message->bmove.top = sy; -+ message->bmove.left = sx; -+ message->bmove.bottom = sy + h - 1; -+ message->bmove.right = sx + w - 1; -+ co_send_message_restore(flags); -+} -+ -+/* -+ * The console `switch' structure for the VGA based console -+ */ -+ -+const struct consw colinux_con = { -+ con_startup: cocon_startup, -+ con_init: cocon_init, -+ con_deinit: cocon_deinit, -+ con_clear: cocon_clear, -+ con_putc: cocon_putc, -+ con_putcs: cocon_putcs, -+ con_cursor: cocon_cursor, -+ con_scroll: cocon_scroll, -+ con_bmove: cocon_bmove, -+ con_switch: cocon_switch, -+ con_blank: cocon_blank, -+ con_font_op: cocon_font_op, -+ con_set_palette: cocon_set_palette, -+ con_scrolldelta: cocon_scrolldelta, -+ con_set_origin: cocon_set_origin, -+ con_save_screen: cocon_save_screen, -+ con_build_attr: cocon_build_attr, -+ con_invert_region: cocon_invert_region, -+}; -+ -+MODULE_LICENSE("GPL"); ---- /dev/null 2004-04-06 13:56:48.000000000 -0400 -+++ linux-2.4.28/include/asm-i386/cooperative.h 2004-11-27 15:59:21.308006712 -0500 -@@ -0,0 +1,175 @@ -+#ifndef __LINUX_ASM_COOPERATIVE_H__ -+#define __LINUX_ASM_COOPERATIVE_H__ -+ -+typedef struct { -+ unsigned short size; -+ struct x86_idt_entry *table; -+} __attribute__((packed)) x86_idt_t; -+ -+typedef struct { -+ unsigned short limit; -+ struct x86_dt_entry *base; -+} __attribute__((packed)) x86_gdt_t; -+ -+typedef struct { -+ unsigned char border2[0x4]; -+ -+ unsigned long cs; -+ #define CO_ARCH_STATE_STACK_CS "0x04" -+ -+ unsigned long ds; -+ #define CO_ARCH_STATE_STACK_DS "0x08" -+ -+ unsigned long es; -+ #define CO_ARCH_STATE_STACK_ES "0x0C" -+ -+ unsigned long cr3; -+ #define CO_ARCH_STATE_STACK_CR3 "0x10" -+ -+ unsigned long cr4; -+ #define CO_ARCH_STATE_STACK_CR4 "0x14" -+ -+ unsigned long cr2; -+ #define CO_ARCH_STATE_STACK_CR2 "0x18" -+ -+ unsigned long cr0; -+ #define CO_ARCH_STATE_STACK_CR0 "0x1C" -+ -+ x86_gdt_t gdt; -+ #define CO_ARCH_STATE_STACK_GDT "0x20" -+ -+ unsigned long fs; -+ #define CO_ARCH_STATE_STACK_FS "0x26" -+ -+ unsigned long gs; -+ #define CO_ARCH_STATE_STACK_GS "0x2A" -+ -+ unsigned short ldt; -+ #define CO_ARCH_STATE_STACK_LDT "0x2E" -+ -+ x86_idt_t idt; -+ #define CO_ARCH_STATE_STACK_IDT "0x30" -+ -+ unsigned short tr; -+ #define CO_ARCH_STATE_STACK_TR "0x36" -+ -+ unsigned long return_eip; -+ #define CO_ARCH_STATE_STACK_RETURN_EIP "0x38" -+ -+ unsigned long flags; -+ #define CO_ARCH_STATE_STACK_FLAGS "0x3C" -+ -+ unsigned long esp; -+ #define CO_ARCH_STATE_STACK_ESP "0x40" -+ -+ unsigned long ss; -+ #define CO_ARCH_STATE_STACK_SS "0x44" -+ -+ unsigned long dr0; -+ #define CO_ARCH_STATE_STACK_DR0 "0x48" -+ -+ unsigned long dr1; -+ #define CO_ARCH_STATE_STACK_DR1 "0x4C" -+ -+ unsigned long dr2; -+ #define CO_ARCH_STATE_STACK_DR2 "0x50" -+ -+ unsigned long dr3; -+ #define CO_ARCH_STATE_STACK_DR3 "0x54" -+ -+ unsigned long dr6; -+ #define CO_ARCH_STATE_STACK_DR6 "0x58" -+ -+ unsigned long dr7; -+ #define CO_ARCH_STATE_STACK_DR7 "0x5C" -+ -+ unsigned long other_map; -+ #define CO_ARCH_STATE_STACK_OTHERMAP "0x60" -+ -+ unsigned long relocate_eip; -+ #define CO_ARCH_STATE_STACK_RELOCATE_EIP "0x64" -+ #define CO_ARCH_STATE_STACK_RELOCATE_EIP_AFTER "0x68" -+ -+ unsigned long pad1; -+ unsigned long pad2; -+ -+ unsigned char fxstate[0x200]; -+ #define CO_ARCH_STATE_STACK_FXSTATE "0x70" -+} __attribute__((packed)) co_arch_state_stack_t; -+ -+extern void co_debug(const char *fmt, ...); -+ -+static inline void co_passage_page_dump_state(co_arch_state_stack_t *state) -+{ -+ co_debug("cs: %04x ds: %04x es: %04x fs: %04x gs: %04x ss: %04x\n", -+ state->cs, state->ds, state->es, state->fs, state->gs, state->ss); -+ -+ co_debug("cr0: %08x cr2: %08x cr3: %08x cr4: %08x\n", -+ state->cr0, state->cr2, state->cr3, state->cr4); -+ -+ co_debug("dr0: %08x dr1: %08x dr2: %08x dr3: %08x dr6: %08x dr7: %08x\n", -+ state->dr0, state->dr1, state->dr2, state->dr3, state->dr6, state->dr7); -+ -+ co_debug("gdt: %08x:%04x idt:%08x:%04x ldt:%04x tr:%04x\n", -+ state->gdt.base, state->gdt.limit, state->idt.table, state->idt.size, -+ state->ldt, state->tr); -+ -+ co_debug("return_eip: %08x flags: %08x esp: %8x\n", -+ state->return_eip, state->flags, state->esp); -+ -+ co_debug("other_map: %08x relocate_eip: %08x\n", -+ state->other_map, state->relocate_eip); -+} -+ -+#define CO_MAX_PARAM_SIZE 0x400 -+ -+typedef struct co_arch_passage_page { -+ union { -+ struct { -+ union { -+ struct { -+ unsigned long temp_pgd_physical; -+ unsigned long dr0; -+ unsigned long dr1; -+ unsigned long dr2; -+ unsigned long dr3; -+ unsigned long dr6; -+ unsigned long dr7; -+ unsigned char code[0x1c0]; -+ } __attribute__((packed)); -+ unsigned char pad[0x210]; -+ } __attribute__((packed)); -+ -+ /* Machine states */ -+ co_arch_state_stack_t host_state; -+ co_arch_state_stack_t linuxvm_state; -+ -+ /* Control parameters */ -+ unsigned long operation; -+ unsigned long params[]; -+ } __attribute__((packed)); -+ unsigned char first_page[0x1000]; -+ }; -+ unsigned long temp_pgd[0x400]; -+ unsigned long temp_pte[2][0x400]; -+} co_arch_passage_page_t; -+ -+static inline void co_passage_page_dump(co_arch_passage_page_t *page) -+{ -+ co_debug("Host state\n"); -+ co_passage_page_dump_state(&page->host_state); -+ -+ co_debug("Linux state\n"); -+ co_passage_page_dump_state(&page->linuxvm_state); -+} -+ -+/* -+ * Address space layout: -+ */ -+ -+#define CO_VPTR_PHYSICAL_TO_PSEUDO_PFN_MAP (0xff000000) -+#define CO_VPTR_PSEUDO_RAM_PAGE_TABLES (0xfef00000) -+#define CO_VPTR_PASSAGE_PAGE (0xfeeff000) -+#define CO_VPTR_SELF_MAP (0xfec00000) -+ -+#endif ---- linux-2.4.28/include/asm-i386/dma.h~colinux-0.6.1 2003-08-25 07:44:43.000000000 -0400 -+++ linux-2.4.28/include/asm-i386/dma.h 2004-11-27 15:59:21.309006560 -0500 -@@ -268,6 +268,8 @@ - * - * Assumes DMA flip-flop is clear. - */ -+ -+#ifndef CONFIG_COOPERATIVE - static __inline__ int get_dma_residue(unsigned int dmanr) - { - unsigned int io_port = (dmanr<=3)? ((dmanr&3)<<1) + 1 + IO_DMA1_BASE -@@ -281,7 +283,7 @@ - - return (dmanr<=3)? count : (count<<1); - } -- -+#endif - - /* These are in kernel/dma.c: */ - extern int request_dma(unsigned int dmanr, const char * device_id); /* reserve a DMA channel */ ---- linux-2.4.28/include/asm-i386/io.h~colinux-0.6.1 2003-06-13 10:51:38.000000000 -0400 -+++ linux-2.4.28/include/asm-i386/io.h 2004-11-27 15:59:21.309006560 -0500 -@@ -2,6 +2,7 @@ - #define _ASM_IO_H - - #include <linux/config.h> -+#include <linux/cooperative.h> - - /* - * This file contains the definitions for the x86 IO instructions -@@ -45,6 +46,7 @@ - #ifdef __KERNEL__ - - #include <linux/vmalloc.h> -+#include <linux/cooperative.h> - - /* - * Temporary debugging check to catch old code using -@@ -121,6 +123,9 @@ - - static inline void * ioremap (unsigned long offset, unsigned long size) - { -+#ifdef CONFIG_COOPERATIVE -+ panic("ioremap %ld:%ld\n", offset, size); -+#endif - return __ioremap(offset, size, 0); - } - -@@ -146,6 +151,9 @@ - - static inline void * ioremap_nocache (unsigned long offset, unsigned long size) - { -+#ifdef CONFIG_COOPERATIVE -+ panic("ioremap_nocache %ld:%ld\n", offset, size); -+#endif - return __ioremap(offset, size, _PAGE_PCD); - } - -@@ -308,6 +316,8 @@ - - #endif /* __KERNEL__ */ - -+#ifndef CONFIG_COOPERATIVE_NOT -+ - #ifdef SLOW_IO_BY_JUMPING - #define __SLOW_DOWN_IO "\njmp 1f\n1:\tjmp 1f\n1:" - #else -@@ -427,4 +437,21 @@ - __OUTS(w) - __OUTS(l) - -+#else -+ -+static inline unsigned long badio(const char *file, int line) -+{ -+#ifdef CONFIG_COOPERATIVE -+ panic("badio %s:%d\n", file, line); -+#endif -+ return 0; -+} -+ -+#define outb(port, data) badio(__FILE__, __LINE__) -+#define inb(port) badio(__FILE__, __LINE__) -+#define outb_p(port, data) badio(__FILE__, __LINE__) -+#define inb_p(port) badio(__FILE__, __LINE__) -+ -+#endif -+ - #endif ---- linux-2.4.28/include/asm-i386/irq.h~colinux-0.6.1 2002-08-02 20:39:45.000000000 -0400 -+++ linux-2.4.28/include/asm-i386/irq.h 2004-11-27 15:59:21.310006408 -0500 -@@ -14,6 +14,10 @@ - - #define TIMER_IRQ 0 - -+#ifdef CONFIG_COOPERATIVE -+#define NETWORK_IRQ 2 -+#endif -+ - /* - * 16 8259A IRQ's, 208 potential APIC interrupt sources. - * Right now the APIC is mostly only used for SMP. -@@ -23,7 +27,7 @@ - * Since vectors 0x00-0x1f are used/reserved for the CPU, - * the usable vector space is 0x20-0xff (224 vectors) - */ --#ifdef CONFIG_X86_IO_APIC -+#if defined(CONFIG_X86_IO_APIC) || defined(CONFIG_X86_COPIC) - #define NR_IRQS 224 - #else - #define NR_IRQS 16 ---- linux-2.4.28/include/asm-i386/mc146818rtc.h~colinux-0.6.1 2001-11-22 14:46:58.000000000 -0500 -+++ linux-2.4.28/include/asm-i386/mc146818rtc.h 2004-11-27 15:59:21.310006408 -0500 -@@ -4,6 +4,7 @@ - #ifndef _ASM_MC146818RTC_H - #define _ASM_MC146818RTC_H - -+#include <linux/config.h> - #include <asm/io.h> - - #ifndef RTC_PORT -@@ -11,6 +12,7 @@ - #define RTC_ALWAYS_BCD 1 /* RTC operates in binary mode */ - #endif - -+#ifndef CONFIG_COOPERATIVE - /* - * The yet supported machines all access the RTC index register via - * an ISA port access but the way to access the date register differs ... -@@ -24,6 +26,11 @@ - outb_p((val),RTC_PORT(1)); \ - }) - -+#else -+#define CMOS_READ(addr) (0) -+#define CMOS_WRITE(val, addr) (0) -+#endif -+ - #define RTC_IRQ 8 - - #endif /* _ASM_MC146818RTC_H */ ---- linux-2.4.28/include/asm-i386/page.h~colinux-0.6.1 2002-08-02 20:39:45.000000000 -0400 -+++ linux-2.4.28/include/asm-i386/page.h 2004-11-27 15:59:21.310006408 -0500 -@@ -1,6 +1,10 @@ - #ifndef _I386_PAGE_H - #define _I386_PAGE_H - -+#ifdef CONFIG_COOPERATIVE -+#define WANT_PAGE_VIRTUAL -+#endif -+ - /* PAGE_SHIFT determines the page size */ - #define PAGE_SHIFT 12 - #define PAGE_SIZE (1UL << PAGE_SHIFT) -@@ -10,6 +14,7 @@ - #ifndef __ASSEMBLY__ - - #include <linux/config.h> -+#include <asm/cooperative.h> - - #ifdef CONFIG_X86_USE_3DNOW - -@@ -80,6 +85,22 @@ - - #define __PAGE_OFFSET (0xC0000000) - -+#ifdef CONFIG_COOPERATIVE -+ -+#define CO_PPTM_OFFSET (CO_VPTR_PSEUDO_RAM_PAGE_TABLES) -+#define CO_RPPTM_OFFSET (CO_VPTR_PHYSICAL_TO_PSEUDO_PFN_MAP) -+ -+#define CO_PFN(vaddr) ((((unsigned long)vaddr) - __PAGE_OFFSET) >> PAGE_SHIFT) -+#define CO_PA(pfn) (((unsigned long *)CO_PPTM_OFFSET)[pfn]) -+#define CO_PFN_PA(vaddr) CO_PA(CO_PFN(vaddr)) -+#define CO_PPTM_SIZE (max_low_pfn * sizeof(pte_t)) -+ -+#define CO_VA_PFN(pa) (((unsigned long *)CO_RPPTM_OFFSET)[((pa) >> PAGE_SHIFT)]) -+#define CO_VA_PAGE(pa) (mem_map + CO_VA_PFN(pa)) -+#define CO_VA(pa) ((CO_VA_PFN(pa) << PAGE_SHIFT) + __PAGE_OFFSET) -+ -+#endif -+ - /* - * This much address space is reserved for vmalloc() and iomap() - * as well as fixmap mappings. -@@ -96,11 +117,16 @@ - */ - - #if 1 /* Set to zero for a slightly smaller kernel */ -+#ifdef CONFIG_COOPERATIVE -+#define BUG() do { panic("BUG %s:%d\n", __FILE__, __LINE__); } while(0) -+#else - #define BUG() \ - __asm__ __volatile__( "ud2\n" \ - "\t.word %c0\n" \ - "\t.long %c1\n" \ - : : "i" (__LINE__), "i" (__FILE__)) -+ -+#endif - #else - #define BUG() __asm__ __volatile__("ud2\n") - #endif -@@ -129,9 +155,11 @@ - #define VMALLOC_RESERVE ((unsigned long)__VMALLOC_RESERVE) - #define __MAXMEM (-__PAGE_OFFSET-__VMALLOC_RESERVE) - #define MAXMEM ((unsigned long)(-PAGE_OFFSET-VMALLOC_RESERVE)) --#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) - #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) -+#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) -+ - #define virt_to_page(kaddr) (mem_map + (__pa(kaddr) >> PAGE_SHIFT)) -+ - #define VALID_PAGE(page) ((page - mem_map) < max_mapnr) - - #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ ---- linux-2.4.28/include/asm-i386/pgalloc.h~colinux-0.6.1 2003-08-25 07:44:43.000000000 -0400 -+++ linux-2.4.28/include/asm-i386/pgalloc.h 2004-11-27 15:59:21.313005952 -0500 -@@ -11,8 +11,13 @@ - #define pte_quicklist (current_cpu_data.pte_quick) - #define pgtable_cache_size (current_cpu_data.pgtable_cache_sz) - -+#ifndef CONFIG_COOPERATIVE - #define pmd_populate(mm, pmd, pte) \ -- set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(pte))) -+ set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(pte))) -+#else -+#define pmd_populate(mm, pmd, pte) \ -+ set_pmd(pmd, __pmd(_PAGE_TABLE + (CO_PFN_PA(pte) & PAGE_MASK))) -+#endif - - /* - * Allocate and free page tables. ---- linux-2.4.28/include/asm-i386/pgtable-2level.h~colinux-0.6.1 2002-11-28 18:53:15.000000000 -0500 -+++ linux-2.4.28/include/asm-i386/pgtable-2level.h 2004-11-27 15:59:21.313005952 -0500 -@@ -58,8 +58,14 @@ - } - #define ptep_get_and_clear(xp) __pte(xchg(&(xp)->pte_low, 0)) - #define pte_same(a, b) ((a).pte_low == (b).pte_low) --#define pte_page(x) (mem_map+((unsigned long)(((x).pte_low >> PAGE_SHIFT)))) - #define pte_none(x) (!(x).pte_low) -+ -+#ifndef CONFIG_COOPERATIVE -+#define pte_page(x) (mem_map+((unsigned long)(((x).pte_low >> PAGE_SHIFT)))) - #define __mk_pte(page_nr,pgprot) __pte(((page_nr) << PAGE_SHIFT) | pgprot_val(pgprot)) -+#else -+#define pte_page(x) CO_VA_PAGE((x).pte_low) -+#define __mk_pte(page_nr,pgprot) __pte((CO_PA(page_nr) & PAGE_MASK) | pgprot_val(pgprot)) -+#endif - - #endif /* _I386_PGTABLE_2LEVEL_H */ ---- linux-2.4.28/include/asm-i386/pgtable.h~colinux-0.6.1 2002-11-28 18:53:15.000000000 -0500 -+++ linux-2.4.28/include/asm-i386/pgtable.h 2004-11-27 15:59:21.313005952 -0500 -@@ -320,8 +320,13 @@ - - #define page_pte(page) page_pte_prot(page, __pgprot(0)) - -+#ifndef CONFIG_COOPERATIVE - #define pmd_page(pmd) \ --((unsigned long) __va(pmd_val(pmd) & PAGE_MASK)) -+ ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK)) -+#else -+#define pmd_page(pmd) \ -+ (CO_VA(pmd_val(pmd))) -+#endif - - /* to find an entry in a page-table-directory. */ - #define pgd_index(address) ((address >> PGDIR_SHIFT) & (PTRS_PER_PGD-1)) ---- linux-2.4.28/include/asm-i386/processor.h~colinux-0.6.1 2004-02-18 08:36:32.000000000 -0500 -+++ linux-2.4.28/include/asm-i386/processor.h 2004-11-27 15:59:21.314005800 -0500 -@@ -181,8 +181,18 @@ - #define X86_CR4_OSFXSR 0x0200 /* enable fast FPU save and restore */ - #define X86_CR4_OSXMMEXCPT 0x0400 /* enable unmasked SSE exceptions */ - -+#ifndef CONFIG_COOPERATIVE - #define load_cr3(pgdir) \ -- asm volatile("movl %0,%%cr3": :"r" (__pa(pgdir))); -+asm volatile("movl %0,%%cr3": :"r" (__pa(pgdir))); -+#else -+/* -+ * In coLinux Mode we can't load CR3 with the pseudo physical -+ * address. Instead, we need to translate the pseudo physical address -+ * to the real physical address. -+ */ -+#define load_cr3(pgdir) \ -+asm volatile("movl %0,%%cr3": :"r" (CO_PFN_PA(pgdir))); -+#endif - - /* - * Save the cr4 feature set we're using (ie ---- linux-2.4.28/include/asm-i386/system.h~colinux-0.6.1 2004-04-14 09:05:40.000000000 -0400 -+++ linux-2.4.28/include/asm-i386/system.h 2004-11-27 15:59:21.314005800 -0500 -@@ -12,7 +12,15 @@ - struct task_struct; /* one of the stranger aspects of C forward declarations.. */ - extern void FASTCALL(__switch_to(struct task_struct *prev, struct task_struct *next)); - -+#ifdef CONFIG_COOPERATIVE -+#define prepare_to_switch() { \ -+ asm volatile("movl %%fs,%0":"=m" (*(int *)&prev->thread.fs)); \ -+ asm volatile("movl %%gs,%0":"=m" (*(int *)&prev->thread.gs)); \ -+} -+#else - #define prepare_to_switch() do { } while(0) -+#endif -+ - #define switch_to(prev,next,last) do { \ - asm volatile("pushl %%esi\n\t" \ - "pushl %%edi\n\t" \ ---- linux-2.4.28/include/linux/console.h~colinux-0.6.1 2004-02-18 08:36:32.000000000 -0500 -+++ linux-2.4.28/include/linux/console.h 2004-11-27 15:59:21.315005648 -0500 -@@ -55,6 +55,7 @@ - extern const struct consw dummy_con; /* dummy console buffer */ - extern const struct consw fb_con; /* frame buffer based console */ - extern const struct consw vga_con; /* VGA text console */ -+extern const struct consw colinux_con; /* coLinux Mode text console */ - extern const struct consw newport_con; /* SGI Newport console */ - extern const struct consw prom_con; /* SPARC PROM console */ - ---- /dev/null 2004-04-06 13:56:48.000000000 -0400 -+++ linux-2.4.28/include/linux/cooperative.h 2004-11-27 15:59:21.315005648 -0500 -@@ -0,0 +1,323 @@ -+#ifndef __LINUX_COOPERATIVE_H__ -+#define __LINUX_COOPERATIVE_H__ -+ -+#ifdef __KERNEL__ -+#ifndef CO_KERNEL -+#define CO_COLINUX_KERNEL -+#define CO_KERNEL -+#endif -+#endif -+ -+extern void co_debug(const char *fmt, ...); -+ -+#include <asm/cooperative.h> -+ -+#define CO_LINUX_ABI_VERSION 1 -+ -+#pragma pack(0) -+ -+#define CO_BOOTPARAM_STRING_LENGTH 0x100 -+ -+extern char co_boot_parameters[CO_BOOTPARAM_STRING_LENGTH]; -+ -+typedef enum { -+ CO_OPERATION_EMPTY=0, -+ CO_OPERATION_START, -+ CO_OPERATION_IDLE, -+ CO_OPERATION_TERMINATE, -+ CO_OPERATION_MESSAGE_TO_MONITOR, -+ CO_OPERATION_MESSAGE_FROM_MONITOR, -+ CO_OPERATION_FORWARD_INTERRUPT, -+ CO_OPERATION_DEVICE, -+ CO_OPERATION_GET_TIME, -+ CO_OPERATION_DEBUG_LINE, -+ CO_OPERATION_GET_HIGH_PREC_QUOTIENT, -+ CO_OPERATION_TRACE_POINT, -+} co_operation_t; -+ -+#define CO_MODULE_MAX_CONET 16 -+#define CO_MODULE_MAX_COBD 32 -+ -+typedef enum { -+ CO_MODULE_LINUX, -+ CO_MODULE_MONITOR, -+ CO_MODULE_DAEMON, -+ CO_MODULE_IDLE, -+ CO_MODULE_KERNEL_SWITCH, -+ CO_MODULE_USER_SWITCH, -+ CO_MODULE_CONSOLE, -+ CO_MODULE_PRINTK, -+ -+ CO_MODULE_CONET0, -+ CO_MODULE_CONET_END=CO_MODULE_CONET0+CO_MODULE_MAX_CONET-1, -+ -+ CO_MODULE_COBD0, -+ CO_MODULE_COBD_END=CO_MODULE_COBD0+CO_MODULE_MAX_COBD-1, -+} co_module_t; -+ -+typedef enum { -+ CO_PRIORITY_DISCARDABLE=0, -+ CO_PRIORITY_IMPORTANT, -+} co_priority_t; -+ -+typedef enum { -+ CO_MESSAGE_TYPE_STRING=0, -+ CO_MESSAGE_TYPE_OTHER=1, -+} co_message_type_t; -+ -+typedef struct { -+ co_module_t from; -+ co_module_t to; -+ co_priority_t priority; -+ co_message_type_t type; -+ unsigned long size; -+ char data[0]; -+} __attribute__((packed)) co_message_t; -+ -+typedef enum { -+ CO_DEVICE_BLOCK=0, -+ CO_DEVICE_CONSOLE, -+ CO_DEVICE_KEYBOARD, -+ CO_DEVICE_NETWORK, -+ CO_DEVICE_TIMER, -+ CO_DEVICE_POWER, -+ -+ CO_DEVICES_TOTAL, -+} co_device_t; -+ -+typedef struct { -+ unsigned char code; -+ int down; -+} co_scan_code_t; -+ -+typedef enum { -+ CO_LINUX_MESSAGE_POWER_ALT_CTRL_DEL=0, -+} co_linux_message_power_type_t; -+ -+typedef struct { -+ co_linux_message_power_type_t type; -+} __attribute__((packed)) co_linux_message_power_t; -+ -+typedef struct { -+ unsigned long tick_count; -+} __attribute__((packed)) co_linux_message_idle_t; -+ -+typedef struct { -+ co_device_t device; -+ unsigned long unit; -+ unsigned long size; -+ char data[]; -+} __attribute__((packed)) co_linux_message_t; -+ -+typedef enum { -+ CO_TERMINATE_END=0, -+ CO_TERMINATE_REBOOT, -+ CO_TERMINATE_POWEROFF, -+ CO_TERMINATE_PANIC, -+ CO_TERMINATE_HALT, -+ CO_TERMINATE_FORCED_OFF, -+ CO_TERMINATE_FORCED_END, -+ CO_TERMINATE_INVALID_OPERATION, -+} co_termination_reason_t; -+ -+typedef void (*co_switcher_t)(co_arch_passage_page_t *page, -+ unsigned char *from, -+ unsigned char *to); -+ -+#define co_passage_page_func_low(_from_,_to_) \ -+ (((co_switcher_t)(co_passage_page->code)) \ -+ (co_passage_page, \ -+ (char *)&_from_.border2, \ -+ (char *)&_to_.border2)) -+ -+#define co_passage_page_func(_from_,_to_) \ -+ co_passage_page_func_low(co_passage_page->_from_, co_passage_page->_to_) -+ -+#ifdef CO_KERNEL -+# ifdef CO_COLINUX_KERNEL -+# define co_passage_page ((co_arch_passage_page_t *)(CO_VPTR_PASSAGE_PAGE)) -+# define co_current (co_passage_page->linuxvm_state) -+# define co_other (co_passage_page->host_state) -+# else -+# define co_passage_page (cmon->passage_page) -+# define co_other (co_passage_page->linuxvm_state) -+# define co_current (co_passage_page->host_state) -+# endif -+ -+# define co_switch() co_passage_page_func_low(co_current, co_other) -+#endif -+ -+/* -+ * Defines operations on various virtual devices. -+ */ -+ -+typedef enum { -+ CO_OPERATION_CONSOLE_STARTUP=0, -+ CO_OPERATION_CONSOLE_INIT=1, -+ CO_OPERATION_CONSOLE_DEINIT, -+ CO_OPERATION_CONSOLE_CLEAR, -+ CO_OPERATION_CONSOLE_PUTC, -+ CO_OPERATION_CONSOLE_PUTCS, -+ CO_OPERATION_CONSOLE_CURSOR_DRAW, -+ CO_OPERATION_CONSOLE_CURSOR_ERASE, -+ CO_OPERATION_CONSOLE_CURSOR_MOVE, -+ CO_OPERATION_CONSOLE_SCROLL_UP, -+ CO_OPERATION_CONSOLE_SCROLL_DOWN, -+ CO_OPERATION_CONSOLE_BMOVE, -+ CO_OPERATION_CONSOLE_SWITCH, -+ CO_OPERATION_CONSOLE_BLANK, -+ CO_OPERATION_CONSOLE_FONT_OP, -+ CO_OPERATION_CONSOLE_SET_PALETTE, -+ CO_OPERATION_CONSOLE_SCROLLDELTA, -+ CO_OPERATION_CONSOLE_SET_ORIGIN, -+ CO_OPERATION_CONSOLE_SAVE_SCREEN, -+ CO_OPERATION_CONSOLE_INVERT_REGION, -+} co_operation_console_t; -+ -+ -+typedef char co_console_code; -+typedef unsigned short co_console_character; -+typedef unsigned short co_console_unit; -+ -+typedef struct { -+ co_console_unit x; -+ co_console_unit y; -+ co_console_unit height; -+} __attribute__((packed)) co_cursor_pos_t; -+ -+typedef struct { -+ co_operation_console_t type; -+ union { -+ struct { -+ co_console_unit top; -+ co_console_unit bottom; -+ co_console_unit lines; -+ } scroll; -+ struct { -+ co_console_unit y; -+ co_console_unit x; -+ co_console_unit count; -+ co_console_character data[]; -+ } putcs; -+ struct { -+ co_console_unit x; -+ co_console_unit y; -+ co_console_character charattr; -+ } putc; -+ struct { -+ co_console_unit top; -+ co_console_unit left; -+ co_console_unit bottom; -+ co_console_unit right; -+ co_console_character charattr; -+ } clear; -+ struct { -+ co_console_unit y; -+ co_console_unit x; -+ co_console_unit count; -+ } invert; -+ struct { -+ co_console_unit row; -+ co_console_unit column; -+ co_console_unit top; -+ co_console_unit left; -+ co_console_unit bottom; -+ co_console_unit right; -+ } bmove; -+ co_cursor_pos_t cursor; -+ }; -+} __attribute__((packed)) co_console_message_t; -+ -+typedef struct { -+ unsigned long index; -+ unsigned long flags; -+ unsigned long func; -+ unsigned long pid; -+} __attribute__((packed)) co_trace_point_info_t; -+ -+extern void co_printk(char *line); -+extern void co_callback(void); -+extern void co_switch_wrapper(void); -+extern void co_idle_processor(void); -+extern void co_terminate(co_termination_reason_t reason); -+ -+extern void co_send_message(co_module_t from, -+ co_module_t to, -+ co_priority_t priority, -+ co_message_type_t type, -+ unsigned long size, -+ char *data); -+extern co_message_t *co_send_message_save(unsigned long *flags); -+extern co_message_t *co_get_message_save(unsigned long *flags); -+extern void co_send_message_restore(unsigned long flags); -+ -+extern void co_handle_device_interrupt(co_linux_message_t *message); -+extern void co_received_message(co_linux_message_t *message); -+extern int co_get_message(co_linux_message_t **message, co_device_t device); -+extern void co_free_message(co_linux_message_t *message); -+ -+extern unsigned long co_bootmem_pages; -+extern unsigned long co_core_end; -+extern unsigned long co_memory_size; -+extern unsigned long co_rpptm_size; -+ -+extern unsigned long co_get_host_time(void); -+extern void handle_keyboard_event(unsigned char scancode); -+ -+typedef enum { -+ CO_BLOCK_OPEN=0, -+ CO_BLOCK_STAT, -+ CO_BLOCK_READ, -+ CO_BLOCK_WRITE, -+ CO_BLOCK_CLOSE, -+ CO_BLOCK_GET_ALIAS, -+} co_block_request_type_t; -+ -+typedef enum { -+ CO_NETWORK_GET_MAC=0, -+} co_network_request_type_t; -+ -+#ifdef CO_KERNEL -+/* If we are compiling kernel code (Linux or Host Driver) */ -+# ifdef CO_COLINUX_KERNEL -+/* Inside Linux, vm_ptr_t considered a valid pointer in its virtual address space */ -+typedef void *vm_ptr_t; -+# else -+/* But inside the host, the type is considered not to be a pointer in its own address space */ -+typedef unsigned long vm_ptr_t; -+# endif -+ -+typedef struct { -+ co_block_request_type_t type; -+ long rc; -+ union { -+ struct { -+ unsigned long long offset; -+ unsigned long long size; -+ unsigned long long disk_size; -+ vm_ptr_t address; -+ }; -+ struct { -+ char alias[20]; -+ }; -+ }; -+} __attribute__((packed)) co_block_request_t; -+ -+typedef struct { -+ co_network_request_type_t type; -+ unsigned long unit; -+ char mac_address[6]; -+ char _pad[2]; -+ int result; -+} __attribute__((packed)) co_network_request_t; -+ -+#endif -+ -+#ifndef COLINUX_TRACE -+#define CO_TRACE_STOP -+#define CO_TRACE_CONTINUE -+#endif -+ -+#pragma pack() -+ -+#endif ---- linux-2.4.28/include/linux/major.h~colinux-0.6.1 2003-06-13 10:51:38.000000000 -0400 -+++ linux-2.4.28/include/linux/major.h 2004-11-27 15:59:21.315005648 -0500 -@@ -142,6 +142,7 @@ - #define LVM_CHAR_MAJOR 109 /* Logical Volume Manager */ - - #define UMEM_MAJOR 116 /* http://www.umem.com/ Battery Backed RAM */ -+#define COLINUX_MAJOR 117 - - #define RTF_MAJOR 150 - #define RAW_MAJOR 162 ---- linux-2.4.28/init/do_mounts.c~colinux-0.6.1 2003-11-28 13:26:21.000000000 -0500 -+++ linux-2.4.28/init/do_mounts.c 2004-11-27 15:59:21.316005496 -0500 -@@ -255,6 +255,9 @@ - { "ftld", 0x2c18 }, - { "mtdblock", 0x1f00 }, - { "nb", 0x2b00 }, -+#ifdef CONFIG_COOPERATIVE -+ { "cobd", 0x7500 }, -+#endif - { NULL, 0 } - }; - ---- linux-2.4.28/init/main.c~colinux-0.6.1 2004-11-17 06:54:22.000000000 -0500 -+++ linux-2.4.28/init/main.c 2004-11-27 15:59:21.317005344 -0500 -@@ -74,6 +74,8 @@ - #include <asm/smp.h> - #endif - -+#include <linux/cooperative.h> -+ - /* - * Versions of gcc older than that listed below may actually compile - * and link okay, but the end product can have subtle run time bugs. -@@ -305,7 +307,14 @@ - #ifdef CONFIG_X86_LOCAL_APIC - static void __init smp_init(void) - { -+#ifdef CONFIG_COOPERATIVE -+ /* -+ * It doesn't work yet because I haven't implemented the -+ * timer interrupt yet -+ */ -+#else - APIC_init_uniprocessor(); -+#endif - } - #else - #define smp_init() do { } while (0) ---- linux-2.4.28/kernel/Makefile~colinux-0.6.1 2001-09-17 00:22:40.000000000 -0400 -+++ linux-2.4.28/kernel/Makefile 2004-11-27 15:59:21.317005344 -0500 -@@ -14,7 +14,7 @@ - obj-y = sched.o dma.o fork.o exec_domain.o panic.o printk.o \ - module.o exit.o itimer.o info.o time.o softirq.o resource.o \ - sysctl.o acct.o capability.o ptrace.o timer.o user.o \ -- signal.o sys.o kmod.o context.o -+ signal.o sys.o kmod.o context.o cooperative.o - - obj-$(CONFIG_UID16) += uid16.o - obj-$(CONFIG_MODULES) += ksyms.o ---- /dev/null 2004-04-06 13:56:48.000000000 -0400 -+++ linux-2.4.28/kernel/cooperative.c 2004-11-27 15:59:21.318005192 -0500 -@@ -0,0 +1,337 @@ -+/* -+ * linux/kernel/cooperative.c -+ * -+ * Code for Cooperative mode (coLinux) -+ * -+ * Dan Aloni <da-x@gmx.net>, 2003 (C). -+ * -+ */ -+ -+#include <linux/kernel.h> -+#include <linux/string.h> -+#include <linux/interrupt.h> -+#include <linux/mm.h> -+#include <linux/slab.h> -+#include <linux/cooperative.h> -+ -+CO_TRACE_STOP; -+ -+void start_kernel(void); -+extern char _kernel_start, _end; -+ -+unsigned long co_core_end = 0; -+unsigned long co_memory_size = 0; -+char co_boot_parameters[CO_BOOTPARAM_STRING_LENGTH]; -+ -+void colinux_start_c() -+{ -+ co_core_end = co_passage_page->params[0]; -+ co_memory_size = co_passage_page->params[1]; -+ memcpy(co_boot_parameters, &co_passage_page->params[2], -+ sizeof(co_boot_parameters)); -+ -+ start_kernel(); -+ -+ co_terminate(CO_TERMINATE_END); -+} -+ -+co_message_t *co_send_message_save(unsigned long *flags) -+{ -+ local_irq_save(*flags); -+ co_passage_page->operation = CO_OPERATION_MESSAGE_TO_MONITOR; -+ co_passage_page->params[0] = 1; -+ return (co_message_t *)(&co_passage_page->params[1]); -+} -+ -+void co_send_message_restore(unsigned long flags) -+{ -+ co_switch_wrapper(); -+ local_irq_restore(flags); -+} -+ -+void co_send_message_s(co_message_t *message, char *data) -+{ -+ if ((sizeof(co_message_t) + message->size) < 2000) { -+ co_message_t *params; -+ unsigned long flags; -+ -+ local_irq_save(flags); -+ co_passage_page->operation = CO_OPERATION_MESSAGE_TO_MONITOR; -+ co_passage_page->params[0] = 1; -+ params = (co_message_t *)(&co_passage_page->params[1]); -+ *params = *message; -+ memcpy(params->data, data, message->size); -+ co_switch_wrapper(); -+ local_irq_restore(flags); -+ return; -+ } -+} -+ -+void co_send_message(co_module_t from, -+ co_module_t to, -+ co_priority_t priority, -+ co_message_type_t type, -+ unsigned long size, -+ char *data) -+{ -+ co_message_t params; -+ -+ params.from = from; -+ params.to = to; -+ params.priority = priority; -+ params.type = type; -+ params.size = size; -+ -+ co_send_message_s(¶ms, data); -+} -+ -+void co_receive_message(co_message_t *message) -+{ -+ struct { -+ co_message_t message; -+ co_linux_message_t linux_part; -+ } *linux_message; -+ -+ linux_message = (typeof(linux_message))message; -+ -+ co_handle_device_interrupt(&linux_message->linux_part); -+} -+ -+void co_callback(void) -+{ -+ while (co_passage_page->operation == CO_OPERATION_MESSAGE_FROM_MONITOR) { -+ co_receive_message((co_message_t *)&co_passage_page->params[1]); -+ if (co_passage_page->params[0] == 0) { -+ break; -+ } -+ -+ co_passage_page->operation = CO_OPERATION_MESSAGE_FROM_MONITOR; -+ co_switch_wrapper(); -+ } -+} -+ -+void co_idle_processor(void) -+{ -+ unsigned long flags; -+ -+ local_irq_save(flags); -+ co_passage_page->operation = CO_OPERATION_IDLE; -+ co_switch_wrapper(); -+ co_callback(); -+ local_irq_restore(flags); -+} -+ -+void co_printk(char *line) -+{ -+ co_send_message(CO_MODULE_LINUX, -+ CO_MODULE_PRINTK, -+ CO_PRIORITY_DISCARDABLE, -+ CO_MESSAGE_TYPE_STRING, -+ strlen(line)+1, -+ line); -+} -+ -+void co_debug_line(char *line) -+{ -+ unsigned long flags; -+ -+ if (!line) -+ return; -+ -+ if (strlen(line) > 0x200) -+ return; -+ -+ local_irq_save(flags); -+ co_passage_page->operation = CO_OPERATION_DEBUG_LINE; -+ strcpy((char *)&co_passage_page->params[0], line); -+ co_switch_wrapper(); -+ local_irq_restore(flags); -+} -+ -+void co_trace_ent_name(void *func, const char *name) -+{ -+ static int reenterent = 0; -+ static int count = 0; -+ static char private_buffer[0x100]; -+ unsigned long flags; -+ -+ if (reenterent) -+ return; -+ -+ reenterent = 1; -+ -+ local_irq_save(flags); -+ count += 1; -+ -+ if (count > 1900000) { -+ snprintf(private_buffer, sizeof(private_buffer), "%d: %d: %x %s\n", count, current->pid, func, name); -+ co_debug_line(private_buffer); -+ } -+ -+ local_irq_restore(flags); -+ -+ reenterent = 0; -+} -+ -+static unsigned long trace_index = 0; -+ -+void co_trace_ent(void *func) -+{ -+ unsigned long flags; -+ co_trace_point_info_t *trace_point; -+ -+ local_irq_save(flags); -+ trace_index++; -+ co_passage_page->operation = CO_OPERATION_TRACE_POINT; -+ trace_point = (co_trace_point_info_t *)&co_passage_page->params[0]; -+ trace_point->pid = 0; -+ if (current) -+ trace_point->pid = current->pid; -+ trace_point->index = trace_index; -+ trace_point->flags = 1; -+ trace_point->func = (unsigned long)(func); -+ co_switch_wrapper(); -+ local_irq_restore(flags); -+} -+ -+void co_trace_ret(void *func) -+{ -+ unsigned long flags; -+ co_trace_point_info_t *trace_point; -+ -+ local_irq_save(flags); -+ trace_index++; -+ co_passage_page->operation = CO_OPERATION_TRACE_POINT; -+ trace_point = (co_trace_point_info_t *)&co_passage_page->params[0]; -+ trace_point->pid = 0; -+ if (current) -+ trace_point->pid = current->pid; -+ trace_point->index = trace_index; -+ trace_point->flags = 0; -+ trace_point->func = (unsigned long)(func); -+ co_switch_wrapper(); -+ local_irq_restore(flags); -+} -+ -+void co_debug(const char *fmt, ...) -+{ -+ static char co_buf[1024]; -+ unsigned long flags; -+ va_list args; -+ -+ local_irq_save(flags); -+ va_start(args, fmt); -+ vsnprintf(co_buf, sizeof(co_buf), fmt, args); -+ va_end(args); -+ co_debug_line(co_buf); -+ local_irq_restore(flags); -+} -+ -+void co_terminate(co_termination_reason_t reason) -+{ -+ unsigned long flags; -+ -+ local_irq_save(flags); -+ co_passage_page->operation = CO_OPERATION_TERMINATE; -+ co_passage_page->params[0] = reason; -+ co_switch_wrapper(); -+ local_irq_restore(flags); -+} -+ -+unsigned long co_get_host_time(void) -+{ -+ unsigned long flags; -+ unsigned long time; -+ -+ local_irq_save(flags); -+ co_passage_page->operation = CO_OPERATION_GET_TIME; -+ co_switch_wrapper(); -+ time = co_passage_page->params[0]; -+ local_irq_restore(flags); -+ -+ return time; -+} -+ -+typedef struct { -+ struct list_head node; -+ co_linux_message_t msg; -+} co_linux_message_node_t; -+ -+typedef struct { -+ struct list_head list; -+ int num_messages; -+} co_linux_message_queue_t; -+ -+co_linux_message_queue_t *co_msgqueues = NULL; -+ -+void co_received_message(co_linux_message_t *message) -+{ -+ co_linux_message_node_t *copy; -+ co_linux_message_queue_t *queue; -+ -+ if (!co_msgqueues) -+ return; -+ -+ if (message->device < 0 || (message->device >= CO_DEVICES_TOTAL)) -+ return; -+ -+ copy = (co_linux_message_node_t *)kmalloc(sizeof(co_linux_message_node_t) + message->size, GFP_ATOMIC); -+ if (!copy) -+ return; -+ -+ queue = &co_msgqueues[message->device]; -+ memcpy(©->msg, message, sizeof(co_linux_message_t) + message->size); -+ list_add(©->node, &queue->list); -+ queue->num_messages++; -+} -+ -+static int __init initcall_message_queues(void) -+{ -+ int queue_index; -+ -+ co_msgqueues = kmalloc(sizeof(co_linux_message_queue_t) * CO_DEVICES_TOTAL, GFP_KERNEL); -+ if (!co_msgqueues) { -+ panic("Unable to allocate message queues\n"); -+ } -+ -+ for (queue_index=0; queue_index < CO_DEVICES_TOTAL; queue_index++) { -+ co_linux_message_queue_t *queue = &co_msgqueues[queue_index]; -+ queue->num_messages = 0; -+ INIT_LIST_HEAD(&queue->list); -+ } -+ -+ return 0; -+} -+ -+__initcall(initcall_message_queues); -+ -+int co_get_message(co_linux_message_t **message, co_device_t device) -+{ -+ co_linux_message_queue_t *queue; -+ co_linux_message_node_t *node; -+ -+ if (!co_msgqueues) -+ return 0; -+ -+ queue = &co_msgqueues[device]; -+ if (list_empty(&queue->list)) -+ return 0; -+ -+ node = list_entry(queue->list.prev, co_linux_message_node_t, node); -+ list_del(&node->node); -+ queue->num_messages--; -+ *message = &node->msg; -+ return 1; -+} -+ -+void co_free_message(co_linux_message_t *message) -+{ -+ co_linux_message_node_t *node = NULL; -+ -+ node = (co_linux_message_node_t *)(((char *)message) - ((long)&node->msg)); -+ -+ kfree(node); -+} -+ -+ -+CO_TRACE_CONTINUE; ---- linux-2.4.28/kernel/panic.c~colinux-0.6.1 2004-11-17 06:54:22.000000000 -0500 -+++ linux-2.4.28/kernel/panic.c 2004-11-27 15:59:21.318005192 -0500 -@@ -18,6 +18,8 @@ - #include <linux/interrupt.h> - #include <linux/console.h> - -+#include <linux/cooperative.h> -+ - asmlinkage void sys_sync(void); /* it's really int */ - - int panic_timeout; -@@ -70,6 +72,8 @@ - sys_sync(); - bust_spinlocks(0); - -+ co_terminate(CO_TERMINATE_PANIC); -+ - #ifdef CONFIG_SMP - smp_send_stop(); - #endif ---- linux-2.4.28/kernel/printk.c~colinux-0.6.1 2004-11-17 06:54:22.000000000 -0500 -+++ linux-2.4.28/kernel/printk.c 2004-11-27 15:59:21.319005040 -0500 -@@ -29,6 +29,8 @@ - - #include <asm/uaccess.h> - -+#include <linux/cooperative.h> -+ - #if !defined(CONFIG_LOG_BUF_SHIFT) || (CONFIG_LOG_BUF_SHIFT == 0) - #if defined(CONFIG_MULTIQUAD) || defined(CONFIG_IA64) - #define LOG_BUF_LEN (65536) -@@ -433,6 +435,9 @@ - printed_len = vsnprintf(printk_buf, sizeof(printk_buf), fmt, args); - va_end(args); - -+#ifdef CONFIG_COOPERATIVE -+ co_printk(printk_buf); -+#endif - /* - * Copy the output into log_buf. If the caller didn't provide - * appropriate log level tags, we insert them here -@@ -459,6 +464,7 @@ - spin_unlock_irqrestore(&logbuf_lock, flags); - goto out; - } -+ - if (!down_trylock(&console_sem)) { - /* - * We own the drivers. We can drop the spinlock and let diff --git a/recipes/linux/linux-colinux-2.4.28/defconfig b/recipes/linux/linux-colinux-2.4.28/defconfig deleted file mode 100644 index 67262b3d29..0000000000 --- a/recipes/linux/linux-colinux-2.4.28/defconfig +++ /dev/null @@ -1,687 +0,0 @@ -# -# Automatically generated make config: don't edit -# -CONFIG_X86=y -# CONFIG_SBUS is not set -CONFIG_UID16=y - -# -# Code maturity level options -# -CONFIG_EXPERIMENTAL=y - -# -# Loadable module support -# -CONFIG_MODULES=y -CONFIG_MODVERSIONS=y -CONFIG_KMOD=y - -# -# Processor type and features -# -# CONFIG_M386 is not set -# CONFIG_M486 is not set -# CONFIG_M586 is not set -CONFIG_M586TSC=y -# CONFIG_M586MMX is not set -# CONFIG_M686 is not set -# CONFIG_MPENTIUMIII is not set -# CONFIG_MPENTIUM4 is not set -# CONFIG_MK6 is not set -# CONFIG_MK7 is not set -# CONFIG_MK8 is not set -# CONFIG_MELAN is not set -# CONFIG_MCRUSOE is not set -# CONFIG_MWINCHIPC6 is not set -# CONFIG_MWINCHIP2 is not set -# CONFIG_MWINCHIP3D is not set -# CONFIG_MCYRIXIII is not set -# CONFIG_MVIAC3_2 is not set -CONFIG_X86_WP_WORKS_OK=y -CONFIG_X86_INVLPG=y -CONFIG_X86_CMPXCHG=y -CONFIG_X86_XADD=y -CONFIG_X86_BSWAP=y -CONFIG_X86_POPAD_OK=y -# CONFIG_RWSEM_GENERIC_SPINLOCK is not set -CONFIG_RWSEM_XCHGADD_ALGORITHM=y -CONFIG_X86_L1_CACHE_SHIFT=5 -CONFIG_X86_USE_STRING_486=y -CONFIG_X86_ALIGNMENT_16=y -CONFIG_X86_HAS_TSC=y -CONFIG_X86_PPRO_FENCE=y -# CONFIG_X86_F00F_WORKS_OK is not set -# CONFIG_X86_MCE is not set -# CONFIG_TOSHIBA is not set -# CONFIG_I8K is not set -# CONFIG_MICROCODE is not set -# CONFIG_X86_MSR is not set -# CONFIG_X86_CPUID is not set -# CONFIG_EDD is not set -CONFIG_NOHIGHMEM=y -# CONFIG_HIGHMEM4G is not set -# CONFIG_HIGHMEM64G is not set -# CONFIG_HIGHMEM is not set -# CONFIG_MATH_EMULATION is not set -# CONFIG_MTRR is not set -# CONFIG_SMP is not set -CONFIG_X86_UP_COPIC=y -CONFIG_X86_COPIC=y -# CONFIG_X86_TSC_DISABLE is not set -CONFIG_X86_TSC=y - -# -# General setup -# -CONFIG_NET=y -# CONFIG_PCI is not set -# CONFIG_ISA is not set -# CONFIG_EISA is not set -# CONFIG_MCA is not set -# CONFIG_HOTPLUG is not set -# CONFIG_PCMCIA is not set -# CONFIG_HOTPLUG_PCI is not set -CONFIG_SYSVIPC=y -# CONFIG_BSD_PROCESS_ACCT is not set -CONFIG_SYSCTL=y -CONFIG_KCORE_ELF=y -# CONFIG_KCORE_AOUT is not set -CONFIG_BINFMT_AOUT=y -CONFIG_BINFMT_ELF=y -CONFIG_BINFMT_MISC=y -# CONFIG_OOM_KILLER is not set -# CONFIG_PM is not set -# CONFIG_APM is not set -CONFIG_COOPERATIVE=y - -# -# ACPI Support -# -# CONFIG_ACPI is not set - -# -# Memory Technology Devices (MTD) -# -# CONFIG_MTD is not set - -# -# Parallel port support -# -# CONFIG_PARPORT is not set - -# -# Plug and Play configuration -# -# CONFIG_PNP is not set -# CONFIG_ISAPNP is not set - -# -# Block devices -# -# CONFIG_BLK_DEV_FD is not set -# CONFIG_BLK_DEV_XD is not set -# CONFIG_PARIDE is not set -# CONFIG_BLK_CPQ_DA is not set -# CONFIG_BLK_CPQ_CISS_DA is not set -# CONFIG_CISS_SCSI_TAPE is not set -# CONFIG_CISS_MONITOR_THREAD is not set -# CONFIG_BLK_DEV_DAC960 is not set -# CONFIG_BLK_DEV_UMEM is not set -# CONFIG_BLK_DEV_SX8 is not set -CONFIG_BLK_DEV_LOOP=y -# CONFIG_BLK_DEV_NBD is not set -CONFIG_BLK_DEV_RAM=y -CONFIG_BLK_DEV_RAM_SIZE=4096 -# CONFIG_BLK_DEV_INITRD is not set -CONFIG_BLK_DEV_PBD=y -CONFIG_BLK_STATS=y - -# -# Multi-device support (RAID and LVM) -# -# CONFIG_MD is not set -# CONFIG_BLK_DEV_MD is not set -# CONFIG_MD_LINEAR is not set -# CONFIG_MD_RAID0 is not set -# CONFIG_MD_RAID1 is not set -# CONFIG_MD_RAID5 is not set -# CONFIG_MD_MULTIPATH is not set -# CONFIG_BLK_DEV_LVM is not set - -# -# Networking options -# -CONFIG_PACKET=y -# CONFIG_PACKET_MMAP is not set -CONFIG_NETLINK_DEV=y -CONFIG_NETFILTER=y -# CONFIG_NETFILTER_DEBUG is not set -CONFIG_FILTER=y -CONFIG_UNIX=y -CONFIG_INET=y -# CONFIG_IP_MULTICAST is not set -# CONFIG_IP_ADVANCED_ROUTER is not set -# CONFIG_IP_PNP is not set -# CONFIG_NET_IPIP is not set -# CONFIG_NET_IPGRE is not set -# CONFIG_ARPD is not set -# CONFIG_INET_ECN is not set -# CONFIG_SYN_COOKIES is not set - -# -# IP: Netfilter Configuration -# -CONFIG_IP_NF_CONNTRACK=m -CONFIG_IP_NF_FTP=m -CONFIG_IP_NF_AMANDA=m -CONFIG_IP_NF_TFTP=m -CONFIG_IP_NF_IRC=m -CONFIG_IP_NF_QUEUE=m -CONFIG_IP_NF_IPTABLES=m -CONFIG_IP_NF_MATCH_LIMIT=m -CONFIG_IP_NF_MATCH_MAC=m -CONFIG_IP_NF_MATCH_PKTTYPE=m -CONFIG_IP_NF_MATCH_MARK=m -CONFIG_IP_NF_MATCH_MULTIPORT=m -CONFIG_IP_NF_MATCH_TOS=m -CONFIG_IP_NF_MATCH_RECENT=m -CONFIG_IP_NF_MATCH_ECN=m -CONFIG_IP_NF_MATCH_DSCP=m -CONFIG_IP_NF_MATCH_AH_ESP=m -CONFIG_IP_NF_MATCH_LENGTH=m -CONFIG_IP_NF_MATCH_TTL=m -CONFIG_IP_NF_MATCH_TCPMSS=m -CONFIG_IP_NF_MATCH_HELPER=m -CONFIG_IP_NF_MATCH_STATE=m -CONFIG_IP_NF_MATCH_CONNTRACK=m -CONFIG_IP_NF_MATCH_UNCLEAN=m -CONFIG_IP_NF_MATCH_OWNER=m -CONFIG_IP_NF_FILTER=m -CONFIG_IP_NF_TARGET_REJECT=m -CONFIG_IP_NF_TARGET_MIRROR=m -CONFIG_IP_NF_NAT=m -CONFIG_IP_NF_NAT_NEEDED=y -CONFIG_IP_NF_TARGET_MASQUERADE=m -CONFIG_IP_NF_TARGET_REDIRECT=m -CONFIG_IP_NF_NAT_AMANDA=m -CONFIG_IP_NF_NAT_LOCAL=y -CONFIG_IP_NF_NAT_SNMP_BASIC=m -CONFIG_IP_NF_NAT_IRC=m -CONFIG_IP_NF_NAT_FTP=m -CONFIG_IP_NF_NAT_TFTP=m -CONFIG_IP_NF_MANGLE=m -CONFIG_IP_NF_TARGET_TOS=m -CONFIG_IP_NF_TARGET_ECN=m -CONFIG_IP_NF_TARGET_DSCP=m -CONFIG_IP_NF_TARGET_MARK=m -CONFIG_IP_NF_TARGET_LOG=m -CONFIG_IP_NF_TARGET_ULOG=m -CONFIG_IP_NF_TARGET_TCPMSS=m -# CONFIG_IP_NF_ARPTABLES is not set -# CONFIG_IP_NF_COMPAT_IPCHAINS is not set -# CONFIG_IP_NF_COMPAT_IPFWADM is not set - -# -# IP: Virtual Server Configuration -# -# CONFIG_IP_VS is not set -# CONFIG_IPV6 is not set -# CONFIG_KHTTPD is not set - -# -# SCTP Configuration (EXPERIMENTAL) -# -# CONFIG_IP_SCTP is not set -# CONFIG_ATM is not set -# CONFIG_VLAN_8021Q is not set - -# -# -# -# CONFIG_IPX is not set -# CONFIG_ATALK is not set - -# -# Appletalk devices -# -# CONFIG_DEV_APPLETALK is not set -# CONFIG_DECNET is not set -# CONFIG_BRIDGE is not set -# CONFIG_X25 is not set -# CONFIG_LAPB is not set -# CONFIG_LLC is not set -# CONFIG_NET_DIVERT is not set -# CONFIG_ECONET is not set -# CONFIG_WAN_ROUTER is not set -# CONFIG_NET_FASTROUTE is not set -# CONFIG_NET_HW_FLOWCONTROL is not set - -# -# QoS and/or fair queueing -# -# CONFIG_NET_SCHED is not set - -# -# Network testing -# -# CONFIG_NET_PKTGEN is not set - -# -# Telephony Support -# -# CONFIG_PHONE is not set -# CONFIG_PHONE_IXJ is not set -# CONFIG_PHONE_IXJ_PCMCIA is not set - -# -# ATA/IDE/MFM/RLL support -# -# CONFIG_IDE is not set -# CONFIG_BLK_DEV_HD is not set - -# -# SCSI support -# -# CONFIG_SCSI is not set - -# -# Fusion MPT device support -# -# CONFIG_FUSION is not set -# CONFIG_FUSION_BOOT is not set -# CONFIG_FUSION_ISENSE is not set -# CONFIG_FUSION_CTL is not set -# CONFIG_FUSION_LAN is not set - -# -# I2O device support -# -# CONFIG_I2O is not set -# CONFIG_I2O_BLOCK is not set -# CONFIG_I2O_LAN is not set -# CONFIG_I2O_SCSI is not set -# CONFIG_I2O_PROC is not set - -# -# Network device support -# -CONFIG_NETDEVICES=y - -# -# ARCnet devices -# -# CONFIG_ARCNET is not set -# CONFIG_DUMMY is not set -# CONFIG_BONDING is not set -# CONFIG_EQUALIZER is not set -CONFIG_TUN=m -# CONFIG_ETHERTAP is not set - -# -# Ethernet (10 or 100Mbit) -# -# CONFIG_NET_ETHERNET is not set - -# -# Ethernet (1000 Mbit) -# -# CONFIG_ACENIC is not set -# CONFIG_DL2K is not set -# CONFIG_E1000 is not set -# CONFIG_MYRI_SBUS is not set -# CONFIG_NS83820 is not set -# CONFIG_HAMACHI is not set -# CONFIG_YELLOWFIN is not set -# CONFIG_R8169 is not set -# CONFIG_SK98LIN is not set -# CONFIG_TIGON3 is not set -CONFIG_COOPERATIVE_CONET=y -# CONFIG_FDDI is not set -# CONFIG_HIPPI is not set -# CONFIG_PLIP is not set -CONFIG_PPP=m -CONFIG_PPP_MULTILINK=y -# CONFIG_PPP_FILTER is not set -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -CONFIG_PPP_DEFLATE=m -CONFIG_PPP_BSDCOMP=m -CONFIG_PPPOE=m -# CONFIG_SLIP is not set - -# -# Wireless LAN (non-hamradio) -# -# CONFIG_NET_RADIO is not set - -# -# Token Ring devices -# -# CONFIG_TR is not set -# CONFIG_NET_FC is not set -# CONFIG_RCPCI is not set -# CONFIG_SHAPER is not set - -# -# Wan interfaces -# -# CONFIG_WAN is not set - -# -# Amateur Radio support -# -# CONFIG_HAMRADIO is not set - -# -# IrDA (infrared) support -# -# CONFIG_IRDA is not set - -# -# ISDN subsystem -# -# CONFIG_ISDN is not set - -# -# Input core support -# -# CONFIG_INPUT is not set -# CONFIG_INPUT_KEYBDEV is not set -# CONFIG_INPUT_MOUSEDEV is not set -# CONFIG_INPUT_JOYDEV is not set -# CONFIG_INPUT_EVDEV is not set -# CONFIG_INPUT_UINPUT is not set - -# -# Character devices -# -CONFIG_VT=y -CONFIG_VT_CONSOLE=y -# CONFIG_SERIAL is not set -# CONFIG_SERIAL_EXTENDED is not set -# CONFIG_SERIAL_NONSTANDARD is not set -CONFIG_UNIX98_PTYS=y -CONFIG_UNIX98_PTY_COUNT=256 - -# -# I2C support -# -# CONFIG_I2C is not set - -# -# Mice -# -# CONFIG_BUSMOUSE is not set -# CONFIG_MOUSE is not set - -# -# Joysticks -# -# CONFIG_INPUT_GAMEPORT is not set - -# -# Input core support is needed for gameports -# - -# -# Input core support is needed for joysticks -# -# CONFIG_QIC02_TAPE is not set -# CONFIG_IPMI_HANDLER is not set -# CONFIG_IPMI_PANIC_EVENT is not set -# CONFIG_IPMI_DEVICE_INTERFACE is not set -# CONFIG_IPMI_KCS is not set -# CONFIG_IPMI_WATCHDOG is not set - -# -# Watchdog Cards -# -# CONFIG_WATCHDOG is not set -# CONFIG_SCx200 is not set -# CONFIG_SCx200_GPIO is not set -# CONFIG_AMD_RNG is not set -# CONFIG_INTEL_RNG is not set -# CONFIG_HW_RANDOM is not set -# CONFIG_AMD_PM768 is not set -# CONFIG_NVRAM is not set -# CONFIG_RTC is not set -# CONFIG_DTLK is not set -# CONFIG_R3964 is not set -# CONFIG_APPLICOM is not set -# CONFIG_SONYPI is not set - -# -# Ftape, the floppy tape device driver -# -# CONFIG_FTAPE is not set -# CONFIG_AGP is not set - -# -# Direct Rendering Manager (XFree86 DRI support) -# -# CONFIG_DRM is not set -# CONFIG_MWAVE is not set -# CONFIG_OBMOUSE is not set - -# -# Multimedia devices -# -# CONFIG_VIDEO_DEV is not set - -# -# File systems -# -# CONFIG_QUOTA is not set -# CONFIG_QFMT_V2 is not set -# CONFIG_AUTOFS_FS is not set -CONFIG_AUTOFS4_FS=y -CONFIG_REISERFS_FS=y -# CONFIG_REISERFS_CHECK is not set -# CONFIG_REISERFS_PROC_INFO is not set -# CONFIG_ADFS_FS is not set -# CONFIG_ADFS_FS_RW is not set -# CONFIG_AFFS_FS is not set -# CONFIG_HFS_FS is not set -# CONFIG_HFSPLUS_FS is not set -# CONFIG_BEFS_FS is not set -# CONFIG_BEFS_DEBUG is not set -# CONFIG_BFS_FS is not set -CONFIG_EXT3_FS=y -# CONFIG_JBD is not set -# CONFIG_JBD_DEBUG is not set -CONFIG_FAT_FS=y -CONFIG_MSDOS_FS=y -CONFIG_UMSDOS_FS=y -CONFIG_VFAT_FS=y -# CONFIG_EFS_FS is not set -# CONFIG_JFFS_FS is not set -# CONFIG_JFFS2_FS is not set -CONFIG_CRAMFS=m -CONFIG_TMPFS=y -CONFIG_RAMFS=y -CONFIG_ISO9660_FS=y -CONFIG_JOLIET=y -CONFIG_ZISOFS=y -# CONFIG_JFS_FS is not set -# CONFIG_JFS_DEBUG is not set -# CONFIG_JFS_STATISTICS is not set -CONFIG_MINIX_FS=m -# CONFIG_VXFS_FS is not set -CONFIG_NTFS_FS=m -# CONFIG_NTFS_RW is not set -# CONFIG_HPFS_FS is not set -CONFIG_PROC_FS=y -CONFIG_DEVFS_FS=y -# CONFIG_DEVFS_MOUNT is not set -# CONFIG_DEVFS_DEBUG is not set -CONFIG_DEVPTS_FS=y -# CONFIG_QNX4FS_FS is not set -# CONFIG_QNX4FS_RW is not set -# CONFIG_ROMFS_FS is not set -CONFIG_EXT2_FS=y -# CONFIG_SYSV_FS is not set -# CONFIG_UDF_FS is not set -# CONFIG_UDF_RW is not set -# CONFIG_UFS_FS is not set -# CONFIG_UFS_FS_WRITE is not set -CONFIG_XFS_FS=m -# CONFIG_XFS_QUOTA is not set -# CONFIG_XFS_RT is not set -# CONFIG_XFS_TRACE is not set -# CONFIG_XFS_DEBUG is not set - -# -# Network File Systems -# -# CONFIG_CODA_FS is not set -# CONFIG_INTERMEZZO_FS is not set -CONFIG_NFS_FS=m -CONFIG_NFS_V3=y -# CONFIG_NFS_DIRECTIO is not set -# CONFIG_ROOT_NFS is not set -# CONFIG_NFSD is not set -# CONFIG_NFSD_V3 is not set -# CONFIG_NFSD_TCP is not set -CONFIG_SUNRPC=m -CONFIG_LOCKD=m -CONFIG_LOCKD_V4=y -CONFIG_SMB_FS=y -# CONFIG_SMB_NLS_DEFAULT is not set -CONFIG_SMB_UNIX=y -# CONFIG_NCP_FS is not set -# CONFIG_NCPFS_PACKET_SIGNING is not set -# CONFIG_NCPFS_IOCTL_LOCKING is not set -# CONFIG_NCPFS_STRONG is not set -# CONFIG_NCPFS_NFS_NS is not set -# CONFIG_NCPFS_OS2_NS is not set -# CONFIG_NCPFS_SMALLDOS is not set -# CONFIG_NCPFS_NLS is not set -# CONFIG_NCPFS_EXTRAS is not set -CONFIG_ZISOFS_FS=y - -# -# Partition Types -# -# CONFIG_PARTITION_ADVANCED is not set -CONFIG_MSDOS_PARTITION=y -CONFIG_SMB_NLS=y -CONFIG_NLS=y - -# -# Native Language Support -# -CONFIG_NLS_DEFAULT="iso8859-1" -# CONFIG_NLS_CODEPAGE_437 is not set -# CONFIG_NLS_CODEPAGE_737 is not set -# CONFIG_NLS_CODEPAGE_775 is not set -# CONFIG_NLS_CODEPAGE_850 is not set -# CONFIG_NLS_CODEPAGE_852 is not set -# CONFIG_NLS_CODEPAGE_855 is not set -# CONFIG_NLS_CODEPAGE_857 is not set -# CONFIG_NLS_CODEPAGE_860 is not set -# CONFIG_NLS_CODEPAGE_861 is not set -# CONFIG_NLS_CODEPAGE_862 is not set -# CONFIG_NLS_CODEPAGE_863 is not set -# CONFIG_NLS_CODEPAGE_864 is not set -# CONFIG_NLS_CODEPAGE_865 is not set -# CONFIG_NLS_CODEPAGE_866 is not set -# CONFIG_NLS_CODEPAGE_869 is not set -# CONFIG_NLS_CODEPAGE_936 is not set -# CONFIG_NLS_CODEPAGE_950 is not set -# CONFIG_NLS_CODEPAGE_932 is not set -# CONFIG_NLS_CODEPAGE_949 is not set -# CONFIG_NLS_CODEPAGE_874 is not set -# CONFIG_NLS_ISO8859_8 is not set -# CONFIG_NLS_CODEPAGE_1250 is not set -# CONFIG_NLS_CODEPAGE_1251 is not set -# CONFIG_NLS_ISO8859_1 is not set -# CONFIG_NLS_ISO8859_2 is not set -# CONFIG_NLS_ISO8859_3 is not set -# CONFIG_NLS_ISO8859_4 is not set -# CONFIG_NLS_ISO8859_5 is not set -# CONFIG_NLS_ISO8859_6 is not set -# CONFIG_NLS_ISO8859_7 is not set -# CONFIG_NLS_ISO8859_9 is not set -# CONFIG_NLS_ISO8859_13 is not set -# CONFIG_NLS_ISO8859_14 is not set -# CONFIG_NLS_ISO8859_15 is not set -# CONFIG_NLS_KOI8_R is not set -# CONFIG_NLS_KOI8_U is not set -# CONFIG_NLS_UTF8 is not set - -# -# Console drivers -# -CONFIG_COOPERATIVE_CONSOLE=y -# CONFIG_VIDEO_SELECT is not set -# CONFIG_MDA_CONSOLE is not set - -# -# Frame-buffer support -# -# CONFIG_FB is not set - -# -# Sound -# -# CONFIG_SOUND is not set - -# -# USB support -# -# CONFIG_USB is not set - -# -# Support for USB gadgets -# -# CONFIG_USB_GADGET is not set - -# -# Bluetooth support -# -# CONFIG_BLUEZ is not set - -# -# Kernel hacking -# -CONFIG_DEBUG_KERNEL=y -# CONFIG_DEBUG_STACKOVERFLOW is not set -# CONFIG_DEBUG_HIGHMEM is not set -# CONFIG_DEBUG_SLAB is not set -# CONFIG_DEBUG_IOVIRT is not set -# CONFIG_MAGIC_SYSRQ is not set -# CONFIG_DEBUG_SPINLOCK is not set -CONFIG_FRAME_POINTER=y -CONFIG_LOG_BUF_SHIFT=0 - -# -# Cryptographic options -# -CONFIG_CRYPTO=y -CONFIG_CRYPTO_HMAC=y -CONFIG_CRYPTO_NULL=m -CONFIG_CRYPTO_MD4=m -CONFIG_CRYPTO_MD5=m -CONFIG_CRYPTO_SHA1=m -CONFIG_CRYPTO_SHA256=m -CONFIG_CRYPTO_SHA512=m -CONFIG_CRYPTO_DES=m -CONFIG_CRYPTO_BLOWFISH=m -CONFIG_CRYPTO_TWOFISH=m -CONFIG_CRYPTO_SERPENT=m -CONFIG_CRYPTO_AES=m -CONFIG_CRYPTO_CAST5=m -CONFIG_CRYPTO_CAST6=m -# CONFIG_CRYPTO_TEA is not set -CONFIG_CRYPTO_ARC4=m -CONFIG_CRYPTO_DEFLATE=m -# CONFIG_CRYPTO_MICHAEL_MIC is not set -CONFIG_CRYPTO_TEST=m - -# -# Library routines -# -CONFIG_CRC32=m -CONFIG_ZLIB_INFLATE=y -CONFIG_ZLIB_DEFLATE=m diff --git a/recipes/linux/linux-colinux-2.4.28/gcc-registerparanoia.patch b/recipes/linux/linux-colinux-2.4.28/gcc-registerparanoia.patch deleted file mode 100644 index a4e9271313..0000000000 --- a/recipes/linux/linux-colinux-2.4.28/gcc-registerparanoia.patch +++ /dev/null @@ -1,55 +0,0 @@ - -# -# Patch managed by http://www.mn-logistik.de/unsupported/pxa250/patcher -# - ---- linux-2.4.27/include/asm-arm/system.h~gcc-registerparanoia 2003-08-25 07:44:43.000000000 -0400 -+++ linux-2.4.27/include/asm-arm/system.h 2004-11-27 15:32:23.613933592 -0500 -@@ -3,6 +3,15 @@ - - #ifdef __KERNEL__ - -+/* -+ * This is used to ensure the compiler did actually allocate the register we -+ * asked it for some inline assembly sequences. Apparently we can't trust -+ * the compiler from one version to another so a bit of paranoia won't hurt. -+ * This string is meant to be concatenated with the inline asm string and -+ * will cause compilation to stop on mismatch. -+ */ -+#define __asmeq(x, y) ".ifnc " x "," y " ; .err ; .endif\n\t" -+ - #include <linux/config.h> - #include <linux/kernel.h> - ---- linux-2.4.27/include/asm-arm/uaccess.h~gcc-registerparanoia 2001-10-25 16:53:55.000000000 -0400 -+++ linux-2.4.27/include/asm-arm/uaccess.h 2004-11-27 15:32:23.613933592 -0500 -@@ -6,6 +6,7 @@ - */ - #include <linux/sched.h> - #include <asm/errno.h> -+#include <asm/system.h> - - #define VERIFY_READ 0 - #define VERIFY_WRITE 1 -@@ -71,7 +72,9 @@ - extern int __get_user_bad(void); - - #define __get_user_x(__r1,__p,__e,__s,__i...) \ -- __asm__ __volatile__ ("bl __get_user_" #__s \ -+ __asm__ __volatile__ ( \ -+ __asmeq("%0", "r0") __asmeq("%1", "r1") \ -+ "bl __get_user_" #__s \ - : "=&r" (__e), "=r" (__r1) \ - : "0" (__p) \ - : __i) -@@ -110,7 +113,9 @@ - extern int __put_user_bad(void); - - #define __put_user_x(__r1,__p,__e,__s,__i...) \ -- __asm__ __volatile__ ("bl __put_user_" #__s \ -+ __asm__ __volatile__ ( \ -+ __asmeq("%0", "r0") __asmeq("%2", "r1") \ -+ "bl __put_user_" #__s \ - : "=&r" (__e) \ - : "0" (__p), "r" (__r1) \ - : __i) diff --git a/recipes/linux/linux-colinux-2.4.28/gcc340-fixes-v2.4.26-try3.patch b/recipes/linux/linux-colinux-2.4.28/gcc340-fixes-v2.4.26-try3.patch deleted file mode 100644 index 27ae9327ff..0000000000 --- a/recipes/linux/linux-colinux-2.4.28/gcc340-fixes-v2.4.26-try3.patch +++ /dev/null @@ -1,38 +0,0 @@ - -# -# Patch managed by http://www.mn-logistik.de/unsupported/pxa250/patcher -# - ---- linux-2.4.28/arch/i386/Makefile~gcc340-fixes-v2.4.26-try3 2004-11-17 06:54:21.000000000 -0500 -+++ linux-2.4.28/arch/i386/Makefile 2004-11-27 15:59:39.719207784 -0500 -@@ -98,6 +98,8 @@ - # due to the lack of sharing of stacklots. - CFLAGS += $(call check_gcc,-fno-unit-at-a-time,) - -+CFLAGS += $(call check_gcc,-fno-unit-at-a-time,) -+ - HEAD := arch/i386/kernel/head.o arch/i386/kernel/init_task.o - - SUBDIRS += arch/i386/kernel arch/i386/mm arch/i386/lib ---- linux-2.4.28/include/linux/smp.h~gcc340-fixes-v2.4.26-try3 2001-11-22 14:46:19.000000000 -0500 -+++ linux-2.4.28/include/linux/smp.h 2004-11-27 16:01:01.519772208 -0500 -@@ -26,7 +26,7 @@ - /* - * sends a 'reschedule' event to another CPU: - */ --extern void FASTCALL(smp_send_reschedule(int cpu)); -+extern void smp_send_reschedule(int cpu); - - - /* ---- linux-2.4.28/mm/page_alloc.c~gcc340-fixes-v2.4.26-try3 2004-11-17 06:54:22.000000000 -0500 -+++ linux-2.4.28/mm/page_alloc.c 2004-11-27 15:59:39.851187720 -0500 -@@ -46,7 +46,7 @@ - - int vm_gfp_debug = 0; - --static void FASTCALL(__free_pages_ok (struct page *page, unsigned int order)); -+static void fastcall __free_pages_ok (struct page *page, unsigned int order); - - static spinlock_t free_pages_ok_no_irq_lock = SPIN_LOCK_UNLOCKED; - struct page * free_pages_ok_no_irq_head; diff --git a/recipes/linux/linux-colinux-2.4.28/linux-2.4.24-attribute-used.patch b/recipes/linux/linux-colinux-2.4.28/linux-2.4.24-attribute-used.patch deleted file mode 100644 index 2b7678e97a..0000000000 --- a/recipes/linux/linux-colinux-2.4.28/linux-2.4.24-attribute-used.patch +++ /dev/null @@ -1,37 +0,0 @@ - -# -# Patch managed by http://www.mn-logistik.de/unsupported/pxa250/patcher -# - ---- linux-2.4.27/include/asm-arm/setup.h~linux-2.4.24-attribute-used 2003-08-25 07:44:43.000000000 -0400 -+++ linux-2.4.27/include/asm-arm/setup.h 2004-11-27 15:32:34.003354160 -0500 -@@ -236,7 +236,7 @@ - int (*parse)(const struct tag *); - }; - --#define __tag __attribute__((unused, __section__(".taglist"))) -+#define __tag __attribute_used__ __attribute__((__section__(".taglist"))) - #define __tagtable(tag, fn) \ - static struct tagtable __tagtable_##fn __tag = { tag, fn } - ---- linux-2.4.27/include/linux/compiler.h~linux-2.4.24-attribute-used 2004-08-07 19:26:06.000000000 -0400 -+++ linux-2.4.27/include/linux/compiler.h 2004-11-27 15:32:34.008353400 -0500 -@@ -38,4 +38,18 @@ - /* no checker support, so we unconditionally define this as (null) */ - #define __user - -+#if __GNUC__ > 3 -+#define __attribute_used__ __attribute__((__used__)) -+#elif __GNUC__ == 3 -+#if __GNUC_MINOR__ >= 3 -+# define __attribute_used__ __attribute__((__used__)) -+#else -+# define __attribute_used__ __attribute__((__unused__)) -+#endif /* __GNUC_MINOR__ >= 3 */ -+#elif __GNUC__ == 2 -+#define __attribute_used__ __attribute__((__unused__)) -+#else -+#define __attribute_used__ /* not implemented */ -+#endif /* __GNUC__ */ -+ - #endif /* __LINUX_COMPILER_H */ diff --git a/recipes/linux/linux-colinux-2.4.28/nofpu.patch b/recipes/linux/linux-colinux-2.4.28/nofpu.patch deleted file mode 100644 index 6adff6d6be..0000000000 --- a/recipes/linux/linux-colinux-2.4.28/nofpu.patch +++ /dev/null @@ -1,16 +0,0 @@ - -# -# Patch managed by http://www.mn-logistik.de/unsupported/pxa250/patcher -# - ---- linux-2.4.27/arch/arm/Makefile~nofpu 2003-08-25 07:44:39.000000000 -0400 -+++ linux-2.4.27/arch/arm/Makefile 2004-11-27 15:32:10.906865360 -0500 -@@ -52,7 +52,7 @@ - - CFLAGS_BOOT :=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float -Uarm - CFLAGS +=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float -Uarm --AFLAGS +=$(apcs-y) $(arch-y) -mno-fpu -msoft-float -+AFLAGS +=$(apcs-y) $(arch-y) -msoft-float - - ifeq ($(CONFIG_CPU_26),y) - PROCESSOR := armo diff --git a/recipes/linux/linux-colinux-2.4.28/shortloadbytes.patch b/recipes/linux/linux-colinux-2.4.28/shortloadbytes.patch deleted file mode 100644 index 0f0ea1515a..0000000000 --- a/recipes/linux/linux-colinux-2.4.28/shortloadbytes.patch +++ /dev/null @@ -1,18 +0,0 @@ - -# -# Patch managed by http://www.mn-logistik.de/unsupported/pxa250/patcher -# - ---- linux-2.4.27/arch/arm/Makefile~shortloadbytes 2004-11-27 15:32:10.906865000 -0500 -+++ linux-2.4.27/arch/arm/Makefile 2004-11-27 15:32:16.891955488 -0500 -@@ -50,8 +50,8 @@ - tune-$(CONFIG_CPU_SA110) :=-mtune=strongarm110 - tune-$(CONFIG_CPU_SA1100) :=-mtune=strongarm1100 - --CFLAGS_BOOT :=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float -Uarm --CFLAGS +=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float -Uarm -+CFLAGS_BOOT :=$(apcs-y) $(arch-y) $(tune-y) $(call check_gcc,-malignment-traps,-mshort-load-bytes) -msoft-float -Uarm -+CFLAGS +=$(apcs-y) $(arch-y) $(tune-y) $(call check_gcc,-malignment-traps,-mshort-load-bytes) -msoft-float -Uarm - AFLAGS +=$(apcs-y) $(arch-y) -msoft-float - - ifeq ($(CONFIG_CPU_26),y) |