Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Porting to e500v2 P1010 #119

Open
turneyj opened this issue Oct 22, 2014 · 31 comments
Open

Porting to e500v2 P1010 #119

turneyj opened this issue Oct 22, 2014 · 31 comments

Comments

@turneyj
Copy link

turneyj commented Oct 22, 2014

Greetings. I'll like to join the effort to help port v8 to Freescale. I read through the related issues here and would like to start by cross-compiling a static lib version of v8 for our target (P1010/e500v2), run the d8 shell and observe the SIGKILL illegal instruction. I downloaded build 293 (most recent successful build) from the build server, built and tested the simulated v8ppc on my Intel host. But I'm having a problem cross-compiling for my target. From the build instructions, I exported our target board compiler with:
export CXX=powerpc-linux-g++
export LINK=powerpc-linux-g++
.. which is my $PATH. Then executed the build, which fails with:

/ws/garyj/v8/v8ppcPb: make ppc.release
make[1]: Entering directory `/ws/garyj/v8/v8ppcPb/out'
CXX(target) /ws/garyj/v8/v8ppcPb/out/ppc.release/obj.target/v8_base/src/accessors.o
cc1plus: error: unrecognized command line option "-Wno-missing-field-initializers"
cc1plus: error: unrecognized command line option "-std=gnu++0x"
make[1]: ***

The v8 build instructions recommend 4.6 or above for GCC, but we're currently using version 3.4.5. Now that I'm typing this it seems pretty obvious I need a newer compiler?

Thanks,
Gary

@andrewlow
Copy link
Collaborator

We're using GCC 4.4.6 for our builds of the 3.14 level. The master code is starting to need some of the C++11 features which need later levels of GCC. I know that the Google V8 team is mostly using GCC 4.8, but I believe that 4.6 or 4.7 would be fine.

With enough work you can probably make an older compiler work, but it might be larger than the effort to get a more recent GCC.

The Google V8 team is only interested in accepting 'bleeding edge' (aka: master) level changes back. This makes a lot of sense. However, older versions of V8 are more popular (useful) to have. For example Node 0.10.x uses V8 3.14. Mongo works fine with V8 3.14, but is based on V8 3.16.

Before you start down the path of porting - you may want to decide which level of V8 you want to focus on. There will be different challenges depending on this selection.

V8 tends to make 'breaking' API changes as it moves forward. You can't pick 'master' then expect to be able to slot that code into something that is looking for 3.14 and expect it to work.

@turneyj
Copy link
Author

turneyj commented Dec 4, 2014

Thanks for the advice Andrew. I now have a compatible toolchain to compile v8 for a real e500v2 target. Here's where I am with the e500v2 support, with a few questions embedded....

Using the ppc simulator, as you had also advised, is a nice debug platform for this problem. I added the "UNSUPPORTED()" macro in "simulator-ppc.cc" for the e500v2 unsupported Book E instructions (identified in table 3-2 in the PowerPC e500 Core Family Reference Manual).

Then I built the v8ppc simulator:

make nativesim=true ppc.debug V=1 -j8 snapshot=off

Then ran all of the default node.js tests with:

tools/run-tests.py --no-snap --progress=dots --no-presubmit --arch-and-mode=ppc.debug

There were nine separate unsupported instructions encountered and listed below. All but two (fcmpu and fmadd) have an almost direct replacement in the e500v2's double-precision floating point APU instruction set. Note that these new instructions exist only on the e500v2 and will not be carried forward on other PowerQUICC processors.

The e500v2 "borrows" the general purpose registers for double precision FP operations since it doesn't have dedicated floating point registers. That brings up a question about Lithium register allocation - would there be any clash between the e500v2's use of GPRs for floating point and what the current v8ppc Lithium implementation assumes to be available?

Below are the unsupported Book E instructions encountered in the test run, with what I think are the logical e500v2 replacements.

rD = destination register
rA,rB,rC = operands
crD = condition destination register

Book E..........................e500v2................................Desc.
fmul rD,rA,rB.................efdmul rD,rA,rB...................multiply
fadd rD,rA,rB.................efdadd rD,rA,rB...................add
fsub rD,rA,rB.................efdsub rD,rA,rB....................subtract
fdiv rD,rA,rB..................efddiv rD,rA,rB.....................divide
fmr rD,rA.......................evldd rD,rA...........................move
fcfid rD,rB......................efdcfs rD,rB.........................convert sp to dp
frsp rD,rB.......................efscfd rD,rB.........................convert dp to sp
fcmpu crfD,rA,rB............efdcmeq crfD,rA,rB..............compare*
.......................................efdcmlt crfD,rA,rB
.......................................efdcmgt crfD,rA,rB
fmadd rD,rA,rC,rB..........efdmul rD,rA,rB....................multiply-add**
.......................................efdadd rD,rA,rB

_e500v2 compare has separate instructions for lt, gt, eq compares
*_e500v2 doesn't have a single multiply-add instruction

Next steps:

  1. Implement the new instructions above, starting with the "most compatible" ones. It looks like the opcode generation happens in lithium-codegen-ppc.cc.
  2. Verify the instructions execute successfully on a real e500v2 target.

The best description I've found on lithium so far:
http://wingolog.org/archives/2011/09/05/from-ssa-to-native-code-v8s-lithium-language

Additional pointers and suggestions welcome. I'll update my progress or send out a cry for help soon.

Gary

@debnath15
Copy link

Hi Gary,
Any update on it. We are also trying to run node.js in Freescale P2020 platform, with e500 core and facing the same problem of illegal instruction. Though we don't have much expertise in the low level PPC architecture; still we would like to know if we can be of any help in this activity.
Regards,
Deb

@turneyj
Copy link
Author

turneyj commented Dec 9, 2014

Hi Deb:
At this point most of the work is related to on the lithium PPC/e500v2 machine code emissions. Have you already set up a "simulated" environment so you can run v8ppc on your host workstation? That would be a good first step since some of the development and verification of e500v2 changes can be done on the simulated platform.

When you get the simulated build running you can add the "UNSUPPORTED()" macro in "simulator-ppc.cc" for the e500v2 unsupported Book E instructions (identified in table 3-2 in the PowerPC e500 Core Family Reference Manual). That way you can see when unsupported instructions are encountered when running the node tests, or just running the d8 shell. So when we replace with e500v2 instructions we can verify the "bad" instructions are being replaced.

simulator-ppc.cc will also have to be updated to accommodate the translation of the new e500v2 instructions. Once you get your simulated environment up you could start looking at how to add those new instructions.

Gary

@mhdawson
Copy link
Contributor

mhdawson commented Dec 9, 2014

Here is some info we captured in respect to the work needed to support a new platform for V8 using the v8 simulator.

  1. Building Node.js/v8 to run on a new host platform typically starts by targeting to an existing v8 supported architecture, and relying on the built-in simulator in v8 to emulate the hardware instructions.

For example, in our efforts to get a Node.js running on zLinux, we first compiled by specifying the PPC architecture, which will trigger the PPC simulator to be compiled and enabled in V8.

./configure --debug --dest-cpu=ppc
make
  1. Modifications to the source code will be required to support the compilers options and conventions on your host platform.

A great tip is to refer to github/andrewlow/v8ppc, to compare changes between the corresponding branches of the code from joyent and the IBM add-ons. For example, the following link compares branches v0.10.21-release (joyent) and v0.10.21-release-ppc (IBM add-ons for PPC). This will highlight the changes required to build on PPC.
ibmruntimes/node@v0.10.21-release...v0.10.21-release-ppc#diff-4

  1. Here's a brief summary of the areas of changes required to build on zLinux for Node 0.10.25 with V8 3.14.

A) Makefiles and GYP files
You'll need to customize the Makefile, common.gypi, and configure to recognize your host's macro, and generate the appropriate ARCH, and compiler options. Also, in the IBM Node builds, there is a separate copy of V8 source with IBM value-adds under deps/v8ppc. You'd likely want to update node.gyp to refer to that version of v8, as your other changes in there are likely being pushed to github/andrewlow/v8ppc.

B) Endianness
Node and V8 were originally written for little-endian systems (x86 and ARM). If your host platform is Big Endian, you need to be aware that Typed arrays in javascript and some OpenSSL features will expose the endian differences. Check out deps/openssl/openssl.gyp and src/v8_typed_array_bswap.h to make sure the appropriate endianness macros are defined for your host.

C) More OpenSSL customizations
OpenSSL code requires a few more macros to determine the size of unsigned int/longs for your appropriate host platforms/compilers. Check out deps/openssl/config/opensslconf.h and the platform conditional macros.

D) V8
You'll need to make similar makefile and GYP changes as detailed above for the v8 source. Check out deps/v8ppc/src/globals.h,deps/v8ppc/build/common.gypi

There are some specific customizations you'll need as well. One is the signal context information, which varies from platform to platform (i.e. PPC's ucontext is different that Z's). Check out deps/v8ppc/src/platform-*.cc and deps/v8ppc/src/spaces.cc; add proper support for the break and signal handler code. Another is an atomic operations implementation, where each architecture specifies their own implementation. Check out deps/v8ppc/src/atomicops.h.

E) Tools
At some point when you make the native port, you'll want to run the Node or v8 tests and have it automatically detect your architecture. Update deps/v8ppc/tools/utils.py's GuessArchitecture() function to return something sensible.

There are likely other issues that you might encounter. Just compile your code and see what breaks.

@turneyj
Copy link
Author

turneyj commented Dec 9, 2014

Thanks for the overview on changes needed for a new platform Michael. This is very helpful. Since the e500v2 port will essentially just be addressing double-precision floating point instruction differences between the e500v2 and Power ISA v.2.06 (the current v8ppc code in src/ppc), shouldn't the implementation be similar to what was done for ARM and "CAN_USE_VFP3_INSTRUCTIONS"? In other words - adding the floating point support to the existing src/ppc codegen code rather than creating a wholly new platform (src/e500v2)?

Gary

@debnath15
Copy link

Thanks a lot Gary and Michael, for your detail response. As suggested, will try the simulated mode first.
Regards,
Deb

@mhdawson
Copy link
Contributor

mhdawson commented Dec 9, 2014

I agree what you are doing is different than adding a whole new platform and that extending what's there is more likely the right way to go. I just wanted to provide what info we'd captured from our internal porting efforts

@andrewlow
Copy link
Collaborator

@turneyj Yes - I suspect what you want to do is get to something that works on the e500v2 as quickly as possible, then consider how to refactor it.

The PPC implementation for V8 is unusual in that a single src/ppc directory is used to capture both 32 and 64 bit (and dual endian). This is a little bit counter to the way that Google has structured the code, but it made sense.

The Google team would prefer to see runtime checks vs. #ifdef checks in the code where possible. Those runtime checks would likely be checking a constant and any reasonable C compiler will optimize the check away entirely. The PPC implementation may move to this style, but for now we've gotten to where we are using #ifdef's.

@turneyj You may want to consider working in the open on GitHub here if you haven't already. Fork this repository and point @debnath15 at your work in progress. It's probably not terribly helpful now as I suspect you're crashing pretty much right out of the gate and there is a single bottle neck. However, as things become more stable - it opens the door for some parallel work.

Simulated mode is intended to be built on a Linux Intel platform, and simulates the PPC implementation. You can coax it to build simulated on PPC (look for nativesimulation) but that's an ugly hack and very slow.

Now that you've got the UNSUPPORTED() macro in the simulator, you want to run under gdb and hit that. Figure out the instruction opcode that is causing this - and then put a conditional breakpoint on the emit() to catch the code that generates that opcode. There may be a few false positives, but not many given the instructions you have. Fix the code you find this way (the code emitting the bad instructions) to use your new instructions. This will require adding new instructions to assembler, disassmbler, etc.

@turneyj
Copy link
Author

turneyj commented Dec 11, 2014

Thanks Andrew for the development advice.

I've forked the v8ppc repo to my GitHub copy @ https://github.com/turneyj/v8ppc. I'm looking at the emit() call now with gdb to work on the first e500v2 replacement call, which will be to switch fcfid rD,rB (PowerPC) with efdcfs rD,rB (e500v2). I chose that instruction (convert int to double-precision float) because it's the first one encountered when running most of the node tests or just running the d8 shell, and the e500v2 instruction is the same except for the use of GP registers for floating point operands.

Regarding the e500v2's use of GP registers for double-precision floating point operands instead of the dedicated FP registers - I'm assuming there will be changes to the register definition/allocation model to protect GP registers used for FP operations from being allocated for the existing v8ppc Crankshaft logic? It looks like that's defined towards the top half of assembler-ppc.h. I'll follow through that logic as well but feel free to offer some direction or tips on register allocation. With 32 GP registers it doesn't seem like there should be a contention issue.

Gary

@andrewlow
Copy link
Collaborator

You can probably get away with reserving a couple of the GPR for floating point operations. @mtbrandy might be the best person to comment on PPC register allocation / reservation.

@mtbrandy
Copy link
Collaborator

@andrewlow is correct. Especially on v3.14 -- where the lithium register allocator uses only r3-r8 -- there are plenty of GPRs to reserve for floating point operations. You can do a grep to see which other registers are used in special circumstances, but I believe r17-r19 and r23-r25 are currently unused at that level. The only required change should be to add any you use to the kCalleeSaved mask.

For later versions where the register allocation has been optimized, you can simply reduce the number of registers available to the allocator.

@turneyj
Copy link
Author

turneyj commented Jan 4, 2015

Quick update - I've added e500v2 floating-point instructions to my local copy of v8ppc that replace 5 of the 10 unsupported instructions encountered in the node test runs (the 9 listed earlier in this issue + fctidz). I'm still developing with the simulator build but need to test on an e500v2 target, which I'll try this week.

@turneyj
Copy link
Author

turneyj commented Jan 31, 2015

I need advice on translating the Book E "stfd" instruction to an e500v2 equivalent. The e500v2 candidate is "evstdd".

The general form is:

stdf FRS, d(rA)
evstdd FRS, d(rA)

Both instructions load the contents of floating point register FRS (e500v2 uses a 64 bit GP register) into the effective address which is the sum of immediate value 'd' and the contents of general purpose register rA.

stfd uses a 16 bit immediate value and evstdd uses a 5 bit immediate value multiplied by 8. So the only difference between the two instructions is the precision of the immediate offset (5 bits vs 16). It seems that, when translating to the e500v2 format, an extra instruction would have to first be emitted to modify the contents of the GP register in order that the effective address calculation is the same in both cases. Is that how the code should be generated?

So far this is the only case I've found where the instruction format between Book E and e500v2 is not compatible enough to allow a direct instruction replacement.

Gary

@zeldin
Copy link
Contributor

zeldin commented Jan 31, 2015

These limitations on immediate offsets sound very similar to the ones on the SuperH. What codegen will typically do on that platform is to allocate another base register every time you hit the limit. So in your case you would use rA for offsets 0-248, then compute rB=rA+256 the first time you need that, and then use that register for offsets 256-504. Then a third register for 512-760 etc. Does this make sense? (If you run out of registers the computed registers can be discarded since they can easily be recomputed.)

@turneyj
Copy link
Author

turneyj commented Jan 31, 2015

@zeldin yes thanks - that logic makes sense. Up to this point all of the other e500v2 changes have been through instruction translations in lithium - so I haven't touched hydrogen codegen yet. I'm not familiar with the SuperH CPU, and don't see a reference (by name) to it in the current v8 source. Can you point me to an example? Appreciate the help.

@turneyj
Copy link
Author

turneyj commented Feb 1, 2015

@mtbrandy regarding the register allocation - I was trying to understand the logic of the kCalleeSaved mask, which is set to registers r14 through r31 in my build. I'm tracing the emitted PPC instructions using shell version 3.30.0 and see that general purpose registers 0 through 12 are being accessed during the shell init:

GP register usage by v8 (rA is GP reg in these instructions)
0008097: 0x7cc0fe70:  pri opcode:0x1f rD:06 rA:00 rB:31 rC:25 
0002057: 0x3821fff8:  pri opcode:0x0e rD:01 rA:01 rB:31 rC:31 
0002059: 0x60420000:  pri opcode:0x18 rD:02 rA:02 rB:00 rC:00 
0004138: 0x38c30001:  pri opcode:0x0e rD:06 rA:03 rB:00 rC:00 
0007895: 0x60840c48:  pri opcode:0x18 rD:04 rA:04 rB:01 rC:17 
0007935: 0x2f850000:  pri opcode:0x0b rD:28 rA:05 rB:00 rC:00 
0008158: 0x81660007:  pri opcode:0x20 rD:11 rA:06 rB:00 rC:00 
0004129: 0x7d675a14:  pri opcode:0x1f rD:11 rA:07 rB:11 rC:08 
0004136: 0x39080001:  pri opcode:0x0e rD:08 rA:08 rB:00 rC:00 
0051855: 0x54c9103a:  pri opcode:0x15 rD:06 rA:09 rB:02 rC:00 
0038007: 0x7cca3214:  pri opcode:0x1f rD:06 rA:10 rB:06 rC:08 
0008159: 0x2f8b0000:  pri opcode:0x0b rD:28 rA:11 rB:00 rC:00 
0059553: 0x618cb9fc:  pri opcode:0x18 rD:12 rA:12 rB:23 rC:07 

So I don't immediately see the connection between the mask and the actual GP register usage by v8.

Looking at FP register usage of just the stfd (store floating-point double from FRS) instructions being emitted, FP registers 0 through 13 are accessed:

FP register usage by v8 (FRS is floating point source)
0000183:0xd8010000: **ppc_FP** stfd      FRS:00, rA:01, D:0x000 
0000184:0xd8210008: **ppc_FP** stfd      FRS:01, rA:01, D:0x008 
0000185:0xd8410010: **ppc_FP** stfd      FRS:02, rA:01, D:0x010 
0000186:0xd8610018: **ppc_FP** stfd      FRS:03, rA:01, D:0x018 
0000187:0xd8810020: **ppc_FP** stfd      FRS:04, rA:01, D:0x020 
0000188:0xd8a10028: **ppc_FP** stfd      FRS:05, rA:01, D:0x028 
0000189:0xd8c10030: **ppc_FP** stfd      FRS:06, rA:01, D:0x030 
0000190:0xd8e10038: **ppc_FP** stfd      FRS:07, rA:01, D:0x038 
0000191:0xd9010040: **ppc_FP** stfd      FRS:08, rA:01, D:0x040 
0000192:0xd9210048: **ppc_FP** stfd      FRS:09, rA:01, D:0x048 
0000193:0xd9410050: **ppc_FP** stfd      FRS:10, rA:01, D:0x050 
0000194:0xd9610058: **ppc_FP** stfd      FRS:11, rA:01, D:0x058 
0000195:0xd9810060: **ppc_FP** stfd      FRS:12, rA:01, D:0x060 
0000196:0xd9a10068: **ppc_FP** stfd      FRS:13, rA:01, D:0x068 

Maybe this is just part of a save/restore step between C and JavaScript? Anyway could you provide a bit more help pointing me to the GP and FP register assignments?

Thx - Gary

@zeldin
Copy link
Contributor

zeldin commented Feb 1, 2015

Hi. I was talking in general terms, not about v8 specifically. There is AFAIK no SuperH port.

@mtbrandy
Copy link
Collaborator

mtbrandy commented Feb 2, 2015

@turneyj, my previous comment regarding unused registers in 3.14 is not applicable to more recent versions. See the Register/DoubleRegister classes in src/ppc/assembler.h for the logic that defines which registers are available to the optimizing compiler register allocator. Specifically NumAllocatableRegisters / ToAllocationIndex / FromAllocationIndex.

@turneyj
Copy link
Author

turneyj commented Feb 3, 2015

Thanks @mtbrandy and @zeldin for the clarifications. I have a related question - I've looked briefly at the list of unsupported Power ISA 2.06 instructions on the Freescale e5500 (Table 3-1 of the e5500 Core Reference Manual, Rev. 4). The e5500 and e500mc both have the "standard" PowerPC floating point support (unlike the e500v2), so the v8ppc port for these two cores should be trvial compared to the e500v2. In fact, all of the e500v2's unsupported instructions I've logged on the node tests (on the simulator) are supported on the e500mc and e5500. I would be interested to know from @ctassell (from #118 ), or from anyone whose tried running v8ppc on these two cores, which instructions caused an exception.

@turneyj
Copy link
Author

turneyj commented Feb 3, 2015

I just noticed that fsqrt gets called, so that instruction would definitely except on all of the Freescale cores.

@turneyj
Copy link
Author

turneyj commented Feb 4, 2015

So after adding a filter to the emit() function to log all of the the unsupported e500v2 instructions I built the simulator with:

make ppc.release nativesim=true V=1 snapshot=off

Then ran the node tests with:

./tools/run-tests.py --progress=dots --no-presubmit --arch-and-mode=ppc.release

All of the 16 unsupported instructions logged in the tests or just running the shell are listed in the screen cap below. Items 1 through 11 (except for fmr and fsqrt) have an e500v2 instruction that can be directly added in the assembler, and called in place of the PPC version. I've added those in to a working copy for the assembler, disassembler, simulator, etc. The remaining items will require additional code-gen logic as noted earlier in this thread by @zeldin.

PPC instructions with a '2' superscript are emitted when running the d8 shell. I'd like to get the d8 shell running on a real e500v2 as a first step so will have to add code-gen logic to accommodate the remaining instructions identified with a '2' below.

Comments or suggestions? Also interesting that only fsqrt is unsupported by the e500mc and e5500, at least that's all I could find so far.

e500v2b

@readysteadygo2006
Copy link

Hi,

I'm trying to get node working on ppc(e500v2). I've read through the
threads, I have a grasp of why a compilation which uses the HW FPU
on the e500v2 will not work, however I don't understand why a compilation
which uses -msoft-float woud have a problem.
Can someone explain this?
It would be much appreciated!

@dpasupathi
Copy link

Turneyj,

I tried this on e500mc and I am facing some other issue with v8 crash (ibmruntimes/node#41). I will build a simulator and see what instructions are missing.

@andrewlow
Copy link
Collaborator

V8 is itself a compiler. Thus compiling the code with -msoft-float simply ensures that the C/C++ code that implements V8 doesn't have any hard FPU instructions. However, as V8 is a compiler - there is code in it that writes out hard FPU instructions. The implementation details of V8 are unaffected by the -msoft-float compiler flag.

@readysteadygo2006
Copy link

Hi, Andrew thanks for the reply!

Following on from the initial question, is there a flag within the V8 build env which tells it to generate floating point ops using the soft float api?

If not, have you looked at the arm code for v8, I may be wrong but from my reading the initial version of node for the arm, used the soft floating point.
Does that mean that imply that within the arm tree, they have made change the V8 code to use the soft-api or was it just achieved by allowing the OS to service the hardfp instructions.

Finally I noted that in your git repo, you have a branch 3.14-soft-fpu, have you made the necessary changes here to force use of the soft-fpu api. I noted in your comments you say 9X% of the test pass, is this because there is still some work to do?

Thanks in advance for any help!

@andrewlow
Copy link
Collaborator

is there a flag within the V8 build env which tells it to generate floating point ops using the soft float api?

No. Not yet. Someone needs to write and contribute that code.

The branch 3.14-soft-fpu was an experiment I made that was abandoned.

@turneyj
Copy link
Author

turneyj commented Aug 6, 2015

Apologies if I'm repeating information. To run v8ppc on a e500v2 core you'll have to modify v8ppc itself, so that in cases where any of the unsupported Book E instructions (listed in "Table 3-2 Unsupported Book E Instructions" from PowerPC e500 Core Reference Manual, Rev. 1) are generated/emitted, a compatible e500v2 instruction or instruction logic is used in substitute. The set of e500v2 floating point instructions you can use in replacement are listed in Table 3-7 of the same Ref Manual. There's a table I posted a few comments back showing the list of unsupported instructions encountered when running v8ppc on the simulator, as well as the e500v2 FP instructions that can be used in substitute. In many cases you can simply replace the Book E instructions. I was thinking that for some e500v2 embedded applications it may be possible to start with a version that implements the "straight replacement" instructions and asserts on the others. Then you can provide support for the asserting instructions that are used for your application. Hopefully as more e500v2 users join in the remaining Book E instructions can be addressed. I'm not sure how viable this path is but considering that the e500v2 is used on embedded network appliances the feature support is more narrowly scoped that on a traditional PowerPC server platform.

@dglogik
Copy link

dglogik commented Aug 12, 2015

@turneyj: Reading through the comments and looking at your fork I'm confused at the current state of this effort. Were you ultimately successful in getting it running on e500v2? Our use-case is to run node.js on a Cisco 819 IoX Router which has an e500v2 core.

Dennis Khvostionov

@aperezbios
Copy link

Hey guys, I would like to volunteer remote access to a Freescale based P5020 (e5500-based hardware, POWER ISA 2.06) running Linux 4.2 for anyone who has the time to hack on this. Please contact me directly.

Alex Perez

@barracuda156
Copy link

This will highlight the changes required to build on PPC. ibmruntimes/[email protected]

@mhdawson Unfortunately, the link seems to be dead.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests