add plic.c
This commit is contained in:
		
							parent
							
								
									b05bcce939
								
							
						
					
					
						commit
						31ef85f552
					
				
					 1 changed files with 63 additions and 0 deletions
				
			
		
							
								
								
									
										63
									
								
								plic.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								plic.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,63 @@
 | 
			
		|||
#include "types.h"
 | 
			
		||||
#include "param.h"
 | 
			
		||||
#include "memlayout.h"
 | 
			
		||||
#include "riscv.h"
 | 
			
		||||
#include "defs.h"
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// the riscv Platform Level Interrupt Controller (PLIC).
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
plicinit(void)
 | 
			
		||||
{
 | 
			
		||||
  // set uart's priority to be non-zero (otherwise disabled).
 | 
			
		||||
  *(uint32*)(PLIC + UART0_IRQ*4) = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
plicinithart(void)
 | 
			
		||||
{
 | 
			
		||||
  int hart = cpuid();
 | 
			
		||||
  
 | 
			
		||||
  // set uart's enable bit for this hart's S-mode. 
 | 
			
		||||
  //*(uint32*)(PLIC + 0x2080)= (1 << UART0_IRQ);
 | 
			
		||||
  *(uint32*)PLIC_SENABLE(hart)= (1 << UART0_IRQ);
 | 
			
		||||
 | 
			
		||||
  // set this hart's S-mode priority threshold to 0.
 | 
			
		||||
  //*(uint32*)(PLIC + 0x201000) = 0;
 | 
			
		||||
  *(uint32*)PLIC_SPRIORITY(hart) = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// return a bitmap of which IRQs are waiting
 | 
			
		||||
// to be served.
 | 
			
		||||
uint64
 | 
			
		||||
plic_pending(void)
 | 
			
		||||
{
 | 
			
		||||
  uint64 mask;
 | 
			
		||||
 | 
			
		||||
  //mask = *(uint32*)(PLIC + 0x1000);
 | 
			
		||||
  //mask |= (uint64)*(uint32*)(PLIC + 0x1004) << 32;
 | 
			
		||||
  mask = *(uint64*)PLIC_PENDING;
 | 
			
		||||
 | 
			
		||||
  return mask;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ask the PLIC what interrupt we should serve.
 | 
			
		||||
int
 | 
			
		||||
plic_claim(void)
 | 
			
		||||
{
 | 
			
		||||
  int hart = cpuid();
 | 
			
		||||
  //int irq = *(uint32*)(PLIC + 0x201004);
 | 
			
		||||
  int irq = *(uint32*)PLIC_SCLAIM(hart);
 | 
			
		||||
  return irq;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// tell the PLIC we've served this IRQ.
 | 
			
		||||
void
 | 
			
		||||
plic_complete(int irq)
 | 
			
		||||
{
 | 
			
		||||
  int hart = cpuid();
 | 
			
		||||
  //*(uint32*)(PLIC + 0x201004) = irq;
 | 
			
		||||
  *(uint32*)PLIC_SCLAIM(hart) = irq;
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		
		Reference in a new issue