I adjusted the code a bit more to look like the 16 coding including restoring some very useful comments that had been lost, and pushed.
Thanks very much to Alexander and Noah for (independently) chasing this down and reporting, testing etc, and Alvaro and Robert for review comments. (Passing thought: it's a bit weird that we need to zero pages at all before restoring FPIs or initialising them. Perhaps there is some way to defer marking the buffer valid until after the caller gets a chance to initialise? Or something like that...)