The guest can access the controller in two ways. The first one is the native way implementing the registers described in the AHCI specification and is the preferred one. The second implements the I/O ports used for booting from the hard disk and for guests which don't have an AHCI SATA driver.
The data is transfered in an asychronous way using one thread per implemented port or using the new async completion interface which is still under development. [not quite up to date]