summaryrefslogtreecommitdiff
path: root/utils/ql/obj.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/ql/obj.c')
-rw-r--r--utils/ql/obj.c53
1 files changed, 44 insertions, 9 deletions
diff --git a/utils/ql/obj.c b/utils/ql/obj.c
index adff8dfd..8026a0de 100644
--- a/utils/ql/obj.c
+++ b/utils/ql/obj.c
@@ -17,10 +17,13 @@ char *thestring = "power";
/*
* -H0 -T0x200000 -R0 is boot
* -H1 -T0x100000 -R4 is Be boot
- * -H2 -T4128 -R4096 is plan9 format
+ * -H2 -T0x100020 -R0x100000 is plan9 format (was -T4128 -R4096)
* -H3 -T0x02010000 -D0x00001000 is raw
* -H4 -T0x1000200 -D0x20000e00 -R4 is aix xcoff executable
* -H5 -T0x80010000 -t0x10000 ELF, phys = 10000, vaddr = 0x8001...
+ * appropriate for blue gene (bg/l anyway)
+ * -H6 -T0xfffe2100 -R4 ELF, phys = vaddr = 0xfffe2100
+ * appropriate for virtex 4 boot
*/
static int
@@ -150,11 +153,11 @@ main(int argc, char *argv[])
case 2: /* plan 9 */
HEADR = 32L;
if(INITTEXT == -1)
- INITTEXT = 4128;
+ INITTEXT = 0x100020;
if(INITDAT == -1)
INITDAT = 0;
if(INITRND == -1)
- INITRND = 4096;
+ INITRND = 0x100000;
break;
case 3: /* raw */
HEADR = 0;
@@ -177,6 +180,7 @@ main(int argc, char *argv[])
INITRND = 0;
break;
case 5: /* elf executable */
+ case 6: /* elf for virtex 4 */
HEADR = rnd(52L+3*32L, 16);
if(INITTEXT == -1)
INITTEXT = 0x00400000L+HEADR;
@@ -1220,16 +1224,24 @@ void
doprof2(void)
{
Sym *s2, *s4;
- Prog *p, *q, *ps2, *ps4;
+ Prog *p, *q, *q2, *ps2, *ps4;
if(debug['v'])
Bprint(&bso, "%5.2f profile 2\n", cputime());
Bflush(&bso);
- s2 = lookup("_profin", 0);
- s4 = lookup("_profout", 0);
+ if(debug['e']){
+ s2 = lookup("_tracein", 0);
+ s4 = lookup("_traceout", 0);
+ }else{
+ s2 = lookup("_profin", 0);
+ s4 = lookup("_profout", 0);
+ }
if(s2->type != STEXT || s4->type != STEXT) {
- diag("_profin/_profout not defined");
+ if(debug['e'])
+ diag("_tracein/_traceout not defined %d %d", s2->type, s4->type);
+ else
+ diag("_profin/_profout not defined");
return;
}
@@ -1270,7 +1282,20 @@ doprof2(void)
q->line = p->line;
q->pc = p->pc;
q->link = p->link;
- p->link = q;
+ if(debug['e']){ /* embedded tracing */
+ q2 = prg();
+ p->link = q2;
+ q2->link = q;
+
+ q2->line = p->line;
+ q2->pc = p->pc;
+
+ q2->as = ABR;
+ q2->to.type = D_BRANCH;
+ q2->to.sym = p->to.sym;
+ q2->cond = q->link;
+ }else
+ p->link = q;
p = q;
p->as = ABL;
p->to.type = D_BRANCH;
@@ -1280,7 +1305,17 @@ doprof2(void)
continue;
}
if(p->as == ARETURN) {
-
+ /*
+ * RETURN (default)
+ */
+ if(debug['e']){ /* embedded tracing */
+ q = prg();
+ q->line = p->line;
+ q->pc = p->pc;
+ q->link = p->link;
+ p->link = q;
+ p = q;
+ }
/*
* RETURN
*/