Hi,

i need to use adeos-ipipe just at the interrupt level. In trying to 
achieve my goal I've been able both to succeed and fail, somewhat randomly.

So I decided to play it in steps starting from the very basic one, i.e. 
registering the HEAD domain and doing nothing with it.

Here is the simple module I used.

--------------------------------------------------------------------
#include <linux/module.h>

#include <linux/ipipe.h>

MODULE_LICENSE("GPL");

static struct ipipe_domain head_domain;

static void head_domain_entry(void)
{
        printk("\n***** HEAD_DOMAIN_ENTRY has been called *****\n");
}

int domain_init(void)
{
        struct ipipe_domain_attr attr;
        int retval;

        ipipe_init_attr(&attr);
        attr.name     = "MYHEAD";
        attr.domid    = 0xabcdef;
        attr.entry    = head_domain_entry;
        attr.priority = IPIPE_HEAD_PRIORITY;
        retval = ipipe_register_domain(&head_domain, &attr);
        printk("***** IPIPE_REGISTER_DOMAIN returned %d *****\n", retval);
        return 0;
}

void domain_exit(void)
{
        ipipe_unregister_domain(&head_domain);
        return;
}

module_init(domain_init);
module_exit(domain_exit);
--------------------------------------------------------------------

The above module works with 2.6.32.11 patched with 
adeos-ipipe-2.6.32.11-x86-2.6-03.patch but when used with 2.6.35.9 and 
adeos-ipipe-2.6.35.9-x86-2.8-04.patch it simply locks the machine.

(For your information it works also with kernel 2.6.32.20 with
adeos-ipipe-2.6.32.20-x86-2.7-03.patch)


Following those locks I tried a silly brute force debugging by 
anticipating the exiting from ipipe_register_domain at various points.

By so doing I found that the following:
                 .
                 .
                 .
         /*
          * Finally, allow the new domain to perform its initialization
          * duties.
          */
         local_irq_save_hw_smp(flags);
         __ipipe_current_domain = ipd;
         local_irq_restore_hw_smp(flags);
         attr->entry();
                 return 123456;
                 .
                 .
                 .
avoids the locking and let me read the following with dmesg:

-----------------------------------------------------------------------
I-pipe: Domain MYHEAD registered.
BUG: Unhandled exception over domain MYHEAD at 0x805d1df - switching to ROOT

***** HEAD_DOMAIN_ENTRY has been called *****
***** IPIPE_REGISTER_DOMAIN returned 123456 *****
Pid: 751, comm: udevd Not tainted 2.6.35.9-adeos #3
Call Trace:
 [<c1015dbb>] __ipipe_handle_exception+0x165/0x1af
 [<c13f7b6b>] error_code+0x63/0x70
-----------------------------------------------------------------------

Following it I discovered that the fault can be avoided by commenting a 
single instruction as for:
                 .
                 .
                 .
         /*
          * Finally, allow the new domain to perform its initialization
          * duties.
          */
         local_irq_save_hw_smp(flags);
//        __ipipe_current_domain = ipd;
         local_irq_restore_hw_smp(flags);
         attr->entry();
                 .
                 .
                 .
and letting the function finish normally.

I've been unable to understand why such an assignment causes the 
reported trap.

So: what am I doing wrong?

My hardware is based on an AXIOM industrial grade CPU SHB212 with an Intel Atom 
D425 CPU @1.8GHz.
The system chipset is an Intel ICH8M.
The kernel is compiled without SMP support configurated for a Pentium III CPU.
I tried also defining an Atom CPU but I had the same result.
Local APIC and IO-APIC support enabled.
HPET Timer disabled.

I tried also to put some barrier() and wmb() calls in the ipipe_register_domain
in many points around the critical parts without success.

Giuseppe.


_______________________________________________
Adeos-main mailing list
[email protected]
https://mail.gna.org/listinfo/adeos-main

Reply via email to