It was significantly easier to implement thread suspension on Windows using the safepoints rather than using asynchronous signal processing. The lack of them on Windows (which is a controversial topic when comparing Windows APIs to Unix APIs) made it significantly harder. The implementation of safepoints for SBCL was independently done by Paul Khuong (http://repo.or.cz/w/sbcl/pkhuong.git/shortlog/refs/heads/gc-safe-points) which I gladly took as a basis. The GC-polling code in the safepoints is not yet optimal, though.
For now, the garbage collector does not correctly support having code regions that don't participate in the garbage collection process - that is, code that blocks or calls the foreign code.
And, of course, the optimizations are to be done.