Additional to above - the code I'm using in C#
[DllImport("ceddk.dll", EntryPoint = "READ_REGISTER_ULONG")]
//ULONG READ_REGISTER_ULONG(__in volatile const ULONG * const Register);
public static extern uint read_reg_ulong(uint pRegister);
...
//physical address = 0x48030000+0x12C = (MCSPI_CH0CONF McSPI channel 0 configuration register)
//from the SPI driver the virtual address = 0x9003012C
uint reg_addr = 0x9003012C;
uint reg_contents = read_reg_ulong(reg_addr);
//reg_contents now has correct data that was written to MCSPI_CH0CONF