[Scummvm-tracker] [ScummVM :: Bugs] #11972: TINSEL: immediate SIGBUS on strict-alignment architectures

ScummVM :: Bugs trac at scummvm.org
Mon Nov 23 18:31:46 UTC 2020


#11972: TINSEL: immediate SIGBUS on strict-alignment architectures
----------------------------------------------+----------------------------
Reporter:  dwatteau                           |      Owner:  (none)
    Type:  defect                             |     Status:  new
Priority:  normal                             |  Component:  Engine: Tinsel
Keywords:  alignment,strict-alignment,sigbus  |       Game:  Discworld
----------------------------------------------+----------------------------
 This is on OpenBSD/loongson 6.8, a MIPS64, little-endian system with
 strict-alignment constraints. This is the same setup I used in #6220.
 sizeof(void *) == 8.

 When unaligned access are done, OpenBSD doesn't intercept them, so it
 usually gives a hard SIGBUS. {{{SCUMM_NEED_ALIGNMENT}}} is defined.

 This is with the {{{dw-dos-cd-demo-en.zip}}} file from the Demos page,
 with ScummVM 2.2.1pre1.

 The game immediately crashes at startup, before anything is ever
 displayed.

 {{{
 Thread 1 received signal SIGBUS, Bus error.
 Tinsel::FadeProcess (coroParam=@0x13990adf10: 0x13990b2800,
 param=0x13990adf3c)
     at engines/tinsel/faders.cpp:109
 109             _ctx->pPalette = (PALETTE *)LockMem(pFade->pPalQ->hPal);

 (gdb) bt full
 #0  Tinsel::FadeProcess (coroParam=@0x13990adf10: 0x13990b2800,
 param=0x13990adf3c) at engines/tinsel/faders.cpp:109
         _ctx = 0x13990b2800
         tmpHolder = {_ctx = @0x13990adf10}
 #1  0x0000000f8982288c in Common::CoroutineScheduler::schedule
 (this=0x144c12f900) at common/coroutines.cpp:232
         pProc = 0x13990adf00
         pNext = <optimized out>
         i = <optimized out>
 #2  0x00000013eeba1060 in Tinsel::TinselEngine::NextGameCycle
 (this=0x13ea7b8200) at engines/tinsel/tinsel.cpp:1032
 No locals.
 #3  0x00000013eeba09bc in Tinsel::TinselEngine::run (this=0x13ea7b8200) at
 engines/tinsel/tinsel.cpp:977
         timerVal = 153809
 #4  0x0000000f8946e954 in runGame (plugin=<optimized out>, system=...,
 edebuglevels=...) at base/main.cpp:292
         dir = {<Common::ArchiveMember> = {_vptr$ArchiveMember =
 0xf89b31bd0 <vtable for Common::FSNode+16>},
           _realNode =
 {<Common::SafeBool<Common::SharedPtr<AbstractFSNode>,
 Common::impl::no_base<Common::SharedPtr<AbstractFSNode> > >> =
 {<Common::impl::no_base<Common::SharedPtr<AbstractFSNode> >> = {<No data
 fields>}, <No data fields>}, _refCount = 0x13f580c840, _deletion =
 0x13f580d4c0, _pointer = 0x1433eb6f80}}
         target = {static npos = 4294967295, static _builtinCapacity = 20,
 _size = 10,
           _str = 0xfffffc8af8 "dw-demo-cd", {_storage = "dw-demo-
 cd\000\000\000\000\000\000\000\000\000",
             _extern = {_refCount = 0x2d6f6d65642d7764, _capacity =
 25699}}}
         err = {_code = Common::kNoError, _desc = {static npos =
 4294967295, static _builtinCapacity = 20,
             _size = 8, _str = 0xfffffc8ad0 "No error", {
               _storage = "No
 error\000\000\000\000\000\000\000\000\070\214\374\377", _extern = {
                 _refCount = 0x726f727265206f4e, _capacity = 0}}}}
         caption = {static npos = 4294967295, static _builtinCapacity = 20,
 _size = 31,
           _str = 0x144f8d5ae0 "Discworld (CD Demo/DOS/English)", {
             _storage = "\200oRb\024\000\000\000
 \000\000\000\377\000\000\000\227\315", <incomplete sequence \324>,
             _extern = {_refCount = 0x1462526f80, _capacity = 32}}}
         tokenizer = {_str = {static npos = 4294967295, static
 _builtinCapacity = 20, _size = 0,
             _str = 0xfffffc8a18 "", {
               _storage = "\000!z\t\000\000\000\000\nO[10\000\000\000\240",
 <incomplete sequence \360\235>,
               _extern = {_refCount = 0x97a2100, _capacity = 828067594}}},
 _delimiters = {static npos = 4294967295,
             static _builtinCapacity = 20, _size = 2, _str = 0xfffffc8a40 "
 ,", {
               _storage = "
 ,\000mmvm\000\212\370\226\211\017\000\000\000\005\v\000", _extern = {
                 _refCount = 0x6d766d6d002c20, _capacity = 2308372618}}},
 _tokenBegin = 0, _tokenEnd = 0}
         previousLanguage = {static npos = 4294967295, static
 _builtinCapacity = 20, _size = 1,
           _str = 0xfffffc8a70 "C", {_storage = "C\000\233\241\023", '\000'
 <repeats 11 times>, "`\243\233\241",
             _extern = {_refCount = 0x13a19b0043, _capacity = 0}}}
         gameKeymaps = {_capacity = 1, _size = 1, _storage = 0x13996bfbc0}
         result = {_code = 21, _desc = {static npos = 4294967295, static
 _builtinCapacity = 20, _size = 1649075712,
             _str = 0x0, {_storage = "
 \000\000\000\017\000\000\000\005\v\000\000\000\000\000\000 s\263\211",
               _extern = {_refCount = 0xf00000020, _capacity = 2821}}}}
         engine = 0x9f5cf63571a28a60
         metaEngine = <optimized out>
         keymapper = 0x13ff5b4f00
 #5  scummvm_main (argc=<optimized out>, argv=<optimized out>) at
 base/main.cpp:561
         result = {_code = 3562524055, _desc = {static npos = 4294967295,
 static _builtinCapacity = 20,
             _size = 2573983264, _str = 0x13a19b9d70 <__isthreaded> "\001",
 {
               _storage =
 "#\000\000\000\000\000\000\000\227\315W\324\361\353\246M\300\322",
 <incomplete sequence \350>, _extern = {_refCount = 0x23, _capacity =
 3562524055}}}}
         chainedGame = {static npos = 4294967295, static _builtinCapacity =
 20, _size = 0, _str = 0xfffffc8a18 "", {
             _storage = "\000!z\t\000\000\000\000\nO[10\000\000\000\240",
 <incomplete sequence \360\235>, _extern = {
               _refCount = 0x97a2100, _capacity = 828067594}}}
         saveSlot = <optimized out>
         plugin = <optimized out>
         specialDebug = {static npos = 4294967295, static _builtinCapacity
 = 20, _size = 0, _str = 0xfffffc8948 "", {
             _storage = "\000!z\t\000\000\000\000\nO[10\000\000\000\240",
 <incomplete sequence \360\235>, _extern = {
               _refCount = 0x97a2100, _capacity = 828067594}}}
         command = {static npos = 4294967295, static _builtinCapacity = 20,
 _size = 10,
           _str = 0xfffffc8920 "dw-demo-cd", {_storage = "dw-demo-
 cd\000\235\023\000\000\000\000$\302\234",
             _extern = {_refCount = 0x2d6f6d65642d7764, _capacity =
 2634048611}}}
         settings = {_nodePool = {<Common::FixedSizeMemoryPool<80, 10>> =
 {<Common::MemoryPool> = {_chunkSize = 80,
                 _pages = {_capacity = 0, _size = 0, _storage = 0x0}, _next
 = 0xfffffc85b0, _chunksPerPage = 8},
               _storage =
 "\000\206\374\377\377\000\000\000X\021\233\241\023\000\000\000`P\215O\024\000\000\000؄\353\334\023",
 '\000' <repeats 19 times>,
 "\020\231j\027\024\000\000\000`\243\233\241\023\000\000\000\204\016\225\241\023\000\000\000\\\016\225\241\023\000\000\000P\206\374\377\377\000\000\000P'\272\036\024\000\000\000\240\024\313\311\023\000\000\000\227\315W\324\361\353\246M@\324Jb\024\000\000\000p\235\233\241\023\000\000\000#\000\000\000\000\000\000\000X\021\233\241\023\000\000\000`P\215O\024\000\000\000؄\353\334\023\000\000\000\240\206\374\377\377\000\000\000\210\207\374\377\377\000\000\000`\243\233\241\023\000\000\000\020\207\374\377\377\000\000\000`\243\233\241\023\000\000\000\214\034"...},
 <No data fields>}, _defaultVal = {static npos = 4294967295, static
 _builtinCapacity = 20, _size = 0,
             _str = 0xfffffc88e0 "", {_storage =
 "\000s^O\024\000\000\000\274E[O\024\000\000\000\000\000\000",
               _extern = {_refCount = 0x144f5e7300, _capacity =
 1331381692}}}, _storage = 0x13ae182900, _mask = 15,
           _size = 0, _deleted = 0, _hash = {<No data fields>}, _equal =
 {<No data fields>}}
         res = {_code = Common::kNoError, _desc = {static npos =
 4294967295, static _builtinCapacity = 20,
             _size = 8, _str = 0xfffffc8570 "No error", {_storage = "No
 error\000rror\000\000\000\b\206\374\377",
               _extern = {_refCount = 0x726f727265206f4e, _capacity =
 1869771264}}}}
         system = <optimized out>
 #6  0x0000000f89468dc8 in main (argc=-361004544, argv=0x9f5cf63571a28a60)
     at backends/platform/sdl/posix/posix-main.cpp:45
         res = <optimized out>

 (gdb) where
 #0  Tinsel::FadeProcess (coroParam=@0x13990adf10: 0x13990b2800,
 param=0x13990adf3c) at engines/tinsel/faders.cpp:109
 #1  0x0000000f8982288c in Common::CoroutineScheduler::schedule
 (this=0x144c12f900) at common/coroutines.cpp:232
 #2  0x00000013eeba1060 in Tinsel::TinselEngine::NextGameCycle
 (this=0x13ea7b8200) at engines/tinsel/tinsel.cpp:1032
 #3  0x00000013eeba09bc in Tinsel::TinselEngine::run (this=0x13ea7b8200) at
 engines/tinsel/tinsel.cpp:977
 #4  0x0000000f8946e954 in runGame (plugin=<optimized out>, system=...,
 edebuglevels=...) at base/main.cpp:292
 #5  scummvm_main (argc=<optimized out>, argv=<optimized out>) at
 base/main.cpp:561
 #6  0x0000000f89468dc8 in main (argc=-361004544, argv=0x9f5cf63571a28a60)
     at backends/platform/sdl/posix/posix-main.cpp:45

 (gdb) list
 104             if (TinselV2)
 105                     // Note that this palette is being faded
 106                     FadingPalette(pFade->pPalQ, true);
 107
 108             // get pointer to palette - reduce pointer indirection a
 bit
 109             _ctx->pPalette = (PALETTE *)LockMem(pFade->pPalQ->hPal);
 110
 111             for (_ctx->pColMult = pFade->pColorMultTable;
 *_ctx->pColMult >= 0; _ctx->pColMult++) {
 112                     // go through all multipliers in table - until a
 negative entry
 113
 }}}
-- 
Ticket URL: <https://bugs.scummvm.org/ticket/11972>
ScummVM :: Bugs <https://bugs.scummvm.org>
ScummVM


More information about the Scummvm-tracker mailing list