Hi Wolfgang On Tue, Aug 30, 2011 at 3:17 PM, Wolfgang Denk <[email protected]> wrote: > Dear Graeme Russ, > > In message > <CALButCJF1p+60WOLtiJqhcAed-71VxmP2mBqY2wdNURPk5=q...@mail.gmail.com> you > wrote: >> >> >> > it's fairly easy as well: >> >> > #define CIRC_BUF_IDX(idx) ((idx) & (CONFIG_SYS_TMP_CON_BUF_SZ-1)) >> >> > buffer[CIRC_BUF_IDX(gd->conf_buf_idx++)] = c; >> >> >> >> But does that work for non power-of-two buffer sizes... >> > >> > no, but not that big of a deal. so you get limited to the last 1KiB, 4KiB, >> > 8KiB, 16KiB, etc... amount of data. >> >> Until someone doesn't read the documentation and figures they can only >> squeeze 200 bytes out of their L1 cache after making room for gd and stack >> and then tries to print 201 bytes of debug info and trashes either the >> stack or gd and then things start to get a lot weirder than simply having >> their early debug messgaes clipped... >> >> To be safe, CONFIG_SYS_TMP_CON_BUF_SZ would need to be checked for ^2 size >> and now we only get 128 bytes rather than 200 :( - Better to add another >> long in gd and get 196 > > Grrrgh. > > If you want to support arbitrary buffer sizes, then just use > > #define CIRC_BUF_IDX(idx) ((idx) % CONFIG_SYS_TMP_CON_BUF_SZ)
I know, but I was concerned that you wouldn't like the use of modulo arithmetic for every putc() - But I suppose thats cheaper than a compare plus branch... If you prefer modulo over the 'must be a power of two' restriction, then I am happy to do it that way instead Regards, Graeme _______________________________________________ U-Boot mailing list [email protected] http://lists.denx.de/mailman/listinfo/u-boot

