Changeset View
Changeset View
Standalone View
Standalone View
sys/arm/arm/trap-v6.c
Show All 21 Lines | |||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
* SUCH DAMAGE. | * SUCH DAMAGE. | ||||
*/ | */ | ||||
#include "opt_hwpmc_hooks.h" | |||||
#include "opt_ktrace.h" | #include "opt_ktrace.h" | ||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
#include <sys/param.h> | #include <sys/param.h> | ||||
#include <sys/bus.h> | #include <sys/bus.h> | ||||
#include <sys/systm.h> | #include <sys/systm.h> | ||||
Show All 25 Lines | |||||
#include <sys/kdb.h> | #include <sys/kdb.h> | ||||
#include <machine/db_machdep.h> | #include <machine/db_machdep.h> | ||||
#endif | #endif | ||||
#ifdef KDTRACE_HOOKS | #ifdef KDTRACE_HOOKS | ||||
#include <sys/dtrace_bsd.h> | #include <sys/dtrace_bsd.h> | ||||
#endif | #endif | ||||
#ifdef HWPMC_HOOKS | |||||
#include <sys/pmckern.h> | |||||
PMC_SOFT_DEFINE( , , page_fault, all); | |||||
PMC_SOFT_DEFINE( , , page_fault, read); | |||||
PMC_SOFT_DEFINE( , , page_fault, write); | |||||
#endif | |||||
extern char cachebailout[]; | extern char cachebailout[]; | ||||
#ifdef DEBUG | #ifdef DEBUG | ||||
int last_fault_code; /* For the benefit of pmap_fault_fixup() */ | int last_fault_code; /* For the benefit of pmap_fault_fixup() */ | ||||
#endif | #endif | ||||
struct ksig { | struct ksig { | ||||
int sig; | int sig; | ||||
▲ Show 20 Lines • Show All 429 Lines • ▼ Show 20 Lines | #endif | ||||
rv = vm_fault_trap(map, va, ftype, VM_FAULT_NORMAL, &ksig.sig, | rv = vm_fault_trap(map, va, ftype, VM_FAULT_NORMAL, &ksig.sig, | ||||
&ucode); | &ucode); | ||||
ksig.code = ucode; | ksig.code = ucode; | ||||
#ifdef INVARIANTS | #ifdef INVARIANTS | ||||
pcb->pcb_onfault = onfault; | pcb->pcb_onfault = onfault; | ||||
#endif | #endif | ||||
if (__predict_true(rv == KERN_SUCCESS)) | if (__predict_true(rv == KERN_SUCCESS)) { | ||||
#ifdef HWPMC_HOOKS | |||||
pmc_soft_page_fault(ftype, tf); | |||||
#endif | |||||
goto out; | goto out; | ||||
} | |||||
nogo: | nogo: | ||||
if (!usermode) { | if (!usermode) { | ||||
if (td->td_intr_nesting_level == 0 && | if (td->td_intr_nesting_level == 0 && | ||||
pcb->pcb_onfault != NULL) { | pcb->pcb_onfault != NULL) { | ||||
tf->tf_r0 = rv; | tf->tf_r0 = rv; | ||||
tf->tf_pc = (int)pcb->pcb_onfault; | tf->tf_pc = (int)pcb->pcb_onfault; | ||||
return; | return; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 153 Lines • Show Last 20 Lines |