WIP-pop-3000
diff --git a/kern/arch/x86/atomic.h b/kern/arch/x86/atomic.h
index 54dca37..dfe3583 100644
--- a/kern/arch/x86/atomic.h
+++ b/kern/arch/x86/atomic.h
@@ -107,6 +107,7 @@
 static inline bool atomic_sub_and_test(atomic_t *number, long val)
 {
 	bool b;
+	// XXX this this OK?
 	asm volatile("lock sub %2,%1; setz %0" : "=q"(b), "=m"(*number)
 	                                       : "r"(val), "m"(*number)
 	                                       : "cc" );
diff --git a/kern/drivers/dev/cbdma.c b/kern/drivers/dev/cbdma.c
index 8e3bbf8..e5cca42 100644
--- a/kern/drivers/dev/cbdma.c
+++ b/kern/drivers/dev/cbdma.c
@@ -145,6 +145,8 @@
 	/* You can poke this.  dma_sync_wait() also calls this. */
 	dma_async_issue_pending(dc);
 
+	// XXX cat cbd/ktest doesn't work when assigned to another process
+	// HERE NEXT 
 	if (async) {
 		/* Giant warning: the polling methods, like
 		 * dmaengine_tx_status(), might actually trigger the
diff --git a/kern/drivers/dev/iommu.c b/kern/drivers/dev/iommu.c
index 4b9019f..71f4c9c 100644
--- a/kern/drivers/dev/iommu.c
+++ b/kern/drivers/dev/iommu.c
@@ -550,6 +550,10 @@
 		pci_iter->iommu = iommu;
 		TAILQ_INSERT_TAIL(&iommu->pci_devs, pci_iter, iommu_link);
 	}
+
+	// XXX this means that we have some devices on the default IOMMU that
+	// shouldn't be...
+	// TODO: parse devscope and assign scoped iommus
 }
 
 /* This is called from acpi.c to initialize an iommu. */
@@ -642,6 +646,7 @@
 	struct pci_device *pdev;
 	struct sized_alloc *sza = sized_kzmalloc(BUFFERSZ, MEM_WAIT);
 
+	// XXX consider listing all PCI devices
 	TAILQ_FOREACH(iommu, &iommu_list, iommu_link) {
 		sza_printf(sza, "Mappings for iommu@%p\n", iommu);
 		spin_lock_irqsave(&iommu->iommu_lock);
diff --git a/kern/drivers/dma/ioat/init.c b/kern/drivers/dma/ioat/init.c
index cb9ae76..804e0b7 100644
--- a/kern/drivers/dma/ioat/init.c
+++ b/kern/drivers/dma/ioat/init.c
@@ -16,6 +16,8 @@
  *
  */
 
+#define DEV_DBG 1
+
 #include <linux_compat.h>
 #include <linux/sizes.h>
 
diff --git a/kern/include/env.h b/kern/include/env.h
index 4ddd46b..fea43fb 100644
--- a/kern/include/env.h
+++ b/kern/include/env.h
@@ -22,6 +22,7 @@
 #include <ns.h>
 #include <arch/vmm/vmm.h>
 #include <arch/pci.h>
+// XXX pci.h couldn't include.  pulled in too much via arena->rb->rcu->cv
 #include <dma.h>
 
 TAILQ_HEAD(vcore_tailq, vcore);
@@ -129,6 +130,7 @@
 
 	struct strace		*strace;
 
+	// XXX
 	qlock_t			dev_qlock;
 	struct list_head	iommus;
 	struct pcidev_tq	pci_devs;
diff --git a/kern/src/alarm.c b/kern/src/alarm.c
index 3ff6534..a000951 100644
--- a/kern/src/alarm.c
+++ b/kern/src/alarm.c
@@ -291,6 +291,24 @@
 	return ret;
 }
 
+// XXX these aren't threadsafe...  two people try to reset at the same time,
+// both unset, then both set.
+//
+// since they were racy before, might as well make them nosync too, since anyone
+// using them must have thought they were the only one using them.
+//
+// this (regardless of the race fix) does mean we'll have the alarm set again
+// while it is still running. 
+//
+// which means it might be able to go off again, concurrently. 
+//
+// which is a problem, since alarm handlers assume they are not
+// running concurrently with themselves.
+//
+// which means tchain->running could == an alarm on another core!
+//
+// if you knew you were submitting to the same tchain, then it'd be OK
+// 	and it is the same tchain.
 bool reset_alarm_abs(struct timer_chain *tchain, struct alarm_waiter *waiter,
                      uint64_t abs_time)
 {
diff --git a/kern/src/dma.c b/kern/src/dma.c
index 155a6d6..3c93053 100644
--- a/kern/src/dma.c
+++ b/kern/src/dma.c
@@ -228,6 +228,9 @@
 	struct proc *p = da->data;
 	void *uaddr;
 
+	/* XXX need a 'can't be munmapped by userspace' flag?  what was the deal
+	 * with that?  can make the kernel driver PF if they trash the mapping
+	 */
 	uaddr = mmap(p, 0, amt, PROT_READ | PROT_WRITE,
 		     MAP_ANONYMOUS | MAP_POPULATE | MAP_PRIVATE, -1, 0);
 
diff --git a/kern/src/mm.c b/kern/src/mm.c
index 648745a..fae424d 100644
--- a/kern/src/mm.c
+++ b/kern/src/mm.c
@@ -629,6 +629,7 @@
 	return 0;
 }
 
+// XXX pip hook / debug level for this (for when /proc/PID/maps is busted)
 void print_vmrs(struct proc *p)
 {
 	int count = 0;
diff --git a/user/vmm/vthread.c b/user/vmm/vthread.c
index 5262e60..49af5dc 100644
--- a/user/vmm/vthread.c
+++ b/user/vmm/vthread.c
@@ -174,15 +174,40 @@
 	int ret;
 	uintptr_t *stack, *tos;
 
+#if 0
 	ret = posix_memalign((void **)&stack, PGSIZE, DEFAULT_STACK_SIZE);
 	if (ret)
 		return 0;
+#else
+
+	// this works fine...  does/did it not work on some machines?
+	stack = mmap(0, DEFAULT_STACK_SIZE, PROT_READ | PROT_WRITE,
+		     MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
+	if (stack == MAP_FAILED)
+		return 0;
+#endif
+
+
 	add_pte_entries(vm, (uintptr_t)stack,
 	                (uintptr_t)stack + DEFAULT_STACK_SIZE);
+	// XXX why did i get here?  checking if IPT was mapped, since i thought
+	// that might be a UCBDMA bug?
+// XXX this is fucked up - we can PF later on, but don't have a handler.
+// so we're just as fucked.  we just avoid it since we touch the top.
+// so might as well make the stacks as big as you want.
+//
+// wait, why are we PFing?  if we touch it here, we bring it in to the EPT.
+// might be that old bug that zach ran into?
+//
+// 	yeah, that is unnecessary.  the only reason to do it is for faster perf,
+// 	not for correctness
+//
+// also, we never free these.  though we also never free vthrs.  reuse,
+// etc.
 	/* touch the top word on the stack so we don't page fault
 	 * on that in the VM. */
 	tos = &stack[DEFAULT_STACK_SIZE / sizeof(uint64_t) - 1];
-	*tos = 0;
+	//*tos = 0;
 	return (uintptr_t)tos;
 }