#define mk_pmd(page,prot)     pfn_pmd(page_to_pfn(page),prot)
  
  #define pmd_page(pmd)           pfn_to_page(__phys_to_pfn(pmd_val(pmd) & PHYS_MASK))
+ #define pud_pfn(pud)          (((pud_val(pud) & PUD_MASK) & PHYS_MASK) >> PAGE_SHIFT)
  
 -#define set_pmd_at(mm, addr, pmdp, pmd)       set_pmd(pmdp, pmd)
 +#define set_pmd_at(mm, addr, pmdp, pmd)       set_pte_at(mm, addr, (pte_t *)pmdp, pmd_pte(pmd))
  
  static inline int has_transparent_hugepage(void)
  {
 
  #define TIF_SIGPENDING                0
  #define TIF_NEED_RESCHED      1
  #define TIF_NOTIFY_RESUME     2       /* callback before returning to user */
+ #define TIF_FOREIGN_FPSTATE   3       /* CPU's FP state is not current's */
  #define TIF_SYSCALL_TRACE     8
 -#define TIF_POLLING_NRFLAG    16
+ #define TIF_SYSCALL_AUDIT     9
+ #define TIF_SYSCALL_TRACEPOINT        10
+ #define TIF_SECCOMP           11
  #define TIF_MEMDIE            18      /* is terminating due to OOM killer */
  #define TIF_FREEZE            19
  #define TIF_RESTORE_SIGMASK   20
 
  
  CPPFLAGS_vmlinux.lds  := -DTEXT_OFFSET=$(TEXT_OFFSET)
  AFLAGS_head.o         := -DTEXT_OFFSET=$(TEXT_OFFSET)
 +CFLAGS_efi-stub.o     := -DTEXT_OFFSET=$(TEXT_OFFSET) \
 +                         -I$(src)/../../../scripts/dtc/libfdt
  
+ CFLAGS_REMOVE_ftrace.o = -pg
+ CFLAGS_REMOVE_insn.o = -pg
+ CFLAGS_REMOVE_return_address.o = -pg
+ 
  # Object file lists.
  arm64-obj-y           := cputable.o debug-monitors.o entry.o irq.o fpsimd.o   \
                           entry-fpsimd.o process.o ptrace.o setup.o signal.o   \
 
  {
        pmd_t *pmd;
        unsigned long next;
-               prot_sect = PMD_TYPE_SECT | PMD_SECT_AF |
-                           PMD_ATTRINDX(MT_DEVICE_nGnRE);
 +      pmdval_t prot_sect;
 +      pgprot_t prot_pte;
 +
 +      if (map_io) {
-               prot_sect = prot_sect_kernel;
++              prot_sect = PROT_SECT_DEVICE_nGnRE;
 +              prot_pte = __pgprot(PROT_DEVICE_nGnRE);
 +      } else {
++              prot_sect = PROT_SECT_NORMAL_EXEC;
 +              prot_pte = PAGE_KERNEL_EXEC;
 +      }
  
        /*
         * Check for initial section mappings in the pgd/pud and remove them.
  
        do {
                next = pud_addr_end(addr, end);
-               alloc_init_pmd(pud, addr, next, phys, map_io);
+ 
+               /*
+                * For 4K granule only, attempt to put down a 1GB block
+                */
 -              if ((PAGE_SHIFT == 12) &&
++              if (!map_io && (PAGE_SHIFT == 12) &&
+                   ((addr | next | phys) & ~PUD_MASK) == 0) {
+                       pud_t old_pud = *pud;
+                       set_pud(pud, __pud(phys | PROT_SECT_NORMAL_EXEC));
+ 
+                       /*
+                        * If we have an old value for a pud, it will
+                        * be pointing to a pmd table that we no longer
+                        * need (from swapper_pg_dir).
+                        *
+                        * Look up the old pmd table and free it.
+                        */
+                       if (!pud_none(old_pud)) {
+                               phys_addr_t table = __pa(pmd_offset(&old_pud, 0));
+                               memblock_free(table, PAGE_SIZE);
+                               flush_tlb_all();
+                       }
+               } else {
 -                      alloc_init_pmd(pud, addr, next, phys);
++                      alloc_init_pmd(pud, addr, next, phys, map_io);
+               }
                phys += next - addr;
        } while (pud++, addr = next, addr != end);
  }