User Tools

Site Tools


wswan:bugs

Known bugs and limitations

C compiler (gcc-ia16)

  • In general, if you run into a compiler error or miscompilation, try annotating the function with __attribute__((noinline, optimize("-O0"))) as a workaround.
  • gcc-ia16's handling of far pointers is considered experimental. Caveat emptor.
  • gcc-ia16's handling of DS != SS (wwitch target) is considered experimental. It does work for simple code, but complex pointer operations may lead to bugs. As above, caveat emptor.
  • The optimization levels -O0, -O2 and -Os are most stable (roughly in that order).

Miscompilations involving far function pointers

In some cases, when calling pointers from arrays of far function pointers in optimization modes >= -O1, the code will be miscompiled. This is a known issue, with no ETA for a fix.

One can work around this by annotating the affected function to be compiled without optimizations. In particular, one can create a separate function that only acts as a wrapper for the function call:

__attribute__((noinline, optimize("-O0"))) // https://github.com/tkchia/gcc-ia16/issues/120
void call_to_my_function_table(uint8_t index) {
    my_function_table[index]();
}

Far pointers to near variables

struct a { void __far *ptr; };
struct b { int value; };
struct b instance_b;

// This doesn't work - compiler limitation
const struct a var_ptr = { &instance_b };

// ... but this does
const struct a var_ptr_fixed = { __builtin_ia16_static_far_cast(&instance_b) };

// This doesn't work - __builtin_ia16_static_far_cast only works on variable definitions
const struct a field_ptr = { __builtin_ia16_static_far_cast(&instance_b.value) };

// ... but this does
const struct a field_ptr_fixed = { &(((struct b __far *)__builtin_ia16_static_far_cast(&instance_b))->value) };

wswan/bootfriend: defining interrupt handlers

The wswan/bootfriend target does not support relocation; as such, far functions (which interrupt handlers have to be) cannot be created in sections other than the default text section. This can be achieved by either:

  • using __attribute__(section(".text")) on the function,
  • building with -fno-function-sections in CFLAGS; however, this disables per-function garbage collection and may increase file size as a result.

The wwitch target also prohibits defining far functions outside of the default text section, but this only becomes an issue if the FreyaBIOS system APIs (sys_interrupt_set_hook, sys_interrupt_reset_hook) are not used, as those wrap regular C functions.

wswan/bugs.txt · Last modified: by asie