本文整理汇总了C++中GETREG函数的典型用法代码示例。如果您正苦于以下问题:C++ GETREG函数的具体用法?C++ GETREG怎么用?C++ GETREG使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了GETREG函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: irq_handler
__irq void irq_handler(void)
#endif
{
UINT32 intr_stat = GETREG(APB_INT_STS);
if (intr_stat & (INTR_TIMER_1 | INTR_TIMER_2 | INTR_TIMER_3))
{
g_timer_interrupt_count++;
CLEAR_TIMER_INTR(TIMER_CH1);
CLEAR_TIMER_INTR(TIMER_CH2);
CLEAR_TIMER_INTR(TIMER_CH3);
SETREG(APB_INT_STS, INTR_TIMER_1 | INTR_TIMER_2 | INTR_TIMER_3);
}
else if (intr_stat & INTR_FLASH)
{
ftl_isr();
}
else if (intr_stat & INTR_SDRAM)
{
UINT32 sdram_interrupt = GETREG(SDRAM_INTSTATUS);
SETREG(SDRAM_INTSTATUS, 0xFFFFFFFF);
// clear the DRAM interrupt flag at the interrupt controller
SETREG(APB_INT_STS, INTR_SDRAM);
if (sdram_interrupt & SDRAM_INT_ECC_CORR)
{
// Bit errors were detected and corrected.
// Usually this is NOT an indication of poor SDRAM quality.
// If the firmware has a bug due to which SDRAM is written by CPU without the help of mem util functions,
// ECC correction or ECC failure can happen.
g_sdram_ecc_count++;
}
if (sdram_interrupt & SDRAM_INT_ECC_FAIL)
{
// Bit errors were detected but could not be corrected.
g_sdram_ecc_fail_count++;
}
if (sdram_interrupt & SDRAM_INT_ADDR_OF)
{
// There was an attempt to access beyond DRAM address boundary.
uart_printf("Error: SDRAM interrupt occred: attempt to access beyond DRAM address boundary");
led_blink();
}
}
}
示例2: ftl_write
void ftl_write(UINT32 const lba, UINT32 const total_sectors)
{
UINT32 num_sectors_to_write;
UINT32 sect_offset = lba % SECTORS_PER_PAGE;
UINT32 remain_sectors = total_sectors;
while (remain_sectors != 0)
{
if (sect_offset + remain_sectors >= SECTORS_PER_PAGE)
{
num_sectors_to_write = SECTORS_PER_PAGE - sect_offset;
}
else
{
num_sectors_to_write = remain_sectors;
}
while (g_ftl_write_buf_id == GETREG(SATA_WBUF_PTR)); // bm_write_limit should not outpace SATA_WBUF_PTR
g_ftl_write_buf_id = (g_ftl_write_buf_id + 1) % NUM_WR_BUFFERS; // Circular buffer
SETREG(BM_STACK_WRSET, g_ftl_write_buf_id); // change bm_write_limit
SETREG(BM_STACK_RESET, 0x01); // change bm_write_limit
sect_offset = 0;
remain_sectors -= num_sectors_to_write;
}
}
示例3: ftl_read
void ftl_read(UINT32 const lba, UINT32 const total_sectors)
{
UINT32 num_sectors_to_read;
UINT32 lpage_addr = lba / SECTORS_PER_PAGE; // logical page address
UINT32 sect_offset = lba % SECTORS_PER_PAGE; // sector offset within the page
UINT32 sectors_remain = total_sectors;
while (sectors_remain != 0) // one page per iteration
{
if (sect_offset + sectors_remain < SECTORS_PER_PAGE)
{
num_sectors_to_read = sectors_remain;
}
else
{
num_sectors_to_read = SECTORS_PER_PAGE - sect_offset;
}
UINT32 next_read_buf_id = (g_ftl_read_buf_id + 1) % NUM_RD_BUFFERS;
while (next_read_buf_id == GETREG(SATA_RBUF_PTR)); // wait if the read buffer is full (slow host)
SETREG(BM_STACK_RDSET, next_read_buf_id); // change bm_read_limit
SETREG(BM_STACK_RESET, 0x02); // change bm_read_limit
g_ftl_read_buf_id = next_read_buf_id;
sect_offset = 0;
sectors_remain -= num_sectors_to_read;
lpage_addr++;
}
}
示例4: HANDLER_DEF_BEGIN
HANDLER_DEF_END
HANDLER_DEF_BEGIN(pop_r32_handler) {
uint32_t *stack = (uint32_t *)get_real_address( context->esp, table, WRITE, false );
context->esp+=sizeof(uint32_t);
switch( context->code[0] ) {
case 0x58:
case 0x59:
case 0x5A:
case 0x5B:
case 0x5C:
case 0x5D:
case 0x5E:
case 0x5F:
GETREG(context,context->code[0]-0x58) = *stack;
break;
default:
log_message( ERROR, "Invalid opcode for POP r");
assert(0);
break;
}
context->eip++;
context->code++;
}
示例5: opMULUr
static UINT32 opMULUr(void) // mulu r1,r2
{
UINT32 op1=GETREG(GET1);
UINT32 op2=GETREG(GET2);
UINT64 tmp;
tmp=(UINT64)op1*(UINT64)op2;
op2=tmp&0xffffffff;
tmp>>=32;
CHECK_ZS(tmp);//z = bad!
SET_Z( (tmp|op2)==0 );
SET_OV((tmp!=0));
SET_CY((tmp!=0));
SETREG(GET2,op2);
SETREG(30,tmp);
return clkIF;
}
示例6: ftl_read
void ftl_read(UINT32 const lba, UINT32 const num_sectors)
{
UINT32 remain_sects, num_sectors_to_read;
UINT32 lpn, sect_offset;
UINT32 bank, vpn;
lpn = lba / SECTORS_PER_PAGE;
sect_offset = lba % SECTORS_PER_PAGE;
remain_sects = num_sectors;
while (remain_sects != 0)
{
if ((sect_offset + remain_sects) < SECTORS_PER_PAGE)
{
num_sectors_to_read = remain_sects;
}
else
{
num_sectors_to_read = SECTORS_PER_PAGE - sect_offset;
}
bank = get_num_bank(lpn); // page striping
vpn = get_vpn(lpn);
CHECK_VPAGE(vpn);
if (vpn != NULL)
{
nand_page_ptread_to_host(bank,
vpn / PAGES_PER_BLK,
vpn % PAGES_PER_BLK,
sect_offset,
num_sectors_to_read);
}
// The host is requesting to read a logical page that has never been written to.
else
{
UINT32 next_read_buf_id = (g_ftl_read_buf_id + 1) % NUM_RD_BUFFERS;
#if OPTION_FTL_TEST == 0
while (next_read_buf_id == GETREG(SATA_RBUF_PTR)); // wait if the read buffer is full (slow host)
#endif
// fix bug @ v.1.0.6
// Send 0xFF...FF to host when the host request to read the sector that has never been written.
// In old version, for example, if the host request to read unwritten sector 0 after programming in sector 1, Jasmine would send 0x00...00 to host.
// However, if the host already wrote to sector 1, Jasmine would send 0xFF...FF to host when host request to read sector 0. (ftl_read() in ftl_xxx/ftl.c)
mem_set_dram(RD_BUF_PTR(g_ftl_read_buf_id) + sect_offset*BYTES_PER_SECTOR,
0xFFFFFFFF, num_sectors_to_read*BYTES_PER_SECTOR);
flash_finish();
SETREG(BM_STACK_RDSET, next_read_buf_id); // change bm_read_limit
SETREG(BM_STACK_RESET, 0x02); // change bm_read_limit
g_ftl_read_buf_id = next_read_buf_id;
}
sect_offset = 0;
remain_sects -= num_sectors_to_read;
lpn++;
}
}
示例7: ftl_trim
void ftl_trim(UINT32 const lba, UINT32 const num_sectors)
{
ASSERT(num_sectors > 0);
uart_printf("Num sectors: %u", num_sectors);
uart_printf("SATA_WBUF_PTR: %u", GETREG(SATA_WBUF_PTR));
uart_printf("g_ftl_write_buf_id: %u", g_ftl_write_buf_id);
UINT32 next_write_buf_id = (g_ftl_write_buf_id + num_sectors) % NUM_WR_BUFFERS;
for (UINT32 i=0;i<num_sectors;i++)
{
for (UINT32 j=0;j<512/8;j=j+2)
{
UINT32 address = read_dram_32(WR_BUF_PTR(g_ftl_write_buf_id)+j*sizeof(UINT32));
UINT32 reg2 = read_dram_32(WR_BUF_PTR(g_ftl_write_buf_id)+(j+1)*sizeof(UINT32));
UINT32 count = reg2 & 0xFFFF0000; // Count stored in the first four words.
// If count is zero. We continue, but also, if address is 48bit.
// We shouldn't get these unless it is an error.
if (count == 0 || (reg2 & 0x0000FFFF) > 0) //
continue;
// uart_print_hex(address);
// uart_print_hex(count);
}
g_ftl_write_buf_id = (g_ftl_write_buf_id + 1) % NUM_WR_BUFFERS;
}
SETREG(BM_STACK_WRSET, next_write_buf_id); // change bm_read_limit
SETREG(BM_STACK_RESET, 0x02); // change bm_read_limi
}
示例8: msm_bus_ipend
static int
msm_bus_ipend(struct uart_softc *sc)
{
struct msm_uart_softc *u = (struct msm_uart_softc *)sc;
struct uart_bas *bas = &sc->sc_bas;
uint32_t isr;
int ipend;
uart_lock(sc->sc_hwmtx);
/* Get ISR status */
isr = GETREG(bas, UART_DM_MISR);
ipend = 0;
/* Uart RX starting, notify upper layer */
if (isr & UART_DM_RXLEV) {
u->ier &= ~UART_DM_RXLEV;
SETREG(bas, UART_DM_IMR, u->ier);
uart_barrier(bas);
ipend |= SER_INT_RXREADY;
}
/* Stale RX interrupt */
if (isr & UART_DM_RXSTALE) {
/* Disable and reset it */
SETREG(bas, UART_DM_CR, UART_DM_STALE_EVENT_DISABLE);
SETREG(bas, UART_DM_CR, UART_DM_RESET_STALE_INT);
uart_barrier(bas);
ipend |= SER_INT_RXREADY;
}
/* TX READY interrupt */
if (isr & UART_DM_TX_READY) {
/* Clear TX Ready */
SETREG(bas, UART_DM_CR, UART_DM_CLEAR_TX_READY);
/* Disable TX_READY */
u->ier &= ~UART_DM_TX_READY;
SETREG(bas, UART_DM_IMR, u->ier);
uart_barrier(bas);
if (sc->sc_txbusy != 0)
ipend |= SER_INT_TXIDLE;
}
if (isr & UART_DM_TXLEV) {
/* TX FIFO is empty */
u->ier &= ~UART_DM_TXLEV;
SETREG(bas, UART_DM_IMR, u->ier);
uart_barrier(bas);
if (sc->sc_txbusy != 0)
ipend |= SER_INT_TXIDLE;
}
uart_unlock(sc->sc_hwmtx);
return (ipend);
}
示例9: opSHRi
static UINT32 opSHRi(void) // shr imm5,r2
{
UINT64 tmp;
UINT32 count=UI5(OP);
SET_OV(0);
SET_CY(0);
if(count)
{
tmp=GETREG(GET2);
tmp>>=count-1;
SET_CY(tmp&1);
tmp>>=1;
SETREG(GET2,tmp&0xffffffff);
}
CHECK_ZS(GETREG(GET2));
return clkIF;
}
示例10: opSARi
static UINT32 opSARi(void) // sar imm5,r2
{
UINT64 tmp;
UINT32 count=UI5(OP);
SET_OV(0);
SET_CY(0);
if(count)
{
tmp=GETREG(GET2);
tmp>>=count-1;
SET_CY(tmp&1);
tmp>>=1;
SETREG(GET2,(tmp&0xffffffff)|(~(((GETREG(GET2)&0x80000000)>>count)-1)));
}
CHECK_ZS(GETREG(GET2));
return clkIF;
}
示例11: opCVTS
static void opCVTS(void)
{
float val1=u2f(GETREG(GET1));
SET_OV(0);
SET_Z((val1==0.0)?1:0);
SET_S((val1<0.0)?1:0);
SETREG(GET2,(INT32)val1);
}
示例12: opSHRr
static UINT32 opSHRr(void) // shr r1,r2
{
UINT64 tmp;
UINT32 count=GETREG(GET1);
count&=0x1f;
SET_OV(0);
SET_CY(0);
if(count)
{
tmp=GETREG(GET2);
tmp>>=count-1;
SET_CY(tmp&1);
SETREG(GET2,(tmp>>1)&0xffffffff);
}
CHECK_ZS(GETREG(GET2));
return clkIF;
}
示例13: opSHLi
static UINT32 opSHLi(void) // shl imm5,r2
{
UINT64 tmp;
UINT32 count=UI5(OP);
SET_OV(0);
SET_CY(0);
if(count)
{
tmp=GETREG(GET2);
tmp<<=count;
CHECK_CY(tmp);
SETREG(GET2,tmp&0xffffffff);
}
CHECK_ZS(GETREG(GET2));
return clkIF;
}
示例14: opNOTr
static UINT32 opNOTr(void) // not r1,r2
{
UINT32 op1=GETREG(GET1);
UINT32 op2=~op1;
CHECK_ZS(op2);
SET_OV(0);
SETREG(GET2,op2);
return clkIF;
}
示例15: opMOVEA
static UINT32 opMOVEA(void) // movea imm16, reg1, reg2
{
UINT32 op1=GETREG(GET1);
UINT32 op2=R_OP(PC);
PC+=2;
op2=I16(op2);
SETREG(GET2,op1+op2);
return clkIF;
}