diff --git a/kgdb.sh b/kgdb.sh
index 39a95f1..b3a745a 100755
--- a/kgdb.sh
+++ b/kgdb.sh
@@ -18,22 +18,75 @@
 KATA_OUT=out/kata/${TARGET}/debug
 MATCHA_OUT=out/matcha/riscv32imc-unknown-none-elf/debug
 
+USE_SEL4_EXTENSIONS="true"
+USE_SEL4_SYMBOL_AUTOSWITCHING="false"
+
 export SOURCE_DIR=${ROOTDIR}/kata
 export BUILD_DIR=$KATA_OUT
 
-# NB: -q suppresses the banner to workaround the banner msg triggering the pager
-# NB: auto-start cpu0 & cpu1 but leave cpu2 (VC) halted
-exec "${GDB}" -q -cd "${ROOTDIR}" \
-  -ex "set pagination off" \
-  -ex "directory sw/tock" \
-  -ex "file ${PROGRAM}" \
-  -ex "set confirm off" \
-  -ex "add-symbol-file ${PROGRAM}" \
-  -ex "add-symbol-file ${MATCHA_OUT}/matcha_platform" \
-  -ex "add-symbol-file ${MATCHA_OUT}/matcha_app" \
-  -ex "set pagination on" \
-  -ex "target remote ${REMOTE}" \
-  -ex "monitor cpu0 IsHalted false" \
-  -ex "monitor cpu1 CreateSeL4 0xffffffef" \
-  -ex "source sim/renode/tools/sel4_extensions/gdbscript.py" \
-  -ex "sel4 symbol-autoswitching false"
+function parseargv {
+    local usage="Usage: kgdb.sh [-h|--help] [-S|--no-sel4-extensions] [-a|--sel4-symbol-autoswitching]"
+    local args=$(getopt -o hSa --long no-sel4-extensions,symbol-autoswitching,help -n kgdb.sh -- "$@")
+
+    set -- $args
+
+    for i; do
+        case "$1" in
+            -S|--no-sel4-extensions)
+                echo "*** Disabling sel4 extensions"
+                USE_SEL4_EXTENSIONS="false"
+                shift
+                ;;
+
+            -a|--symbol-autoswitching)
+                echo "*** Enabling sel4 symbol autoswitching"
+                echo "*** Warning: this can cause unexpected behaviors."
+                USE_SEL4_EXTENSIONS="true"
+                USE_SEL4_SYMBOL_AUTOSWITCHING="true"
+                shift
+                ;;
+
+            --)
+                shift
+                break
+                ;;
+
+            -h|--help|*)
+                echo "$usage" >/dev/stderr
+                exit 1
+                ;;
+        esac
+    done
+}
+
+function main {
+    local -a gdbargs=(
+         -ex "set pagination off"
+         -ex "directory sw/tock"
+         -ex "file ${PROGRAM}"
+         -ex "set confirm off"
+         -ex "add-symbol-file ${PROGRAM}"
+         -ex "add-symbol-file ${MATCHA_OUT}/matcha_platform"
+         -ex "add-symbol-file ${MATCHA_OUT}/matcha_app"
+         -ex "set pagination on"
+         -ex "target remote ${REMOTE}"
+         -ex "monitor cpu0 IsHalted false"
+    )
+
+    parseargv "$@"
+
+    if [[ "${USE_SEL4_EXTENSIONS}" == "true" ]]; then
+        gdbargs+=(
+            -ex "monitor cpu1 CreateSeL4 0xffffffee"
+            -ex "source sim/renode/tools/sel4_extensions/gdbscript.py"
+            -ex "sel4 symbol-autoswitching ${USE_SEL4_SYMBOL_AUTOSWITCHING}"
+        )
+    fi
+
+
+    # NB: -q suppresses the banner to workaround the banner msg triggering the pager
+    # NB: auto-start cpu0 & cpu1 but leave cpu2 (VC) halted
+    exec "${GDB}" -q -cd "${ROOTDIR}" "${gdbargs[@]}"
+}
+
+main "$@"
diff --git a/preupload-hooks/rustfmt.py b/preupload-hooks/rustfmt.py
new file mode 100755
index 0000000..e153c36
--- /dev/null
+++ b/preupload-hooks/rustfmt.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python3
+# Copyright 2022 Google LLC
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Wrapper to run  rustfmt for repo preupload."""
+
+import argparse
+import os
+import subprocess
+import sys
+
+
+def get_parser():
+    """Return a command line parser."""
+    parser = argparse.ArgumentParser(description=__doc__)
+    parser.add_argument("--rustfmt_path",
+                        default="rustfmt",
+                        help="The path to the rustfmt binary.")
+    parser.add_argument('files',
+                        type=str,
+                        nargs='*',
+                        help='If specified, only consider rustfmt in '
+                        'these files.')
+    return parser
+
+
+def main(argv):
+    """The main entry."""
+    parser = get_parser()
+    opts = parser.parse_args(argv)
+
+    # Check and set rustfmt path in case `source build/setup.sh` is not run in
+    # the shell session. In repo preupload, the path should be set in
+    # PREUPLOAD.cfg.
+    if opts.rustfmt_path != "rustfmt":
+        # Add rustfmt path to system PATH and set up RUSTUP_HOME at one level up
+        # rustfmt has to have both variables set up to work properly.
+        path = os.path.realpath(opts.rustfmt_path + "/..")
+        os.environ["PATH"] = path + ":" + os.getenv("PATH")
+        os.environ["RUSTUP_HOME"] = path + "/.."
+
+    # Only process .rs files
+    file_list = [f for f in opts.files if f.endswith("rs")]
+    if not file_list:
+        sys.exit(0)
+
+    cmd = [opts.rustfmt_path, "--check", "--color", "never"]
+
+    for f in file_list:
+        cmd.append(f)
+
+    # Run rustfmt on all the .rs files in the file list. `--check` flag
+    # prints out the formatting error and return with exit(1).
+    try:
+        subprocess.run(cmd, check=True)
+    except subprocess.CalledProcessError as e:
+        print(f"rustfmt check failed\ncmd: {cmd}\nexit code {e.returncode}")
+        sys.exit(e.returncode)
+    else:
+        sys.exit(0)
+
+
+if __name__ == '__main__':
+    main(sys.argv[1:])
diff --git a/python-requirements.txt b/python-requirements.txt
index 94de1ba..c0e0ae9 100644
--- a/python-requirements.txt
+++ b/python-requirements.txt
@@ -14,6 +14,7 @@
 pyyaml
 requests
 robotframework==4.0.1
+scipy
 sel4-deps
 setuptools
 tempita
