summaryrefslogtreecommitdiff
path: root/libdde_linux26/lib/src/arch
diff options
context:
space:
mode:
Diffstat (limited to 'libdde_linux26/lib/src/arch')
-rw-r--r--libdde_linux26/lib/src/arch/l4/param.c63
-rw-r--r--libdde_linux26/lib/src/arch/l4/pci.c31
-rw-r--r--libdde_linux26/lib/src/arch/l4/softirq.c14
-rw-r--r--libdde_linux26/lib/src/arch/x86/kernel/setup.c114
4 files changed, 206 insertions, 16 deletions
diff --git a/libdde_linux26/lib/src/arch/l4/param.c b/libdde_linux26/lib/src/arch/l4/param.c
index 5bd83f32..c459428a 100644
--- a/libdde_linux26/lib/src/arch/l4/param.c
+++ b/libdde_linux26/lib/src/arch/l4/param.c
@@ -26,6 +26,69 @@ STANDARD_PARAM_DEF(uint, unsigned int, "%u", unsigned long, simple_strtoul);
STANDARD_PARAM_DEF(long, long, "%li", long, simple_strtol);
STANDARD_PARAM_DEF(ulong, unsigned long, "%lu", unsigned long, simple_strtoul);
+int param_set_charp(const char *val, struct kernel_param *kp)
+{
+ if (!val) {
+ printk(KERN_ERR "%s: string parameter expected\n",
+ kp->name);
+ return -EINVAL;
+ }
+
+ if (strlen(val) > 1024) {
+ printk(KERN_ERR "%s: string parameter too long\n",
+ kp->name);
+ return -ENOSPC;
+ }
+
+ *(char **)kp->arg = (char *)val;
+ return 0;
+}
+
+int param_get_charp(char *buffer, struct kernel_param *kp)
+{
+ return sprintf(buffer, "%s", *((char **)kp->arg));
+}
+
+int param_set_bool(const char *val, struct kernel_param *kp)
+{
+ /* No equals means "set"... */
+ if (!val) val = "1";
+
+ /* One of =[yYnN01] */
+ switch (val[0]) {
+ case 'y': case 'Y': case '1':
+ *(int *)kp->arg = 1;
+ return 0;
+ case 'n': case 'N': case '0':
+ *(int *)kp->arg = 0;
+ return 0;
+ }
+ return -EINVAL;
+}
+
+int param_get_bool(char *buffer, struct kernel_param *kp)
+{
+ /* Y and N chosen as being relatively non-coder friendly */
+ return sprintf(buffer, "%c", (*(int *)kp->arg) ? 'Y' : 'N');
+}
+
+int param_set_invbool(const char *val, struct kernel_param *kp)
+{
+ int boolval, ret;
+ struct kernel_param dummy;
+
+ dummy.arg = &boolval;
+ ret = param_set_bool(val, &dummy);
+ if (ret == 0)
+ *(int *)kp->arg = !boolval;
+ return ret;
+}
+
+int param_get_invbool(char *buffer, struct kernel_param *kp)
+{
+ return sprintf(buffer, "%c", (*(int *)kp->arg) ? 'N' : 'Y');
+}
+
int printk_ratelimit(void)
{
return 0;
diff --git a/libdde_linux26/lib/src/arch/l4/pci.c b/libdde_linux26/lib/src/arch/l4/pci.c
index c393fd3a..b50a7353 100644
--- a/libdde_linux26/lib/src/arch/l4/pci.c
+++ b/libdde_linux26/lib/src/arch/l4/pci.c
@@ -24,10 +24,6 @@ typedef struct l4dde_pci_dev {
/** List of Linux-DDEKit PCIDev mappings */
static LIST_HEAD(pcidev_mappings);
-/** PCI bus */
-static struct pci_bus *pci_bus = NULL;
-static struct pci_bus *pci_bus1 = NULL;
-
static int l4dde26_pci_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *val);
static int l4dde26_pci_write(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 val);
@@ -187,18 +183,21 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
void __init l4dde26_init_pci(void)
{
ddekit_pci_init();
-
- // TODO it's a temporary solution to handle 2 buses.
- // we need to find a way to detect buses.
- pci_bus = pci_create_bus(NULL, 0, &dde_pcibus_ops, NULL);
- Assert(pci_bus);
-
- pci_do_scan_bus(pci_bus);
-
- pci_bus1 = pci_create_bus(NULL, 2, &dde_pcibus_ops, NULL);
- Assert(pci_bus1);
-
- pci_do_scan_bus(pci_bus1);
+ int nr;
+ char found[256] = { };
+ int bus, slot, func;
+
+ for (nr = 0; ; nr++) {
+ if (ddekit_pci_get_device(nr, &bus, &slot, &func) != 0)
+ break;
+ if (!found[bus]) {
+ struct pci_bus *pci_bus = pci_create_bus(NULL, bus, &dde_pcibus_ops, NULL);
+ Assert(pci_bus);
+ pci_do_scan_bus(pci_bus);
+
+ found[bus] = 1;
+ }
+ }
INITIALIZE_INITVAR(dde26_pci);
}
diff --git a/libdde_linux26/lib/src/arch/l4/softirq.c b/libdde_linux26/lib/src/arch/l4/softirq.c
index 247a414f..d93bfaff 100644
--- a/libdde_linux26/lib/src/arch/l4/softirq.c
+++ b/libdde_linux26/lib/src/arch/l4/softirq.c
@@ -67,6 +67,20 @@ void tasklet_init(struct tasklet_struct *t,
t->data = data;
}
+void tasklet_kill(struct tasklet_struct *t)
+{
+ if (in_interrupt())
+ printk("Attempt to kill tasklet from interrupt\n");
+
+ while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) {
+ do
+ yield();
+ while (test_bit(TASKLET_STATE_SCHED, &t->state));
+ }
+ tasklet_unlock_wait(t);
+ clear_bit(TASKLET_STATE_SCHED, &t->state);
+}
+
/* enqueue tasklet */
static void __tasklet_enqueue(struct tasklet_struct *t,
struct tasklet_head *listhead)
diff --git a/libdde_linux26/lib/src/arch/x86/kernel/setup.c b/libdde_linux26/lib/src/arch/x86/kernel/setup.c
new file mode 100644
index 00000000..ef285c0d
--- /dev/null
+++ b/libdde_linux26/lib/src/arch/x86/kernel/setup.c
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 1995 Linus Torvalds
+ *
+ * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
+ *
+ * Memory region support
+ * David Parsons <orc@pell.chi.il.us>, July-August 1999
+ *
+ * Added E820 sanitization routine (removes overlapping memory regions);
+ * Brian Moyle <bmoyle@mvista.com>, February 2001
+ *
+ * Moved CPU detection code to cpu/${cpu}.c
+ * Patrick Mochel <mochel@osdl.org>, March 2002
+ *
+ * Provisions for empty E820 memory regions (reported by certain BIOSes).
+ * Alex Achenbach <xela@slit.de>, December 2002.
+ *
+ */
+
+/*
+ * This file handles the architecture-dependent parts of initialization
+ */
+
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <linux/mmzone.h>
+#include <linux/screen_info.h>
+#include <linux/ioport.h>
+#include <linux/acpi.h>
+#include <linux/apm_bios.h>
+#include <linux/initrd.h>
+#include <linux/bootmem.h>
+#include <linux/seq_file.h>
+#include <linux/console.h>
+#include <linux/mca.h>
+#include <linux/root_dev.h>
+#include <linux/highmem.h>
+#include <linux/module.h>
+#include <linux/efi.h>
+#include <linux/init.h>
+#include <linux/edd.h>
+#include <linux/iscsi_ibft.h>
+#include <linux/nodemask.h>
+#include <linux/kexec.h>
+#include <linux/dmi.h>
+#include <linux/pfn.h>
+#include <linux/pci.h>
+#include <asm/pci-direct.h>
+#include <linux/init_ohci1394_dma.h>
+#include <linux/kvm_para.h>
+
+#include <linux/errno.h>
+#include <linux/kernel.h>
+#include <linux/stddef.h>
+#include <linux/unistd.h>
+#include <linux/ptrace.h>
+#include <linux/slab.h>
+#include <linux/user.h>
+#include <linux/delay.h>
+
+#include <linux/kallsyms.h>
+#include <linux/cpufreq.h>
+#include <linux/dma-mapping.h>
+#include <linux/ctype.h>
+#include <linux/uaccess.h>
+
+#include <linux/percpu.h>
+#include <linux/crash_dump.h>
+
+#include <video/edid.h>
+
+#include <asm/mtrr.h>
+#include <asm/apic.h>
+#include <asm/e820.h>
+#include <asm/mpspec.h>
+#include <asm/setup.h>
+#include <asm/arch_hooks.h>
+#include <asm/efi.h>
+#include <asm/sections.h>
+#include <asm/dmi.h>
+#include <asm/io_apic.h>
+#include <asm/ist.h>
+#include <asm/vmi.h>
+#include <setup_arch.h>
+#include <asm/bios_ebda.h>
+#include <asm/cacheflush.h>
+#include <asm/processor.h>
+#include <asm/bugs.h>
+
+#include <asm/system.h>
+#include <asm/vsyscall.h>
+#include <asm/smp.h>
+#include <asm/desc.h>
+#include <asm/dma.h>
+#include <asm/iommu.h>
+#include <asm/gart.h>
+#include <asm/mmu_context.h>
+#include <asm/proto.h>
+
+#include <mach_apic.h>
+#include <asm/paravirt.h>
+#include <asm/hypervisor.h>
+
+#include <asm/percpu.h>
+#include <asm/topology.h>
+#include <asm/apicdef.h>
+#ifdef CONFIG_X86_64
+#include <asm/numa_64.h>
+#endif
+
+/* common cpu data for all cpus */
+/* XXX: Asserting >= 586 */
+struct cpuinfo_x86 boot_cpu_data __read_mostly = {5, 0, 0, 0, -1, 1, 0, 0, -1};
+EXPORT_SYMBOL(boot_cpu_data);