Problem with dice when fpage are used with derivation

Marc CHALAND l4 at marc-chaland.net
Wed Feb 27 16:42:47 CET 2008


Hi,

I don't have time to do more checking on L4Linux. Today, I use dice
r238 of public repository of TUDOS. All my tasks are pure L4env ones.
I try to process an idl which is quite long. Here is a sample :

library     myapp {
    [uuid(2)]
    interface   connection {
        int     syn([out]  unsigned long   *page_in_base);
        int     ack([in]    fpage            page_in,
                    [in]    unsigned long    page_out_base,
                    [out]   fpage           *page_out);
        int     rst(void);
    };
};

I create one interface which derives from myapp::connection :

library myapp_server {
    interface server :  myapp::configuration,
                        myapp::connection,
                        myapp::key {
    };
};


Dice generates files. One of them is very strange. On server side,
file corresponding to myapp_server contains following code :

inline
long
myapp_server_reply_and_wait (CORBA_Object _dice_corba_obj,
                                  l4_msgtag_t *_dice_tag,
                                  myapp_server_msg_buffer_t *_dice_msg_buffer,
                                  CORBA_Server_Environment *_dice_corba_env)
{
    long _dice_opcode = 0;
    l4_msgtag_t tagdummy __attribute__ ((unused)) = l4_msgtag(0,0,0,0);
    l4_msgdope_t _dice_result = { msgdope: 0 };
    if ((_dice_msg_buffer->_word._dice_send_dope.md.dwords <= 2) &&
(_dice_msg_buffer->_word._dice_send_dope.md.strings == 0))
[ZAP]
    /* clear exception if set*/
    if (DICE_EXPECT_FALSE(DICE_HAS_EXCEPTION(_dice_corba_env)))
        CORBA_server_exception_set(_dice_corba_env,
            CORBA_NO_EXCEPTION,
            CORBA_DICE_EXCEPTION_NONE,
            0);
    /* test for IPC errors */
    if (DICE_EXPECT_FALSE(L4_IPC_IS_ERROR(_dice_result)))
    {
        _dice_opcode = 0;
        _dice_msg_buffer->_word._word[0] = 0;
        if (DICE_IS_NO_EXCEPTION(_dice_corba_env))
            CORBA_server_exception_set(_dice_corba_env,
                CORBA_SYSTEM_EXCEPTION,
                CORBA_DICE_INTERNAL_IPC_ERROR,
                0);
        return _dice_opcode;
    }
    if (l4_ipc_fpage_received(_dice_result))
        _dice_opcode = _dice_msg_buffer->_word._word[2];
    else
        _dice_opcode = _dice_msg_buffer->_word._word[0];
    return _dice_opcode;
}

By adding some logging, I realized that when fpage is received, opcode
is not into _word[2] but _word[4].

Regards
Marc




More information about the l4-hackers mailing list