diff --git a/qemu-arm/main.c b/qemu-arm/main.c
index a35005e9dae09426d204cd0e17345af2d0a2e698..3750dde453b3ed80259823ee01683d4e058084c5 100644
--- a/qemu-arm/main.c
+++ b/qemu-arm/main.c
@@ -1,6 +1,7 @@
 #include <stdint.h>
 #include <stdio.h>
 #include <string.h>
+#include <malloc.h>
 
 #include "py/nlr.h"
 #include "py/obj.h"
@@ -9,6 +10,7 @@
 #include "py/runtime0.h"
 #include "py/runtime.h"
 #include "py/stackctrl.h"
+#include "py/gc.h"
 #include "py/repl.h"
 #include "py/pfenv.h"
 
@@ -51,6 +53,8 @@ void do_str(const char *src) {
 
 int main(int argc, char **argv) {
     mp_stack_set_limit(10240);
+    void *heap = malloc(16 * 1024);
+    gc_init(heap, (char*)heap + 16 * 1024);
     mp_init();
     do_str("print('hello world!')");
     mp_deinit();
diff --git a/qemu-arm/mpconfigport.h b/qemu-arm/mpconfigport.h
index f9f0486558114f241859c3fcd9c2db0b08d7ceb0..f5e5d029d0f8318790336c53b9111eedbffb2c06 100644
--- a/qemu-arm/mpconfigport.h
+++ b/qemu-arm/mpconfigport.h
@@ -4,11 +4,11 @@
 
 #define MICROPY_ALLOC_PATH_MAX      (512)
 #define MICROPY_EMIT_X64            (0)
-#define MICROPY_EMIT_THUMB          (0)
-#define MICROPY_EMIT_INLINE_THUMB   (0)
+#define MICROPY_EMIT_THUMB          (1)
+#define MICROPY_EMIT_INLINE_THUMB   (1)
 #define MICROPY_MEM_STATS           (0)
 #define MICROPY_DEBUG_PRINTERS      (0)
-#define MICROPY_ENABLE_GC           (0)
+#define MICROPY_ENABLE_GC           (1)
 #define MICROPY_STACK_CHECK         (1)
 #define MICROPY_HELPER_REPL         (0)
 #define MICROPY_HELPER_LEXER_UNIX   (0)
diff --git a/qemu-arm/test_main.c b/qemu-arm/test_main.c
index 30bd169040cf1845f03de807d0ac959fe185d5b3..cc4e15357ec78f79a08313a9220a28bb29d09a0a 100644
--- a/qemu-arm/test_main.c
+++ b/qemu-arm/test_main.c
@@ -1,6 +1,7 @@
 #include <stdint.h>
 #include <stdio.h>
 #include <string.h>
+#include <malloc.h>
 
 #include "py/nlr.h"
 #include "py/obj.h"
@@ -9,6 +10,7 @@
 #include "py/runtime0.h"
 #include "py/runtime.h"
 #include "py/stackctrl.h"
+#include "py/gc.h"
 #include "py/repl.h"
 #include "py/pfenv.h"
 
@@ -58,6 +60,8 @@ end:
 int main() {
     const char a[] = {"sim"};
     mp_stack_set_limit(10240);
+    void *heap = malloc(256 * 1024);
+    gc_init(heap, (char*)heap + 256 * 1024);
     mp_init();
     int r = tinytest_main(1, (const char **) a, groups);
     mp_deinit();
@@ -66,6 +70,18 @@ int main() {
 }
 
 void gc_collect(void) {
+    gc_collect_start();
+
+    // get the registers and the sp
+    jmp_buf env;
+    setjmp(env);
+    volatile mp_uint_t dummy;
+    void *sp = (void*)&dummy;
+
+    // trace the stack, including the registers (since they live on the stack in this function)
+    gc_collect_root((void**)sp, ((uint32_t)MP_STATE_VM(stack_top) - (uint32_t)sp) / sizeof(uint32_t));
+
+    gc_collect_end();
 }
 
 mp_lexer_t *mp_lexer_new_from_file(const char *filename) {
diff --git a/tools/tinytest-codegen.py b/tools/tinytest-codegen.py
index ae6dc19b4e189bf910b82bb6d24746cc8bebedea..fe30193729246fb13112bdd406eae0d400a05eb2 100755
--- a/tools/tinytest-codegen.py
+++ b/tools/tinytest-codegen.py
@@ -46,8 +46,8 @@ testgroup_member = (
 
 ## XXX: may be we could have `--without <groups>` argument...
 # currently these tests are selected because they pass on qemu-arm
-test_dirs = ('basics',) # 'float', 'import', 'io', 'misc')
-exclude_tests = ('basics/builtin_override.py', 'basics/class_super_object.py', 'basics/memoryview_gc.py',)
+test_dirs = ('basics', 'micropython', 'inlineasm') # 'float', 'import', 'io', 'misc')
+exclude_tests = ('basics/builtin_override.py', 'basics/class_super_object.py', 'micropython/heapalloc.py')
 
 output = []