iccci
Instruction Syntax
| Mnemonic | Format | Flags |
| iccci | rA,rB | - |
Instruction Encoding
| Field | Bits | Description |
| Primary Opcode | 0-5 | 011111 (0x1F) |
| Reserved | 6-10 | 00000 |
| rA | 11-15 | Source register A |
| rB | 16-20 | Source register B |
| Reserved | 21 | 0 |
| XO | 22-30 | 1111000110 (966) |
| Reserved | 31 | 0 |
Operation
if rA = 0 then EA ← 0 else EA ← (rA) EA ← EA + (rB) Invalidate all instruction cache blocks that hit on EA
The instruction cache coherency control instruction is used to maintain coherency between instruction caches in multiprocessor systems. It invalidates all instruction cache blocks that hit on the effective address in all processors in the coherency domain.
Note: This is a privileged instruction typically used by operating system and hypervisor code for multiprocessor cache coherency. The instruction may cause a system alignment interrupt if the effective address is not properly aligned. This instruction is implementation-specific and may not be available on all PowerPC processors.
Affected Registers
None - This instruction does not affect any registers.
For more information on cache coherency see Section 2.1.1, "Cache Model," in the PowerPC Microprocessor Family: The Programming Environments manual.
Examples
Multiprocessor Code Modification
# Invalidate instruction cache across all processors lis r3, shared_code@ha addi r3, r3, shared_code@l # Modify shared code lis r4, new_instruction@ha addi r4, r4, new_instruction@l lwz r5, 0(r4) # Load new instruction stw r5, 0(r3) # Store to shared code area # Ensure coherency across all processors dcbst 0, r3 # Flush data cache to memory sync # Ensure store completes iccci 0, r3 # Invalidate instruction cache on all processors isync # Synchronize instruction prefetch
Operating System Module Loading
# Load kernel module and ensure instruction cache coherency
lis r3, module_base@ha
addi r3, r3, module_base@l
lwz r4, module_size(r0) # Load module size
li r5, 0 # Current offset
li r6, 32 # Cache line size
# Flush entire module from all instruction caches
module_coherency_loop:
add r7, r3, r5 # Current address
dcbst 0, r7 # Flush data cache
iccci 0, r7 # Invalidate instruction cache on all CPUs
add r5, r5, r6 # Next cache line
cmpw r5, r4 # Check if done
blt module_coherency_loop
sync # Ensure all operations complete
isync # Synchronize instruction stream
Hypervisor Guest Code Patching
# Patch guest code and maintain coherency across virtual CPUs
lis r3, guest_code_page@ha
addi r3, r3, guest_code_page@l
# Apply security patch to guest code
lis r4, security_patch@ha
addi r4, r4, security_patch@l
lwz r5, patch_size(r0)
li r6, 0
apply_patch_loop:
lwzx r7, r4, r6 # Load patch byte
stwx r7, r3, r6 # Apply to guest code
addi r6, r6, 4 # Next word
cmpw r6, r5 # Check if done
blt apply_patch_loop
# Ensure coherency across all virtual CPUs
li r6, 0
coherency_loop:
add r7, r3, r6 # Current address
dcbst 0, r7 # Flush data cache
iccci 0, r7 # Invalidate instruction cache globally
addi r6, r6, 32 # Next cache line
cmpw r6, r5 # Check if done
blt coherency_loop
sync # Memory barrier
isync # Instruction synchronization
Distributed Debugging System
# Install breakpoints across all processors in debug session
lis r3, breakpoint_list@ha
addi r3, r3, breakpoint_list@l
lwz r4, num_breakpoints(r0)
li r5, 0
install_breakpoints:
lwzx r6, r3, r5 # Load breakpoint address
# Save original instruction
lwz r7, 0(r6) # Load original instruction
stwx r7, r3, r5 # Save in parallel array
# Install breakpoint instruction
lis r8, 0x7FE0 # Breakpoint instruction
ori r8, r8, 0x0008
stw r8, 0(r6) # Install breakpoint
# Ensure coherency across all debug targets
dcbst 0, r6 # Flush data cache
iccci 0, r6 # Invalidate instruction cache on all CPUs
addi r5, r5, 4 # Next breakpoint
subi r4, r4, 1 # Decrement counter
cmpwi r4, 0
bne install_breakpoints
sync # Ensure all modifications visible
isync # Synchronize instruction stream
Real-Time System Critical Section Update
# Update real-time critical section code across all processors
lis r3, critical_section@ha
addi r3, r3, critical_section@l
# Disable interrupts on all processors first
lis r4, disable_interrupts@ha
addi r4, r4, disable_interrupts@l
mtctr r4
bctrl # Call interrupt disable routine
# Update critical section code
lis r5, new_critical_code@ha
addi r5, r5, new_critical_code@l
lwz r6, critical_size(r0)
li r7, 0
update_critical_loop:
lwzx r8, r5, r7 # Load new code
stwx r8, r3, r7 # Store to critical section
addi r7, r7, 4 # Next word
cmpw r7, r6 # Check if done
blt update_critical_loop
# Ensure coherency across all real-time processors
li r7, 0
critical_coherency_loop:
add r8, r3, r7 # Current address
dcbst 0, r8 # Flush data cache
iccci 0, r8 # Invalidate instruction cache globally
addi r7, r7, 32 # Next cache line
cmpw r7, r6 # Check if done
blt critical_coherency_loop
sync # Memory barrier
isync # Instruction synchronization
# Re-enable interrupts
lis r4, enable_interrupts@ha
addi r4, r4, enable_interrupts@l
mtctr r4
bctrl # Call interrupt enable routine
Firmware Update Across Processor Complex
# Update firmware and maintain coherency across processor complex
lis r3, firmware_base@ha
addi r3, r3, firmware_base@l
lis r4, new_firmware@ha
addi r4, r4, new_firmware@l
lwz r5, firmware_size(r0)
# Copy new firmware
li r6, 0
firmware_copy_loop:
lwzx r7, r4, r6 # Load from new firmware
stwx r7, r3, r6 # Store to firmware area
addi r6, r6, 4 # Next word
cmpw r6, r5 # Check if done
blt firmware_copy_loop
# Invalidate instruction caches across entire processor complex
li r6, 0
firmware_coherency_loop:
add r7, r3, r6 # Current firmware address
dcbst 0, r7 # Flush data cache
iccci 0, r7 # Invalidate instruction cache on all processors
addi r6, r6, 32 # Next cache line
cmpw r6, r5 # Check if done
blt firmware_coherency_loop
sync # Ensure all cache operations complete
isync # Synchronize instruction prefetch
# Signal firmware update complete to all processors
lis r7, update_complete_flag@ha
addi r7, r7, update_complete_flag@l
li r8, 1
stw r8, 0(r7) # Set completion flag
dcbst 0, r7 # Ensure flag is visible to all processors
Cluster Computing Task Distribution
# Distribute computational tasks across cluster nodes
lis r3, task_code_buffer@ha
addi r3, r3, task_code_buffer@l
lis r4, task_template@ha
addi r4, r4, task_template@l
lwz r5, task_size(r0)
# Customize task code for each node
lwz r6, node_count(r0)
li r7, 0 # Node index
distribute_tasks:
# Calculate task code address for this node
mullw r8, r7, r5 # Offset for this node
add r9, r3, r8 # Task code address for node
# Copy and customize task template
li r10, 0
copy_task_loop:
lwzx r11, r4, r10 # Load from template
# Customize instruction for node (simplified)
add r11, r11, r7 # Add node ID to instruction
stwx r11, r9, r10 # Store customized instruction
addi r10, r10, 4 # Next word
cmpw r10, r5 # Check if done
blt copy_task_loop
# Ensure coherency for this node's task code
li r10, 0
node_coherency_loop:
add r11, r9, r10 # Current address
dcbst 0, r11 # Flush data cache
iccci 0, r11 # Invalidate instruction cache cluster-wide
addi r10, r10, 32 # Next cache line
cmpw r10, r5 # Check if done
blt node_coherency_loop
addi r7, r7, 1 # Next node
cmpw r7, r6 # Check if all nodes done
blt distribute_tasks
sync # Ensure all cache operations complete
isync # Synchronize instruction stream
Dynamic Load Balancing Code Migration
# Migrate hot code between processors for load balancing
lis r3, hot_function@ha
addi r3, r3, hot_function@l
lwz r4, function_size(r0)
lis r5, target_processor_cache@ha
addi r5, r5, target_processor_cache@l
# Copy function to target processor's local cache
li r6, 0
migrate_function_loop:
lwzx r7, r3, r6 # Load from source
stwx r7, r5, r6 # Store to target cache
addi r6, r6, 4 # Next word
cmpw r6, r4 # Check if done
blt migrate_function_loop
# Invalidate old function location on all processors
li r6, 0
invalidate_old_loop:
add r7, r3, r6 # Old function address
iccci 0, r7 # Invalidate on all processors
addi r6, r6, 32 # Next cache line
cmpw r6, r4 # Check if done
blt invalidate_old_loop
# Ensure new function is coherent across all processors
li r6, 0
coherent_new_loop:
add r7, r5, r6 # New function address
dcbst 0, r7 # Flush data cache
iccci 0, r7 # Invalidate instruction cache globally
addi r6, r6, 32 # Next cache line
cmpw r6, r4 # Check if done
blt coherent_new_loop
sync # Memory barrier
isync # Instruction synchronization
# Update function pointer to new location
lis r8, function_pointer@ha
addi r8, r8, function_pointer@l
stw r5, 0(r8) # Update pointer
dcbst 0, r8 # Ensure pointer update is visible
Security Policy Enforcement Update
# Update security enforcement code across all processors
lis r3, security_check_routine@ha
addi r3, r3, security_check_routine@l
lis r4, updated_security_code@ha
addi r4, r4, updated_security_code@l
lwz r5, security_code_size(r0)
# Atomically update security checking code
li r6, 0
update_security_loop:
lwzx r7, r4, r6 # Load updated security code
stwx r7, r3, r6 # Store to security routine
addi r6, r6, 4 # Next word
cmpw r6, r5 # Check if done
blt update_security_loop
# Ensure security update is coherent across all processors
li r6, 0
security_coherency_loop:
add r7, r3, r6 # Security routine address
dcbst 0, r7 # Flush data cache
iccci 0, r7 # Invalidate instruction cache on all processors
addi r6, r6, 32 # Next cache line
cmpw r6, r5 # Check if done
blt security_coherency_loop
sync # Ensure all updates complete
isync # Synchronize instruction stream
# Notify all processors that security update is complete
lis r8, security_update_flag@ha
addi r8, r8, security_update_flag@l
li r9, 1
stw r9, 0(r8) # Set update complete flag
dcbst 0, r8 # Ensure flag is visible to all processors