public void boot (VM_Processor st, VM_ImmortalHeap immortalHeap) {
public void boot (VM_Processor st, VM_ImmortalHeap immortalHeap) throws VM_PragmaInterruptible {
  public void boot (VM_Processor st, VM_ImmortalHeap immortalHeap) {    blocks = init_blocks;    // Now set the beginning address of each block into each VM_BlockControl    // Note that init_blocks is in the boot image, but heap pages are controlled by it    for (int i=0; i < GC_SIZES; i++)  {      init_blocks[i].baseAddr = start.add(i * GC_BLOCKSIZE);      build_list_for_new_block(init_blocks[i], st.sizes[i]);    }    // Now allocate the blocks array - which will be used to allocate blocks to sizes        num_blocks = size / GC_BLOCKSIZE;    blocks = (VM_BlockControl[]) immortalHeap.allocateArray(VM_BlockControl.ARRAY_TYPE, num_blocks);    // index for highest page in heap    highest_block = num_blocks -1;    blocks_available = highest_block - GC_SIZES;   // available to allocate      // Now fill in blocks with values from blocks_init    for (int i = 0; i < GC_SIZES; i++) {      // NOTE: if blocks are identified by index, st.sizes[] need not be changed; if      // blocks are identified by address, then updates st.sizes[0-GC_SIZES] here      blocks[i] = init_blocks[i];    }    // At this point we have assigned the first GC_SIZES blocks,     // 1 per, to each GC_SIZES bin    // and are prepared to allocate from such, or from large object space:    // VM_BlockControl blocks are not used to manage large objects -     // they are unavailable by special logic for allocation of small objs    //    first_freeblock = GC_SIZES;   // next to be allocated    init_blocks    = null;        // these are currently live through blocks    // Now allocate the rest of the VM_BlockControls    for (int i = GC_SIZES; i < num_blocks; i++) {      VM_BlockControl bc = (VM_BlockControl) immortalHeap.allocateScalar(VM_BlockControl.TYPE);      blocks[i] = bc;      bc.baseAddr = start.add(i * GC_BLOCKSIZE);       bc.nextblock = (i == num_blocks - 1) ? OUT_OF_BLOCKS : i + 1;    }      // statistics arrays for blocks usage    if (REPORT_BLOCKS) {      total = new int[GC_SIZES];      accum = new int[GC_SIZES];    }  }