[U-Boot] Location of jump table in global_data structure

Peter Tyser ptyser at xes-inc.com
Tue Aug 19 16:35:35 CEST 2008


Hello,
I've noticed that the jump table pointer (**jt) in the global_data
structure is always the last field in the structure.  When standalone
applications are compiled, they hard code the jump table pointer offset
into the global_data structure.  When new versions of U-Boot come out
which add/remove a field from the global_data structure, old standalone
applications will no longer work as the location of the jt pointer has
changed.  I've noticed this issue when updating U-Boot from 1.3.0 to
1.3.4.

As an example from include/asm-avr32/global_data.h:

FROM VERSION 1.3.4:
typedef struct  global_data {
        bd_t            *bd;
        unsigned long   flags;
        unsigned long   baudrate;
        unsigned long   stack_end;      /* highest stack address */
        unsigned long   have_console;   /* serial_init() was called */
        unsigned long   reloc_off;      /* Relocation Offset */
        unsigned long   env_addr;       /* Address of env struct */
        unsigned long   env_valid;      /* Checksum of env valid? */
        unsigned long   cpu_hz;         /* cpu core clock frequency */
        void            **jt;           /* jump table */
} gd_t;

FROM FUTURE VERSION 1.3.5:
typedef struct  global_data {
        bd_t            *bd;
        unsigned long   flags;
        unsigned long   baudrate;
        unsigned long   stack_end;      /* highest stack address */
        unsigned long   have_console;   /* serial_init() was called */
        unsigned long   reloc_off;      /* Relocation Offset */
        unsigned long   env_addr;       /* Address of env struct */
        unsigned long   env_valid;      /* Checksum of env valid? */
        unsigned long   cpu_hz;         /* cpu core clock frequency */
====>   unsigned long	fancy_value;	/* FANCY NEW VALUE ADDED!! */
        void            **jt;           /* jump table */
} gd_t;


Adding fancy_value to global_data would break any standalone
applications compiled for 1.3.4 since the app is now using fancy_value
as its jump table pointer (where jt used to be).


One possible fix would be to move **jt to the 2nd item in global_data to
prevent it moving in the future.  This would break everyone's current
standalone apps however:) eg:
typedef struct  global_data {
        bd_t            *bd;
====>   void            **jt;           /* jump table */
        unsigned long   flags;
        unsigned long   baudrate;
        unsigned long   stack_end;      /* highest stack address */
        unsigned long   have_console;   /* serial_init() was called */
        unsigned long   reloc_off;      /* Relocation Offset */
        unsigned long   env_addr;       /* Address of env struct */
        unsigned long   env_valid;      /* Checksum of env valid? */
        unsigned long   cpu_hz;         /* cpu core clock frequency */
} gd_t;


Another option would be to mandate that new fields only be added after
the **jt field to prevent it from moving, although this would be hard to
enforce and seems a bit hokey.


Do others view this issue as a problem that should be fixed?


If others feel that the jt pointer should be moved to the 2nd item in
global_data structure let me know and I can generate a patch.

Best,
Peter




More information about the U-Boot mailing list