memcpy( ) and alignment.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

While compiling Kernel v2.4.16 for RM5231A using gcc-3.0.2, I am running
into some problems which I think are related to gcc, as a result memcpy( )
does not work well for me. Here is what happens,

I see all zeros in tty_std_termios.c_cc even after memcpy( ) is called to
copy the default termios string.

The code snippet is as below:
void __init console_init(void)
{

   memset(ldiscs, 0, sizeof(ldiscs));
  (void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);

   memset(&tty_std_termios, 0, sizeof(struct termios));
   memcpy(tty_std_termios.c_cc, INIT_C_CC, NCCS);


   printk("tty_std_termios is at %p\n", &tty_std_termios);
		|
		few more printk( ) calls etc.
}

The tty_std_termios is of type struct termios which is defined as below:

typedef unsigned char cc_t;
typedef unsigned long speed_t;
typedef unsigned long tcflag_t;

/*
 * The ABI says nothing about NCC but seems to use NCCS as
 * replacement for it in struct termio
 */
#define NCCS    23
struct termios {
        tcflag_t c_iflag;               /* input mode flags */
        tcflag_t c_oflag;               /* output mode flags */
        tcflag_t c_cflag;               /* control mode flags */
        tcflag_t c_lflag;               /* local mode flags */

        // cc_t c_cc[NCCS];                /* control characters */

        /*
         * Seems nonexistent in the ABI, but Linux assumes existence ...
         */
        cc_t c_line;                    /* line discipline */
        cc_t c_cc[NCCS];                /* control characters */
};

And the source string is:
#define INIT_C_CC 
"\003\034\177\025\1\0\0\0\021\023\032\0\022\017\027\026\004\0"

Because of the c_line member, c_cc is not word aligned and memcpy somehow
fails to do a copy there. If I swap c_cc and c_line memcpy does work. I also
tried -mmemcpy switch with the same results. Assembly dump shows proper
pointers being passed (unaligned) to memcpy but it fails. Swapping the
structure members can't be my solution because this must be happening at
many other places.

Is this really coming from GCC? Is there a way to fix this? 

Any hints/pointers will be greatly appreciated.

Dinesh


 


[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux