Treat additional region types as available memory
In order for the ia64 loader to find the memory map area occupied by the
kernel (a.k.a. ram_end), it needs to consider additioanl region types
which also denote available memory (after the call to ExitBootServices).
These are: EfiLoaderCode, EfiLoaderData, EfiBootServicesCode and
EfiBootServicesData. Without this the memory map is incomplete and
contains a big hole that covers the entire area of the loaded image. The
loader then cannot find ram_end and the boot fails. The memory map also
needs to be compacted so that adjacent regions of the same type are not
too small for a successful boot.