DHU — Data Cache Hit Unlock

Instruction Word

Slot
Inst
6
3
6
2
6
1
6
0
5
9
5
8
5
7
5
6
5
5
5
4
5
3
5
2
5
1
5
0
4
9
4
8
4
7
4
6
4
5
4
4
4
3
4
2
4
1
4
0
3
9
3
8
3
7
3
6
3
5
3
4
3
3
3
2
3
1
3
0
2
9
2
8
2
7
2
6
2
5
2
4
2
3
2
2
2
1
2
0
1
9
1
8
1
7
1
6
1
5
1
4
1
3
1
2
1
1
1
0
9876543210
Format x24 - 24 bit(s) 0
DHU 00100111 10000010
s 3210
op2 3210

Assembler Syntax

DHU as, 0..240

C Syntax

#include <xtensa/tie/xt_datacache.h>

extern void XT_DHU(const int * s, immediate i);

Description

(please consult the Xtensa ® Instruction Set Architecture Reference Manual for any cross references and additional information)

DHU performs a data cache unlock if hit. The purpose of DHU is to remove the lock created by a DPFL instruction. Xtensa ISA implementations that do not implement cache locking must raise an illegal instruction exception when this opcode is executed.

DHU checks whether the line containing the specified address is present in the data cache, and if so, it clears the lock associated with that line. To unlock by index without knowing the address of the locked line, use the DIU instruction.

DHU forms a virtual address by adding the contents of address register as and a 4-bit zero-extended constant value encoded in the instruction word shifted left by four. Therefore, the offset can specify multiples of 16 from zero to 240. If the Region Translation Option or the MMU Option is enabled, the virtual address is translated to the physical address. If not, the physical address is identical to the virtual address. If the translation encounters an error (for example, protection violation), the processor raises an exception as if it were loading from the virtual address.

DHU is a privileged instruction.

Operation

if CRING != 0 then
	Exception (PrivilegedCause)
else
	vAddr ← AR[s] + (024||imm4||04)
	(pAddr, attributes, cause) ← ltranslate(vAddr, CRING)
	if invalid(attributes) then
		EXCVADDR ← vAddr
		Exception (cause)
	else
		dhitunlock(vAddr, pAddr)
	endif
endif

Exceptions

EveryInstR Group (see EveryInstR Group:)Memory Group (see Memory Group:)GenExcep(LoadProhibitedCause) if Region Protection Option or MMU OptionGenExcep(PrivilegedCause) if Exception Option

Protos that use DHU

proto DHU { in const int32 * s, in immediate i }{}{
DHU s, i + 0;
}