X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=sect.c;fp=sect.c;h=5d7fb4ad22b31b87efa3784c897533f63a17519d;hp=2269403e2b68e3426e843a9cb0569d5aa3b58637;hb=261f8d9198c4235bcdced4403ba391553e6bd0d1;hpb=ae528e6fdb8bd5c41ed9690bec03402ccbb4ecae diff --git a/sect.c b/sect.c index 2269403..5d7fb4a 100644 --- a/sect.c +++ b/sect.c @@ -290,7 +290,7 @@ int AddFixup(uint32_t attr, uint32_t loc, TOKEN * fexpr) DEBUG { printf("AddFixup: sno=%u, l#=%u, attr=$%X, loc=$%X, expr=%p, sym=%p, org=$%X\n", cursect, fixup->lineno, fixup->attr, fixup->loc, (void *)fixup->expr, (void *)fixup->symbol, fixup->orgaddr); if (symbol != NULL) - printf(" name: %s, value: $lX\n", symbol->sname, symbol->svalue); + printf(" name: %s, value: $%lX\n", symbol->sname, symbol->svalue); } return 0; @@ -679,9 +679,8 @@ int ResolveFixups(int sno) break; - // Fixup LONG forward references; - // the long could be unaligned in the section buffer, so be careful - // (again). + // Fixup LONG forward references; the long could be unaligned in the + // section buffer, so be careful (again). case FU_LONG: flags = MLONG; @@ -702,6 +701,44 @@ int ResolveFixups(int sno) SETBE32(locp, 0, eval); break; + // Fixup QUAD forward references + // Need to add flags for OP uses... [DONE] + case FU_QUAD: + // If the symbol is undefined, make sure to pass the symbol in + // to the MarkRelocatable() function. +/* if (!(eattr & DEFINED)) + MarkRelocatable(sno, loc, 0, MQUAD, esym); + else if (tdb) + MarkRelocatable(sno, loc, tdb, MQUAD, NULL);//*/ + + if (w & FU_OBJLINK) + { + uint64_t quad = GETBE64(locp, 0); + uint64_t addr = eval; + + if (fup->orgaddr) + addr = fup->orgaddr; + +//printf("sect.c: FU_OBJLINK quad=%016lX, addr=%016lX ", quad, addr); + + eval = (quad & 0xFFFFFC0000FFFFFFLL) | ((addr & 0x3FFFF8) << 21); +//printf("(%016lX)\n", eval); + } + else if (w & FU_OBJDATA) + { + uint64_t quad = GETBE64(locp, 0); + uint64_t addr = eval; + + if (fup->orgaddr) + addr = fup->orgaddr; + + eval = (quad & 0x000007FFFFFFFFFFLL) | ((addr & 0xFFFFF8) << 40); + } + + SETBE64(locp, 0, eval); +//printf("(%016lX)\n", eval); + break; + // Fixup a 3-bit "QUICK" reference in bits 9..1 // (range of 1..8) in a word. [Really bits 1..3 in a byte.] case FU_QUICK: