Module Name: src
Committed By: skrll
Date: Sun Apr 12 15:36:18 UTC 2020
Modified Files:
src/sys/uvm/pmap: pmap.c pmap_tlb.c
Log Message:
Use UVMHIST_CALLARGS
To generate a diff of this commit:
cvs rdiff -u -r1.48 -r1.49 src/sys/uvm/pmap/pmap.c
cvs rdiff -u -r1.31 -r1.32 src/sys/uvm/pmap/pmap_tlb.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/uvm/pmap/pmap.c
diff -u src/sys/uvm/pmap/pmap.c:1.48 src/sys/uvm/pmap/pmap.c:1.49
--- src/sys/uvm/pmap/pmap.c:1.48 Sat Mar 14 14:05:44 2020
+++ src/sys/uvm/pmap/pmap.c Sun Apr 12 15:36:18 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.48 2020/03/14 14:05:44 ad Exp $ */
+/* $NetBSD: pmap.c,v 1.49 2020/04/12 15:36:18 skrll Exp $ */
/*-
* Copyright (c) 1998, 2001 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.48 2020/03/14 14:05:44 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.49 2020/04/12 15:36:18 skrll Exp $");
/*
* Manages physical address maps.
@@ -581,7 +581,8 @@ pmap_init(void)
UVMHIST_INIT_STATIC(pmapexechist, pmapexechistbuf);
UVMHIST_INIT_STATIC(pmaphist, pmaphistbuf);
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLED(pmaphist);
/*
* Initialize the segtab lock.
@@ -623,7 +624,8 @@ pmap_init(void)
pmap_t
pmap_create(void)
{
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLED(pmaphist);
PMAP_COUNT(create);
pmap_t pmap = pool_get(&pmap_pmap_pool, PR_WAITOK);
@@ -658,8 +660,8 @@ pmap_create(void)
void
pmap_destroy(pmap_t pmap)
{
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
- UVMHIST_LOG(pmaphist, "(pmap=%#jx)", (uintptr_t)pmap, 0, 0, 0);
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "(pmap=%#jx)", (uintptr_t)pmap, 0, 0, 0);
if (atomic_dec_uint_nv(&pmap->pm_count) > 0) {
PMAP_COUNT(dereference);
@@ -694,8 +696,8 @@ pmap_destroy(pmap_t pmap)
void
pmap_reference(pmap_t pmap)
{
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
- UVMHIST_LOG(pmaphist, "(pmap=%#jx)", (uintptr_t)pmap, 0, 0, 0);
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "(pmap=%#jx)", (uintptr_t)pmap, 0, 0, 0);
PMAP_COUNT(reference);
if (pmap != NULL) {
@@ -713,8 +715,8 @@ pmap_activate(struct lwp *l)
{
pmap_t pmap = l->l_proc->p_vmspace->vm_map.pmap;
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
- UVMHIST_LOG(pmaphist, "(l=%#jx pmap=%#jx)", (uintptr_t)l,
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "(l=%#jx pmap=%#jx)", (uintptr_t)l,
(uintptr_t)pmap, 0, 0);
PMAP_COUNT(activate);
@@ -744,9 +746,8 @@ pmap_page_remove(struct vm_page *pg)
VM_PAGEMD_PVLIST_LOCK(mdpg);
pmap_pvlist_check(mdpg);
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
-
- UVMHIST_LOG(pmapexechist, "pg %#jx (pa %#jx) [page removed]: "
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmapexechist, "pg %#jx (pa %#jx) [page removed]: "
"execpage cleared", (uintptr_t)pg, VM_PAGE_TO_PHYS(pg), 0, 0);
#ifdef PMAP_VIRTUAL_CACHE_ALIASES
pmap_page_clear_attributes(mdpg, VM_PAGEMD_EXECPAGE|VM_PAGEMD_UNCACHED);
@@ -862,8 +863,8 @@ pmap_deactivate(struct lwp *l)
{
pmap_t pmap = l->l_proc->p_vmspace->vm_map.pmap;
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
- UVMHIST_LOG(pmaphist, "(l=%#jx pmap=%#jx)", (uintptr_t)l,
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "(l=%#jx pmap=%#jx)", (uintptr_t)l,
(uintptr_t)pmap, 0, 0);
PMAP_COUNT(deactivate);
@@ -885,8 +886,8 @@ pmap_deactivate(struct lwp *l)
void
pmap_update(struct pmap *pmap)
{
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
- UVMHIST_LOG(pmaphist, "(pmap=%#jx)", (uintptr_t)pmap, 0, 0, 0);
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "(pmap=%#jx)", (uintptr_t)pmap, 0, 0, 0);
PMAP_COUNT(update);
kpreempt_disable();
@@ -930,10 +931,10 @@ pmap_pte_remove(pmap_t pmap, vaddr_t sva
const pt_entry_t npte = flags;
const bool is_kernel_pmap_p = (pmap == pmap_kernel());
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
- UVMHIST_LOG(pmaphist, "(pmap=%#jx kernel=%c va=%#jx..%#jx)",
- (uintptr_t)pmap, (is_kernel_pmap_p ? 1 : 0), sva, eva);
- UVMHIST_LOG(pmaphist, "ptep=%#jx, flags(npte)=%#jx",
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "(pmap=%#jx kernel=%jx va=%#jx..%#jx)",
+ (uintptr_t)pmap, (pmap == pmap_kernel() ? 1 : 0), sva, eva);
+ UVMHIST_LOG(pmaphist, "ptep=%#jx, flags(npte)=%#jx)",
(uintptr_t)ptep, flags, 0, 0);
KASSERT(kpreempt_disabled());
@@ -977,8 +978,8 @@ pmap_remove(pmap_t pmap, vaddr_t sva, va
const bool is_kernel_pmap_p = (pmap == pmap_kernel());
const pt_entry_t npte = pte_nv_entry(is_kernel_pmap_p);
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
- UVMHIST_LOG(pmaphist, "(pmap=%#jx, va=%#jx..%#jx)",
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "(pmap=%#jx, va=%#jx..%#jx)",
(uintptr_t)pmap, sva, eva, 0);
if (is_kernel_pmap_p) {
@@ -1011,8 +1012,8 @@ pmap_page_protect(struct vm_page *pg, vm
pv_entry_t pv;
vaddr_t va;
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
- UVMHIST_LOG(pmaphist, "(pg=%#jx (pa %#jx) prot=%#jx)",
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "(pg=%#jx (pa %#jx) prot=%#jx)",
(uintptr_t)pg, VM_PAGE_TO_PHYS(pg), prot, 0);
PMAP_COUNT(page_protect);
@@ -1074,8 +1075,8 @@ pmap_pte_protect(pmap_t pmap, vaddr_t sv
{
const vm_prot_t prot = (flags & VM_PROT_ALL);
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
- UVMHIST_LOG(pmaphist, "(pmap=%#jx kernel=%jx va=%#jx..%#jx)",
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "(pmap=%#jx kernel=%jx va=%#jx..%#jx)",
(uintptr_t)pmap, (pmap == pmap_kernel() ? 1 : 0), sva, eva);
UVMHIST_LOG(pmaphist, "ptep=%#jx, flags(npte)=%#jx)",
(uintptr_t)ptep, flags, 0, 0);
@@ -1132,8 +1133,8 @@ pmap_pte_protect(pmap_t pmap, vaddr_t sv
void
pmap_protect(pmap_t pmap, vaddr_t sva, vaddr_t eva, vm_prot_t prot)
{
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
- UVMHIST_LOG(pmaphist, "(pmap=%#jx, va=%#jx..%#jx, prot=%ju)",
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "(pmap=%#jx, va=%#jx..%#jx, prot=%ju)",
(uintptr_t)pmap, sva, eva, prot);
PMAP_COUNT(protect);
@@ -1165,8 +1166,8 @@ pmap_page_cache(struct vm_page *pg, bool
{
struct vm_page_md * const mdpg = VM_PAGE_TO_MD(pg);
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
- UVMHIST_LOG(pmaphist, "(pg=%#jx (pa %#jx) cached=%jd)",
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "(pg=%#jx (pa %#jx) cached=%jd)",
(uintptr_t)pg, VM_PAGE_TO_PHYS(pg), cached, 0);
KASSERT(kpreempt_disabled());
@@ -1226,8 +1227,8 @@ pmap_enter(pmap_t pmap, vaddr_t va, padd
((prot & VM_PROT_EXECUTE) ? &pmapexechist : &pmaphist);
#endif
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(*histp);
- UVMHIST_LOG(*histp, "(pmap=%#jx, va=%#jx, pa=%#jx",
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(*histp, "(pmap=%#jx, va=%#jx, pa=%#jx",
(uintptr_t)pmap, va, pa, 0);
UVMHIST_LOG(*histp, "prot=%#jx flags=%#jx)", prot, flags, 0, 0);
@@ -1376,8 +1377,8 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, v
struct vm_page * const pg = PHYS_TO_VM_PAGE(pa);
struct vm_page_md * const mdpg = (pg ? VM_PAGE_TO_MD(pg) : NULL);
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
- UVMHIST_LOG(pmaphist, "(va=%#jx pa=%#jx prot=%ju, flags=%#jx)",
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "(va=%#jx pa=%#jx prot=%ju, flags=%#jx)",
va, pa, prot, flags);
PMAP_COUNT(kenter_pa);
@@ -1442,9 +1443,8 @@ pmap_pte_kremove(pmap_t pmap, vaddr_t sv
{
const pt_entry_t new_pte = pte_nv_entry(true);
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
- UVMHIST_LOG(pmaphist,
- "(pmap=%#jx, sva=%#jx eva=%#jx ptep=%#jx)",
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "(pmap=%#jx, sva=%#jx eva=%#jx ptep=%#jx)",
(uintptr_t)pmap, sva, eva, (uintptr_t)ptep);
KASSERT(kpreempt_disabled());
@@ -1479,8 +1479,8 @@ pmap_kremove(vaddr_t va, vsize_t len)
const vaddr_t sva = trunc_page(va);
const vaddr_t eva = round_page(va + len);
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
- UVMHIST_LOG(pmaphist, "(va=%#jx len=%#jx)", va, len, 0, 0);
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "(va=%#jx len=%#jx)", va, len, 0, 0);
kpreempt_disable();
pmap_pte_process(pmap_kernel(), sva, eva, pmap_pte_kremove, 0);
@@ -1492,8 +1492,8 @@ pmap_kremove(vaddr_t va, vsize_t len)
bool
pmap_remove_all(struct pmap *pmap)
{
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
- UVMHIST_LOG(pmaphist, "(pm=%#jx)", (uintptr_t)pmap, 0, 0, 0);
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "(pm=%#jx)", (uintptr_t)pmap, 0, 0, 0);
KASSERT(pmap != pmap_kernel());
@@ -1537,8 +1537,8 @@ pmap_remove_all(struct pmap *pmap)
void
pmap_unwire(pmap_t pmap, vaddr_t va)
{
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
- UVMHIST_LOG(pmaphist, "(pmap=%#jx, va=%#jx)", (uintptr_t)pmap, va,
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "(pmap=%#jx, va=%#jx)", (uintptr_t)pmap, va,
0, 0);
PMAP_COUNT(unwire);
@@ -1621,7 +1621,8 @@ void
pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vaddr_t dst_addr, vsize_t len,
vaddr_t src_addr)
{
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLED(pmaphist);
PMAP_COUNT(copy);
}
@@ -1635,8 +1636,8 @@ pmap_clear_reference(struct vm_page *pg)
{
struct vm_page_md * const mdpg = VM_PAGE_TO_MD(pg);
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
- UVMHIST_LOG(pmaphist, "(pg=%#jx (pa %#jx))",
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "(pg=%#jx (pa %#jx))",
(uintptr_t)pg, VM_PAGE_TO_PHYS(pg), 0,0);
bool rv = pmap_page_clear_attributes(mdpg, VM_PAGEMD_REFERENCED);
@@ -1668,8 +1669,8 @@ pmap_clear_modify(struct vm_page *pg)
pv_entry_t pv = &mdpg->mdpg_first;
pv_entry_t pv_next;
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
- UVMHIST_LOG(pmaphist, "(pg=%#jx (%#jx))",
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "(pg=%#jx (%#jx))",
(uintptr_t)pg, VM_PAGE_TO_PHYS(pg), 0,0);
PMAP_COUNT(clear_modify);
@@ -1814,9 +1815,8 @@ pmap_enter_pv(pmap_t pmap, vaddr_t va, s
bool first = false;
#endif
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
- UVMHIST_LOG(pmaphist,
- "(pmap=%#jx va=%#jx pg=%#jx (%#jx)",
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "(pmap=%#jx va=%#jx pg=%#jx (%#jx)",
(uintptr_t)pmap, va, (uintptr_t)pg, VM_PAGE_TO_PHYS(pg));
UVMHIST_LOG(pmaphist, "nptep=%#jx (%#jx))",
(uintptr_t)nptep, pte_value(*nptep), 0, 0);
@@ -1957,9 +1957,8 @@ pmap_remove_pv(pmap_t pmap, vaddr_t va,
pv_entry_t pv, npv;
bool last;
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(pmaphist);
- UVMHIST_LOG(pmaphist,
- "(pmap=%#jx, va=%#jx, pg=%#jx (pa %#jx)",
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(pmaphist, "(pmap=%#jx, va=%#jx, pg=%#jx (pa %#jx)",
(uintptr_t)pmap, va, (uintptr_t)pg, VM_PAGE_TO_PHYS(pg));
UVMHIST_LOG(pmaphist, "dirty=%ju)", dirty, 0, 0, 0);
Index: src/sys/uvm/pmap/pmap_tlb.c
diff -u src/sys/uvm/pmap/pmap_tlb.c:1.31 src/sys/uvm/pmap/pmap_tlb.c:1.32
--- src/sys/uvm/pmap/pmap_tlb.c:1.31 Thu Apr 9 08:55:45 2020
+++ src/sys/uvm/pmap/pmap_tlb.c Sun Apr 12 15:36:18 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap_tlb.c,v 1.31 2020/04/09 08:55:45 skrll Exp $ */
+/* $NetBSD: pmap_tlb.c,v 1.32 2020/04/12 15:36:18 skrll Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap_tlb.c,v 1.31 2020/04/09 08:55:45 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap_tlb.c,v 1.32 2020/04/12 15:36:18 skrll Exp $");
/*
* Manages address spaces in a TLB.
@@ -239,9 +239,9 @@ static void
pmap_tlb_pai_reset(struct pmap_tlb_info *ti, struct pmap_asid_info *pai,
struct pmap *pm)
{
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(maphist);
- UVMHIST_LOG(maphist, "(ti=%#jx, pai=%#jx, pm=%#jx): asid %u",
- (uintptr_t)ti, (uintptr_t)pai, (uintptr_t)pm, pai->pai_asid);
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(maphist, "(ti=%#jx, pai=%#jx, pm=%#jx): asid %u",
+ ti, (uintptr_t)pai, (uintptr_t)pm, pai->pai_asid);
/*
* We must have an ASID but it must not be onproc (on a processor).
@@ -421,8 +421,8 @@ pmap_tlb_asid_count(struct pmap_tlb_info
static void
pmap_tlb_asid_reinitialize(struct pmap_tlb_info *ti, enum tlb_invalidate_op op)
{
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(maphist);
- UVMHIST_LOG(maphist, "(ti=%#jx, op=%ju)", (uintptr_t)ti, op, 0, 0);
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(maphist, "(ti=%#jx, op=%ju)", (uintptr_t)ti, op, 0, 0);
pmap_tlb_pai_check(ti, true);
@@ -640,7 +640,8 @@ pmap_tlb_shootdown_bystanders(pmap_t pm)
* We don't need to deal with our own TLB.
*/
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(maphist);
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(maphist, "pm %#jx", (uintptr_t)pm, 0, 0, 0);
kcpuset_t *pm_active;
kcpuset_clone(&pm_active, pm->pm_active);
@@ -734,9 +735,8 @@ pmap_tlb_update_addr(pmap_t pm, vaddr_t
struct pmap_asid_info * const pai = PMAP_PAI(pm, ti);
int rv = -1;
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(maphist);
- UVMHIST_LOG(maphist,
- " (pm=%#jx va=%#jx, pte=%#jx flags=%#jx)",
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(maphist, " (pm=%#jx va=%#jx, pte=%#jx flags=%#jx)",
(uintptr_t)pm, va, pte_value(pte), flags);
KASSERT(kpreempt_disabled());
@@ -775,8 +775,8 @@ pmap_tlb_invalidate_addr(pmap_t pm, vadd
struct pmap_tlb_info * const ti = cpu_tlb_info(curcpu());
struct pmap_asid_info * const pai = PMAP_PAI(pm, ti);
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(maphist);
- UVMHIST_LOG(maphist, " (pm=%#jx va=%#jx) ti=%#jx asid=%#jx",
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(maphist, " (pm=%#jx va=%#jx) ti=%#jx asid=%#jx",
(uintptr_t)pm, va, (uintptr_t)ti, pai->pai_asid);
KASSERT(kpreempt_disabled());
@@ -900,8 +900,8 @@ pmap_tlb_asid_acquire(pmap_t pm, struct
struct pmap_tlb_info * const ti = cpu_tlb_info(ci);
struct pmap_asid_info * const pai = PMAP_PAI(pm, ti);
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(maphist);
- UVMHIST_LOG(maphist, "(pm=%#jx, l=%#jx, ti=%#jx)", (uintptr_t)pm,
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(maphist, "(pm=%#jx, l=%#jx, ti=%#jx)", (uintptr_t)pm,
(uintptr_t)l, (uintptr_t)ti, 0);
KASSERT(kpreempt_disabled());
@@ -966,7 +966,8 @@ pmap_tlb_asid_acquire(pmap_t pm, struct
void
pmap_tlb_asid_deactivate(pmap_t pm)
{
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(maphist);
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(maphist, "pm %#jx", (uintptr_t)pm, 0, 0, 0);
KASSERT(kpreempt_disabled());
#if defined(MULTIPROCESSOR)
@@ -1002,8 +1003,8 @@ pmap_tlb_asid_deactivate(pmap_t pm)
void
pmap_tlb_asid_release_all(struct pmap *pm)
{
- UVMHIST_FUNC(__func__); UVMHIST_CALLED(maphist);
- UVMHIST_LOG(maphist, "(pm=%#jx)", (uintptr_t)pm, 0, 0, 0);
+ UVMHIST_FUNC(__func__);
+ UVMHIST_CALLARGS(maphist, "(pm=%#jx)", (uintptr_t)pm, 0, 0, 0);
KASSERT(pm != pmap_kernel());
#if defined(MULTIPROCESSOR)