Changeset View
Changeset View
Standalone View
Standalone View
sys/x86/x86/bus_machdep.c
| Show All 19 Lines | |||||
| * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| */ | */ | ||||
| #include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
| #ifdef SAN_NEEDS_INTERCEPTORS | #ifdef SAN_NEEDS_INTERCEPTORS | ||||
| #define SAN_RUNTIME | #define SAN_RUNTIME | ||||
| #endif | #endif | ||||
| #include <sys/param.h> | #include <sys/param.h> | ||||
| #include <sys/systm.h> | #include <sys/systm.h> | ||||
| #include <x86/bus.h> | #include <sys/smp.h> | ||||
| #include <vm/vm.h> | #include <vm/vm.h> | ||||
| #include <vm/pmap.h> | #include <vm/pmap.h> | ||||
| #include <x86/bus.h> | |||||
| /* | /* | ||||
| * Implementation of bus_space_map(), which effectively is a thin | * Implementation of bus_space_map(), which effectively is a thin | ||||
| * wrapper around pmap_mapdev() for memory mapped I/O space. It's | * wrapper around pmap_mapdev() for memory mapped I/O space. It's | ||||
| * implemented here and not in <x86/bus.h> to avoid pollution. | * implemented here and not in <x86/bus.h> to avoid pollution. | ||||
| */ | */ | ||||
| int | int | ||||
| bus_space_map(bus_space_tag_t tag, bus_addr_t addr, bus_size_t size, | bus_space_map(bus_space_tag_t tag, bus_addr_t addr, bus_size_t size, | ||||
| int flags __unused, bus_space_handle_t *bshp) | int flags __unused, bus_space_handle_t *bshp) | ||||
| { | { | ||||
| *bshp = (tag == X86_BUS_SPACE_MEM) | *bshp = (tag == X86_BUS_SPACE_MEM) | ||||
| ? (uintptr_t)pmap_mapdev(addr, size) | ? (uintptr_t)pmap_mapdev(addr, size) | ||||
| : addr; | : addr; | ||||
| return (0); | return (0); | ||||
| } | } | ||||
| void | void | ||||
| bus_space_unmap(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t size) | bus_space_unmap(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t size) | ||||
| { | { | ||||
| if (tag == X86_BUS_SPACE_MEM) | if (tag == X86_BUS_SPACE_MEM) | ||||
| pmap_unmapdev((void *)bsh, size); | pmap_unmapdev((void *)bsh, size); | ||||
| } | |||||
| struct msr_safe_request { | |||||
| register_t *val; | |||||
| u_int msr; | |||||
| int res; | |||||
| }; | |||||
| static void | |||||
| rdmsr_safe_on_cpu_cb(void *arg) | |||||
| { | |||||
| struct msr_safe_request *req = (struct msr_safe_request *)arg; | |||||
| req->res = rdmsr_safe(req->msr, req->val); | |||||
| } | |||||
| static void | |||||
| wrmsr_safe_on_cpu_cb(void *arg) | |||||
| { | |||||
| struct msr_safe_request *req = (struct msr_safe_request *)arg; | |||||
| req->res = wrmsr_safe(req->msr, (register_t)req->val); | |||||
| } | |||||
| int | |||||
| rdmsr_safe_on_cpu(uint32_t cpuid, u_int msr, register_t *val) | |||||
| { | |||||
| struct msr_safe_request req; | |||||
| req.msr = msr; | |||||
| req.val = val; | |||||
| smp_rendezvous_cpu(cpuid, smp_no_rendezvous_barrier, | |||||
| rdmsr_safe_on_cpu_cb, smp_no_rendezvous_barrier, &req); | |||||
| return req.res; | |||||
| } | |||||
| int | |||||
| wrmsr_safe_on_cpu(uint32_t cpuid, u_int msr, register_t val) | |||||
| { | |||||
| struct msr_safe_request req; | |||||
| req.msr = msr; | |||||
| req.val = (register_t *)val; | |||||
| smp_rendezvous_cpu(cpuid, smp_no_rendezvous_barrier, | |||||
| wrmsr_safe_on_cpu_cb, smp_no_rendezvous_barrier, &req); | |||||
| return req.res; | |||||
| } | } | ||||