Hi all, I'm back at looking why my powerpc64 work didn't work out, and I think I made some progress (I think). For one I determined that there was no problem jumping to compiled code from the asm, which I thought before was a problem.
I compiled the kernel with gcc crosscompiler in the old aimee vm that I had set up, I feel more comfortable with this, but I don't know why exactly. aimee now runs on my MBP in vmware, that's another change I did. This way I can poke at it on weekends. The OS is still 6.4-current from last year. Instead of using my G5 I'm using qemu with its built-in monitor to debug the registers, this works faster and quieter IMO, I'm using the floating-point registers as an indicator how far I got in the code (instruction I use is (lis %21, 1; lfsux %fX, %r21, %r21; <-- I know life sucks, the console is not initialized at this point so I can't printf). And right now I'm still on ofwreal.S, which anyone would agree with me is hard ASM code. I started last week not knowing a lot about PowerPC asm, I try though. I reworked ofwreal.S in that I pulled out the macppc version and had it run through, and it worked and got me further into pmap.c in execution but the openfirmware stuff was so mangled it couldn't even figure out how much physmem it had, big stopper there. So I went back to redo ofwreal.S, it dawned on me yesterday that fwcall is supposed to be .long size as it's an instruction holder. I made a little progress from then on but am stuck on a big thing (I think). When I executed the bsd kernel, last, it gets stuck trying to store to some location offset from register 2 (a book I recently got says this is the TOC pointer, an ELF thing). And here is my question about this TOC (table of contents), how would I best define an area for it? Or how is this done? As far as the FreeBSD code is concerned they set up a __tocbase area at locore64.S but then they do relocations, which I am unable to do in the short term. I'M pretty much confused by now. I'll show you where in the qemu emulator the execution flow stops: 00000000001b7a2c <OF_finddevice>: 1b7a2c: 3c 40 00 84 lis r2,132 1b7a30: 38 42 73 00 addi r2,r2,29440 1b7a34: 7c 08 02 a6 mflr r0 1b7a38: fb e1 ff f8 std r31,-8(r1) 1b7a3c: 7c 7f 1b 78 mr r31,r3 1b7a40: f8 01 00 10 std r0,16(r1) 1b7a44: f8 21 ff d1 stdu r1,-48(r1) 1b7a48: 48 34 25 59 bl 4f9fa0 <ofw_stack> 1b7a4c: 60 00 00 00 nop 1b7a50: 60 00 00 00 nop 1b7a54: 60 00 00 00 nop 1b7a58: 38 62 fd 60 addi r3,r2,-672 1b7a5c: fb e2 fd 70 std r31,-656(r2) <---- here 1b7a60: 48 34 25 11 bl 4f9f70 <openfirmware> 1b7a64: 60 00 00 00 nop 1b7a68: 2f 83 ff ff cmpwi cr7,r3,-1 1b7a6c: 41 9e 00 0c beq- cr7,1b7a78 <OF_finddevice+0x4c> 1b7a70: 60 00 00 00 nop 1b7a74: e8 62 fd 7a lwa r3,-648(r2) 1b7a78: 38 21 00 30 addi r1,r1,48 I think I got ofw_stack right (but not sure) at least it went through it. But now it tries to access register r2 which is not defined in this. Here is a register dump: ----> (qemu) info registers NIP 00000000fff096bc LR 00000000fff096bc CTR 00000000fff0e7e4 XER 000000000000 0000 CPU#0 MSR 0000000000001000 HID0 0000000060000000 HF 0000000000000000 iidx 3 didx 3 TB 00000000 2549640032 DECR 1745327192 GPR00 00000000fff096bc 0000000000000ff0 0000000000000000 0000000000000029 <- r2 GPR04 0000000000000003 0000000000000000 0000000000000034 0000000000000020 GPR08 0000000000000000 0000000000000000 0000000000000001 0000000000000ff0 GPR12 0000000048800402 00000000fffbcce0 0000000000000000 0000000000030000 GPR16 0000000000000001 0000000000030000 0000000000000000 0000000000030000 GPR20 0000000000003030 0000000000000002 0000000000031f1f 00000000fffbcf08 GPR24 0000000000035be0 0000000000031f68 00000000000351e0 00000000fffbcd0f GPR28 000000000000002f 0000000000100a50 00000000fffbcce0 00000000ffddabe0 CR 28800402 [ E L L - - G - E ] RES ffffffffffffffff FPR00 0000000000000000 0000000000000000 0000000000000000 0000000000000000 FPR04 0000000000000000 0000000000000000 0000000000000000 0000000000000000 FPR08 0000000000000000 0000000000000000 0000000000000000 0000000000000000 FPR12 0000000000000000 0000000000000000 0000000000000000 0000000000000000 FPR16 0000000000000000 0000000000000000 0000000000000000 0000000000000000 FPR20 37e00a5000000000 0000000000000000 0000000000000000 0000000000000000 FPR24 3b83000200000000 0000000000000000 0000000000000000 0000000000000000 FPR28 0000000000000000 0000000000000000 0000000000000000 0000000000000000 FPSCR 0000000000000000 SRR0 00000000001b7a5c SRR1 8000000000003030 PVR 00000000003c0301 VRSAVE 000 0000000000000 SPRG0 000000007fe00000 SPRG1 00000000fffffc70 SPRG2 0000000044482004 SPRG3 000 0000000000000 SPRG4 0000000000000000 SPRG5 0000000000000000 SPRG6 0000000000000000 SPRG7 000 0000000000000 SDR1 000000007fe00000 DAR fffffffffffffd70 DSISR 0000000042000000 (qemu) quit <------- SRR0 shows the address I dumped above in the objdump, SRR1 shows the MSR at the time of execution (I think). Now, I'm poking away at this thing, I can't say it will ever boot and I see the pretty OpenBSD dmesg before a panic, but I'm drawn back at this work and it's 6 months later from when I left it off. I think using qemu is a good decision as it's faster, uses less power until the work can be put on the real machine. I'm looking for guidance I think. As a tid-bit I would say take a look at ofwreal.S in maccpc I'll dump you the code snippet (in function ofw_stack): ---> addi %r3,%r1,%r8 addi %r1,%r4,-16 subi %r5,%r5,%r8 subi %r4,%r4,%r8 <---- I think that's wrong, register 8 is mtmsr'ed at the top of that and not modified. What has register 4 and 5 have to do with MSR? Shouldn't this mean just 8 and not %r8? This is also an area I struggled with in 64-bit mode. Best regards, -peter