WIp trying to figure out a72

Change-Id: Ib590b75c768d72f85254a4b2c8645a26bd525a03
diff --git a/kernel/arch/arm64/arch.cpp b/kernel/arch/arm64/arch.cpp
index 4bb96aa..299780d 100644
--- a/kernel/arch/arm64/arch.cpp
+++ b/kernel/arch/arm64/arch.cpp
@@ -133,6 +133,15 @@
     platform_init_mmu_mappings();
 }
 
+static void arch_init_percpu() {
+    auto cpu = arch_curr_cpu_num();
+
+    TRACEF("cpu %u: SCTLR %#" PRIx64 "\n", cpu, ARM64_READ_SYSREG(SCTLR_EL1));
+    TRACEF("cpu %u: ACTLR %#" PRIx64 "\n", cpu, ARM64_READ_SYSREG(ACTLR_EL1));
+    TRACEF("cpu %u: CPUECTLR %#" PRIx64 "\n", cpu, ARM64_READ_SYSREG(S3_1_c15_c2_1));
+    TRACEF("cpu %u: CPUACTLR %#" PRIx64 "\n", cpu, ARM64_READ_SYSREG(S3_1_c15_c2_0));
+}
+
 void arch_init(void) TA_NO_THREAD_SAFETY_ANALYSIS {
     arch_mp_init_percpu();
 
@@ -140,6 +149,8 @@
 
     arm64_feature_debug(true);
 
+    arch_init_percpu();
+
     uint32_t max_cpus = arch_max_num_cpus();
     uint32_t cmdline_max_cpus = cmdline_get_uint32("kernel.smp.maxcpus", max_cpus);
     if (cmdline_max_cpus > max_cpus || cmdline_max_cpus <= 0) {
@@ -201,6 +212,8 @@
 
     arch_mp_init_percpu();
 
+    arch_init_percpu();
+
     arm64_feature_debug(false);
 
     lk_secondary_cpu_entry();
diff --git a/kernel/arch/arm64/exceptions_c.cpp b/kernel/arch/arm64/exceptions_c.cpp
index d0f066d..e212df0 100644
--- a/kernel/arch/arm64/exceptions_c.cpp
+++ b/kernel/arch/arm64/exceptions_c.cpp
@@ -86,6 +86,7 @@
     uint32_t iss = BITS(esr, 24, 0);
 
     /* fatal exception, die here */
+    printf("CPU %u\n", arch_curr_cpu_num());
     printf("ESR 0x%x: ec 0x%x, il 0x%x, iss 0x%x\n", esr, ec, il, iss);
     dump_iframe(iframe);
 
diff --git a/kernel/arch/arm64/mmu.cpp b/kernel/arch/arm64/mmu.cpp
index 27b842f..2557ede 100644
--- a/kernel/arch/arm64/mmu.cpp
+++ b/kernel/arch/arm64/mmu.cpp
@@ -447,6 +447,7 @@
         DEBUG_ASSERT(status == ZX_OK);
     } else if (asid_ == MMU_ARM64_GLOBAL_ASID) {
         // flush this address on all ASIDs
+        LTRACEF("kernel flush, vaddr %#" PRIxPTR "\n", vaddr);
         if (terminal) {
             ARM64_TLBI(vaale1is, vaddr >> 12);
         } else {
@@ -454,6 +455,7 @@
         }
     } else {
         // flush this address for the specific asid
+        LTRACEF("asid flush, asid %#hx, vaddr %#" PRIxPTR "\n", asid_, vaddr);
         if (terminal) {
             ARM64_TLBI(vale1is, vaddr >> 12 | (vaddr_t)asid_ << 48);
         } else {
@@ -499,7 +501,7 @@
                            page_size_shift, next_page_table);
             if (chunk_size == block_size ||
                 page_table_is_clear(next_page_table, page_size_shift)) {
-                LTRACEF("pte %p[0x%lx] = 0 (was page table)\n", page_table, index);
+                TRACEF("pte %p[0x%lx] = 0 (was page table)\n", page_table, index);
                 page_table[index] = MMU_PTE_DESCRIPTOR_INVALID;
 
                 // ensure that the update is observable from hardware page table walkers
@@ -847,7 +849,7 @@
 zx_status_t ArmArchVmAspace::Map(vaddr_t vaddr, paddr_t* phys, size_t count, uint mmu_flags,
                                  size_t* mapped) {
     canary_.Assert();
-    LTRACEF("vaddr %#" PRIxPTR " count %zu flags %#x\n",
+    TRACEF("vaddr %#" PRIxPTR " count %zu flags %#x\n",
             vaddr, count, mmu_flags);
 
     DEBUG_ASSERT(tt_virt_);
@@ -918,7 +920,7 @@
 
 zx_status_t ArmArchVmAspace::Unmap(vaddr_t vaddr, size_t count, size_t* unmapped) {
     canary_.Assert();
-    LTRACEF("vaddr %#" PRIxPTR " count %zu\n", vaddr, count);
+    TRACEF("vaddr %#" PRIxPTR " count %zu\n", vaddr, count);
 
     DEBUG_ASSERT(tt_virt_);
 
diff --git a/kernel/include/kernel/thread.h b/kernel/include/kernel/thread.h
index 92488c4..c71bcc7 100644
--- a/kernel/include/kernel/thread.h
+++ b/kernel/include/kernel/thread.h
@@ -71,7 +71,7 @@
 // N.B. This must match ZX_MAX_NAME_LEN.
 #define THREAD_NAME_LENGTH 32
 
-#define THREAD_LINEBUFFER_LENGTH 128
+#define THREAD_LINEBUFFER_LENGTH 192
 
 // Number of kernel tls slots.
 #define THREAD_MAX_TLS_ENTRY 2
diff --git a/kernel/object/thread_dispatcher.cpp b/kernel/object/thread_dispatcher.cpp
index 2aef545..e09c9de 100644
--- a/kernel/object/thread_dispatcher.cpp
+++ b/kernel/object/thread_dispatcher.cpp
@@ -88,11 +88,14 @@
     }
 
     // free the kernel stack
+#if 1
+    TRACEF("destroying mapping at %#" PRIxPTR "\n", kstack_mapping_->base());
     kstack_mapping_.reset();
     if (kstack_vmar_) {
         kstack_vmar_->Destroy();
         kstack_vmar_.reset();
     }
+#endif
 #if __has_feature(safe_stack)
     unsafe_kstack_mapping_.reset();
     if (unsafe_kstack_vmar_) {
@@ -157,7 +160,7 @@
     if (status != ZX_OK)
         return status;
 
-    LTRACEF("%s stack mapping at %#" PRIxPTR "\n",
+    TRACEF("%s stack mapping at %#" PRIxPTR "\n",
             unsafe ? "unsafe" : "safe", kstack_mapping->base());
 
     // fault in all the pages so we dont demand fault in the stack
diff --git a/kernel/top/main.cpp b/kernel/top/main.cpp
index add9235..4809d7c 100644
--- a/kernel/top/main.cpp
+++ b/kernel/top/main.cpp
@@ -15,6 +15,7 @@
 #include <debug.h>
 #include <kernel/init.h>
 #include <kernel/mutex.h>
+#include <kernel/percpu.h>
 #include <kernel/thread.h>
 #include <lib/heap.h>
 #include <lk/init.h>
@@ -125,6 +126,8 @@
     // secondary cpu initialize from threading level up. 0 to threading was handled in arch
     lk_init_level(LK_INIT_FLAG_SECONDARY_CPUS, LK_INIT_LEVEL_THREADING, LK_INIT_LEVEL_LAST);
 
+    printf("CPU %u: percpu @ %p\n", cpu, &percpu[cpu]);
+
     dprintf(SPEW, "entering scheduler on cpu %u\n", cpu);
     thread_secondary_cpu_entry();
 }