#endif
                .endm
 
+               /*
+                * Debug kernel copy by printing the memory addresses involved
+                */
+               .macro dbgkc, begin, end, cbegin, cend
+#ifdef DEBUG
+               kputc   #'\n'
+               kputc   #'C'
+               kputc   #':'
+               kputc   #'0'
+               kputc   #'x'
+               kphex   \begin, 8       /* Start of compressed kernel */
+               kputc   #'-'
+               kputc   #'0'
+               kputc   #'x'
+               kphex   \end, 8         /* End of compressed kernel */
+               kputc   #'-'
+               kputc   #'>'
+               kputc   #'0'
+               kputc   #'x'
+               kphex   \cbegin, 8      /* Start of kernel copy */
+               kputc   #'-'
+               kputc   #'0'
+               kputc   #'x'
+               kphex   \cend, 8        /* End of kernel copy */
+               kputc   #'\n'
+               kputc   #'\r'
+#endif
+               .endm
+
                .section ".start", #alloc, #execinstr
 /*
  * sort out different calling conventions
                add     r6, r9, r5
                add     r9, r9, r10
 
+#ifdef DEBUG
+               sub     r10, r6, r5
+               sub     r10, r9, r10
+               /*
+                * We are about to copy the kernel to a new memory area.
+                * The boundaries of the new memory area can be found in
+                * r10 and r9, whilst r5 and r6 contain the boundaries
+                * of the memory we are going to copy.
+                * Calling dbgkc will help with the printing of this
+                * information.
+                */
+               dbgkc   r5, r6, r10, r9
+#endif
+
 1:             ldmdb   r6!, {r0 - r3, r10 - r12, lr}
                cmp     r6, r5
                stmdb   r9!, {r0 - r3, r10 - r12, lr}