General indent and whitespace cleanups.

master
Jon Loeliger 19 years ago
parent 41a0e8b304
commit ffff3ae56f
  1. 24
      cpu/mpc86xx/cpu.c
  2. 12
      cpu/mpc86xx/i2c.c
  3. 36
      cpu/mpc86xx/interrupts.c
  4. 35
      cpu/mpc86xx/pci.c
  5. 22
      cpu/mpc86xx/pcie_indirect.c
  6. 123
      cpu/mpc86xx/start.S
  7. 47
      cpu/mpc86xx/traps.c

@ -38,7 +38,8 @@ extern void mpc8641_reset_board(cmd_tbl_t *cmdtp, int flag,
#endif #endif
int checkcpu (void) int
checkcpu(void)
{ {
sys_info_t sysinfo; sys_info_t sysinfo;
uint pvr, svr; uint pvr, svr;
@ -126,8 +127,10 @@ soft_restart(unsigned long addr)
{ {
#ifndef CONFIG_MPC8641HPCN #ifndef CONFIG_MPC8641HPCN
/* SRR0 has system reset vector, SRR1 has default MSR value */ /*
/* rfi restores MSR from SRR1 and sets the PC to the SRR0 value */ * SRR0 has system reset vector, SRR1 has default MSR value
* rfi restores MSR from SRR1 and sets the PC to the SRR0 value
*/
__asm__ __volatile__ ("mtspr 26, %0" :: "r" (addr)); __asm__ __volatile__ ("mtspr 26, %0" :: "r" (addr));
__asm__ __volatile__ ("li 4, (1 << 6)" ::: "r4"); __asm__ __volatile__ ("li 4, (1 << 6)" ::: "r4");
@ -192,7 +195,8 @@ do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
/* /*
* Get timebase clock frequency * Get timebase clock frequency
*/ */
unsigned long get_tbclk(void) unsigned long
get_tbclk(void)
{ {
sys_info_t sys_info; sys_info_t sys_info;
@ -210,7 +214,8 @@ watchdog_reset(void)
#if defined(CONFIG_DDR_ECC) #if defined(CONFIG_DDR_ECC)
void dma_init(void) void
dma_init(void)
{ {
volatile immap_t *immap = (immap_t *) CFG_IMMR; volatile immap_t *immap = (immap_t *) CFG_IMMR;
volatile ccsr_dma_t *dma = &immap->im_dma; volatile ccsr_dma_t *dma = &immap->im_dma;
@ -220,7 +225,8 @@ void dma_init(void)
asm("sync; isync"); asm("sync; isync");
} }
uint dma_check(void) uint
dma_check(void)
{ {
volatile immap_t *immap = (immap_t *) CFG_IMMR; volatile immap_t *immap = (immap_t *) CFG_IMMR;
volatile ccsr_dma_t *dma = &immap->im_dma; volatile ccsr_dma_t *dma = &immap->im_dma;
@ -237,7 +243,8 @@ uint dma_check(void)
return status; return status;
} }
int dma_xfer(void *dest, uint count, void *src) int
dma_xfer(void *dest, uint count, void *src)
{ {
volatile immap_t *immap = (immap_t *) CFG_IMMR; volatile immap_t *immap = (immap_t *) CFG_IMMR;
volatile ccsr_dma_t *dma = &immap->im_dma; volatile ccsr_dma_t *dma = &immap->im_dma;
@ -256,7 +263,8 @@ int dma_xfer(void *dest, uint count, void *src)
#ifdef CONFIG_OF_FLAT_TREE #ifdef CONFIG_OF_FLAT_TREE
void ft_cpu_setup(void *blob, bd_t *bd) void
ft_cpu_setup(void *blob, bd_t *bd)
{ {
u32 *p; u32 *p;
ulong clock; ulong clock;

@ -174,8 +174,7 @@ __i2c_read (u8 *data, int length)
/* Generate ack on last next to last byte */ /* Generate ack on last next to last byte */
if (i == length - 2) if (i == length - 2)
writeb(MPC86xx_I2CCR_MEN | MPC86xx_I2CCR_MSTA writeb(MPC86xx_I2CCR_MEN | MPC86xx_I2CCR_MSTA
| MPC86xx_I2CCR_TXAK, | MPC86xx_I2CCR_TXAK, I2CCCR);
I2CCCR);
/* Generate stop on last byte */ /* Generate stop on last byte */
if (i == length - 1) if (i == length - 1)
@ -236,7 +235,8 @@ exit:
return !(i == length); return !(i == length);
} }
int i2c_probe (uchar chip) int
i2c_probe(uchar chip)
{ {
int tmp; int tmp;
@ -250,7 +250,8 @@ int i2c_probe (uchar chip)
return i2c_read(chip, 0, 1, (char *)&tmp, 1); return i2c_read(chip, 0, 1, (char *)&tmp, 1);
} }
uchar i2c_reg_read (uchar i2c_addr, uchar reg) uchar
i2c_reg_read(uchar i2c_addr, uchar reg)
{ {
char buf[1]; char buf[1];
@ -259,7 +260,8 @@ uchar i2c_reg_read (uchar i2c_addr, uchar reg)
return buf[0]; return buf[0];
} }
void i2c_reg_write (uchar i2c_addr, uchar reg, uchar val) void
i2c_reg_write(uchar i2c_addr, uchar reg, uchar val)
{ {
i2c_write(i2c_addr, reg, 1, &val, 1); i2c_write(i2c_addr, reg, 1, &val, 1);
} }

@ -64,7 +64,6 @@ static __inline__ unsigned long get_dec (void)
return val; return val;
} }
static __inline__ void set_dec(unsigned long val) static __inline__ void set_dec(unsigned long val)
{ {
if (val) if (val)
@ -77,7 +76,6 @@ int interrupt_init_cpu (unsigned *decrementer_count)
return 0; return 0;
} }
int interrupt_init(void) int interrupt_init(void)
{ {
int ret; int ret;
@ -89,18 +87,21 @@ int interrupt_init (void)
return ret; return ret;
decrementer_count = get_tbclk() / CFG_HZ; decrementer_count = get_tbclk() / CFG_HZ;
debug("interrupt init: tbclk() = %d MHz, decrementer_count = %d\n", (get_tbclk()/1000000), decrementer_count); debug("interrupt init: tbclk() = %d MHz, decrementer_count = %d\n",
(get_tbclk() / 1000000),
decrementer_count);
set_dec(decrementer_count); set_dec(decrementer_count);
set_msr(get_msr() | MSR_EE); set_msr(get_msr() | MSR_EE);
debug("MSR = 0x%08lx, Decrementer reg = 0x%08lx\n", get_msr(), get_dec()); debug("MSR = 0x%08lx, Decrementer reg = 0x%08lx\n",
get_msr(),
get_dec());
return 0; return 0;
} }
void enable_interrupts(void) void enable_interrupts(void)
{ {
set_msr(get_msr() | MSR_EE); set_msr(get_msr() | MSR_EE);
@ -115,7 +116,6 @@ int disable_interrupts (void)
return (msr & MSR_EE) != 0; return (msr & MSR_EE) != 0;
} }
void increment_timestamp(void) void increment_timestamp(void)
{ {
timestamp++; timestamp++;
@ -126,13 +126,11 @@ void increment_timestamp(void)
* with interrupts disabled. * with interrupts disabled.
* Trivial implementation - no need to be really accurate. * Trivial implementation - no need to be really accurate.
*/ */
void void timer_interrupt_cpu(struct pt_regs *regs)
timer_interrupt_cpu (struct pt_regs *regs)
{ {
/* nothing to do here */ /* nothing to do here */
} }
void timer_interrupt(struct pt_regs *regs) void timer_interrupt(struct pt_regs *regs)
{ {
/* call cpu specific function from $(CPU)/interrupts.c */ /* call cpu specific function from $(CPU)/interrupts.c */
@ -158,7 +156,6 @@ void timer_interrupt (struct pt_regs *regs)
board_show_activity(timestamp); board_show_activity(timestamp);
#endif /* CONFIG_SHOW_ACTIVITY */ #endif /* CONFIG_SHOW_ACTIVITY */
} }
void reset_timer(void) void reset_timer(void)
@ -180,22 +177,18 @@ void set_timer (ulong t)
* Install and free a interrupt handler. Not implemented yet. * Install and free a interrupt handler. Not implemented yet.
*/ */
void void irq_install_handler(int vec, interrupt_handler_t *handler, void *arg)
irq_install_handler(int vec, interrupt_handler_t *handler, void *arg)
{ {
} }
void void irq_free_handler(int vec)
irq_free_handler(int vec)
{ {
} }
/* /*
* irqinfo - print information about PCI devices,not implemented. * irqinfo - print information about PCI devices,not implemented.
*/ */
int int do_irqinfo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
do_irqinfo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{ {
printf("\nInterrupt-unsupported:\n"); printf("\nInterrupt-unsupported:\n");
@ -205,14 +198,7 @@ do_irqinfo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
/* /*
* Handle external interrupts * Handle external interrupts
*/ */
void void external_interrupt(struct pt_regs *regs)
external_interrupt(struct pt_regs *regs)
{ {
puts("external_interrupt (oops!)\n"); puts("external_interrupt (oops!)\n");
} }

@ -47,46 +47,53 @@ pci_mpc86xx_init(struct pci_controller *hose)
uint io_sel = (gur->pordevsr & MPC86xx_PORDEVSR_IO_SEL) >> 16; uint io_sel = (gur->pordevsr & MPC86xx_PORDEVSR_IO_SEL) >> 16;
if ((io_sel == 2 || io_sel == 3 || io_sel == 5 || io_sel == 6 || if ((io_sel == 2 || io_sel == 3 || io_sel == 5 || io_sel == 6 ||
io_sel == 7 || io_sel == 0xf) && !(devdisr & MPC86xx_DEVDISR_PCIEX1)){ io_sel == 7 || io_sel == 0xf)
&& !(devdisr & MPC86xx_DEVDISR_PCIEX1)) {
printf("PCI-EXPRESS 1: Configured as %s \n", printf("PCI-EXPRESS 1: Configured as %s \n",
pcie1_agent ? "Agent" : "Host"); pcie1_agent ? "Agent" : "Host");
if(pcie1_agent) return; /*Don't scan bus when configured as agent*/ if (pcie1_agent)
return; /*Don't scan bus when configured as agent */
printf(" Scanning PCIE bus"); printf(" Scanning PCIE bus");
debug("0x%08x=0x%08x ", &pcie1->pme_msg_det,pcie1->pme_msg_det); debug("0x%08x=0x%08x ",
&pcie1->pme_msg_det,
pcie1->pme_msg_det);
if (pcie1->pme_msg_det) { if (pcie1->pme_msg_det) {
pcie1->pme_msg_det = 0xffffffff; pcie1->pme_msg_det = 0xffffffff;
debug(" with errors. Clearing. Now 0x%08x", debug(" with errors. Clearing. Now 0x%08x",
pcie1->pme_msg_det); pcie1->pme_msg_det);
} }
debug("\n"); debug("\n");
} } else {
else{
printf("PCI-EXPRESS 1 disabled!\n"); printf("PCI-EXPRESS 1 disabled!\n");
return; return;
} }
/*set first_bus=0 only skipped B0:D0:F0 which is /*
* Set first_bus=0 only skipped B0:D0:F0 which is
* a reserved device in M1575, but make it easy for * a reserved device in M1575, but make it easy for
* most of the scan process. * most of the scan process.
*/ */
hose->first_busno = 0x00; hose->first_busno = 0x00;
hose->last_busno = 0xfe; hose->last_busno = 0xfe;
pcie_setup_indirect(hose, pcie_setup_indirect(hose, (CFG_IMMR + 0x8000), (CFG_IMMR + 0x8004));
(CFG_IMMR+0x8000),
(CFG_IMMR+0x8004));
pci_hose_read_config_word(hose, PCI_BDF(0,0,0), PCI_COMMAND, &temp16); pci_hose_read_config_word(hose,
PCI_BDF(0, 0, 0), PCI_COMMAND, &temp16);
temp16 |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER | temp16 |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER |
PCI_COMMAND_MEMORY | PCI_COMMAND_IO; PCI_COMMAND_MEMORY | PCI_COMMAND_IO;
pci_hose_write_config_word(hose, PCI_BDF(0,0,0), PCI_COMMAND, temp16); pci_hose_write_config_word(hose,
PCI_BDF(0, 0, 0), PCI_COMMAND, temp16);
pci_hose_write_config_word(hose, PCI_BDF(0, 0, 0), PCI_STATUS, 0xffff); pci_hose_write_config_word(hose, PCI_BDF(0, 0, 0), PCI_STATUS, 0xffff);
pci_hose_write_config_byte(hose, PCI_BDF(0,0,0), PCI_LATENCY_TIMER, 0x80); pci_hose_write_config_byte(hose,
PCI_BDF(0, 0, 0), PCI_LATENCY_TIMER, 0x80);
pci_hose_read_config_dword(hose, PCI_BDF(0,0,0), PCI_PRIMARY_BUS, &temp32); pci_hose_read_config_dword(hose, PCI_BDF(0, 0, 0), PCI_PRIMARY_BUS,
&temp32);
temp32 = (temp32 & 0xff000000) | (0xff) | (0x0 << 8) | (0xfe << 16); temp32 = (temp32 & 0xff000000) | (0xff) | (0x0 << 8) | (0xfe << 16);
pci_hose_write_config_dword(hose, PCI_BDF(0,0,0), PCI_PRIMARY_BUS, temp32); pci_hose_write_config_dword(hose, PCI_BDF(0, 0, 0), PCI_PRIMARY_BUS,
temp32);
pcie1->powar1 = 0; pcie1->powar1 = 0;
pcie1->powar2 = 0; pcie1->powar2 = 0;

@ -28,8 +28,10 @@
static int static int
indirect_read_config_pcie(struct pci_controller *hose, indirect_read_config_pcie(struct pci_controller *hose,
pci_dev_t dev, int offset, pci_dev_t dev,
int len,u32 *val) int offset,
int len,
u32 *val)
{ {
int bus = PCI_BUS(dev); int bus = PCI_BUS(dev);
@ -38,9 +40,11 @@ indirect_read_config_pcie(struct pci_controller *hose,
PEX_FIX; PEX_FIX;
if (bus == 0xff) { if (bus == 0xff) {
PCI_CFG_OUT(hose->cfg_addr, dev | (offset & 0xfc) | 0x80000001); PCI_CFG_OUT(hose->cfg_addr,
dev | (offset & 0xfc) | 0x80000001);
} else { } else {
PCI_CFG_OUT(hose->cfg_addr, dev | (offset & 0xfc) | 0x80000000); PCI_CFG_OUT(hose->cfg_addr,
dev | (offset & 0xfc) | 0x80000000);
} }
/* /*
* Note: the caller has already checked that offset is * Note: the caller has already checked that offset is
@ -78,9 +82,11 @@ indirect_write_config_pcie(struct pci_controller *hose,
PEX_FIX; PEX_FIX;
if (bus == 0xff) { if (bus == 0xff) {
PCI_CFG_OUT(hose->cfg_addr, dev | (offset & 0xfc) | 0x80000001); PCI_CFG_OUT(hose->cfg_addr,
dev | (offset & 0xfc) | 0x80000001);
} else { } else {
PCI_CFG_OUT(hose->cfg_addr, dev | (offset & 0xfc) | 0x80000000); PCI_CFG_OUT(hose->cfg_addr,
dev | (offset & 0xfc) | 0x80000000);
} }
/* /*
@ -176,9 +182,7 @@ indirect_write_config_dword_pcie(struct pci_controller *hose,
} }
void void
pcie_setup_indirect(struct pci_controller* hose, pcie_setup_indirect(struct pci_controller *hose, u32 cfg_addr, u32 cfg_data)
u32 cfg_addr,
u32 cfg_data)
{ {
pci_set_ops(hose, pci_set_ops(hose,
indirect_read_config_byte_pcie, indirect_read_config_byte_pcie,

@ -662,142 +662,140 @@ get_svr:
blr blr
/*------------------------------------------------------------------------------- */ /*
/* Function: in8 */ * Function: in8
/* Description: Input 8 bits */ * Description: Input 8 bits
/*------------------------------------------------------------------------------- */ */
.globl in8 .globl in8
in8: in8:
lbz r3,0x0000(r3) lbz r3,0x0000(r3)
blr blr
/*------------------------------------------------------------------------------- */ /*
/* Function: out8 */ * Function: out8
/* Description: Output 8 bits */ * Description: Output 8 bits
/*------------------------------------------------------------------------------- */ */
.globl out8 .globl out8
out8: out8:
stb r4,0x0000(r3) stb r4,0x0000(r3)
blr blr
/*------------------------------------------------------------------------------- */ /*
/* Function: out16 */ * Function: out16
/* Description: Output 16 bits */ * Description: Output 16 bits
/*------------------------------------------------------------------------------- */ */
.globl out16 .globl out16
out16: out16:
sth r4,0x0000(r3) sth r4,0x0000(r3)
blr blr
/*------------------------------------------------------------------------------- */ /*
/* Function: out16r */ * Function: out16r
/* Description: Byte reverse and output 16 bits */ * Description: Byte reverse and output 16 bits
/*------------------------------------------------------------------------------- */ */
.globl out16r .globl out16r
out16r: out16r:
sthbrx r4,r0,r3 sthbrx r4,r0,r3
blr blr
/*------------------------------------------------------------------------------- */ /*
/* Function: out32 */ * Function: out32
/* Description: Output 32 bits */ * Description: Output 32 bits
/*------------------------------------------------------------------------------- */ */
.globl out32 .globl out32
out32: out32:
stw r4,0x0000(r3) stw r4,0x0000(r3)
blr blr
/*------------------------------------------------------------------------------- */ /*
/* Function: out32r */ * Function: out32r
/* Description: Byte reverse and output 32 bits */ * Description: Byte reverse and output 32 bits
/*------------------------------------------------------------------------------- */ */
.globl out32r .globl out32r
out32r: out32r:
stwbrx r4,r0,r3 stwbrx r4,r0,r3
blr blr
/*------------------------------------------------------------------------------- */ /*
/* Function: in16 */ * Function: in16
/* Description: Input 16 bits */ * Description: Input 16 bits
/*------------------------------------------------------------------------------- */ */
.globl in16 .globl in16
in16: in16:
lhz r3,0x0000(r3) lhz r3,0x0000(r3)
blr blr
/*------------------------------------------------------------------------------- */ /*
/* Function: in16r */ * Function: in16r
/* Description: Input 16 bits and byte reverse */ * Description: Input 16 bits and byte reverse
/*------------------------------------------------------------------------------- */ */
.globl in16r .globl in16r
in16r: in16r:
lhbrx r3,r0,r3 lhbrx r3,r0,r3
blr blr
/*------------------------------------------------------------------------------- */ /*
/* Function: in32 */ * Function: in32
/* Description: Input 32 bits */ * Description: Input 32 bits
/*------------------------------------------------------------------------------- */ */
.globl in32 .globl in32
in32: in32:
lwz 3,0x0000(3) lwz 3,0x0000(3)
blr blr
/*------------------------------------------------------------------------------- */ /*
/* Function: in32r */ * Function: in32r
/* Description: Input 32 bits and byte reverse */ * Description: Input 32 bits and byte reverse
/*------------------------------------------------------------------------------- */ */
.globl in32r .globl in32r
in32r: in32r:
lwbrx r3,r0,r3 lwbrx r3,r0,r3
blr blr
/*------------------------------------------------------------------------------- */ /*
/* Function: ppcDcbf */ * Function: ppcDcbf
/* Description: Data Cache block flush */ * Description: Data Cache block flush
/* Input: r3 = effective address */ * Input: r3 = effective address
/* Output: none. */ * Output: none.
/*------------------------------------------------------------------------------- */ */
.globl ppcDcbf .globl ppcDcbf
ppcDcbf: ppcDcbf:
dcbf r0,r3 dcbf r0,r3
blr blr
/*------------------------------------------------------------------------------- */ /*
/* Function: ppcDcbi */ * Function: ppcDcbi
/* Description: Data Cache block Invalidate */ * Description: Data Cache block Invalidate
/* Input: r3 = effective address */ * Input: r3 = effective address
/* Output: none. */ * Output: none.
/*------------------------------------------------------------------------------- */ */
.globl ppcDcbi .globl ppcDcbi
ppcDcbi: ppcDcbi:
dcbi r0,r3 dcbi r0,r3
blr blr
/*-------------------------------------------------------------------------- /*
* Function: ppcDcbz * Function: ppcDcbz
* Description: Data Cache block zero. * Description: Data Cache block zero.
* Input: r3 = effective address * Input: r3 = effective address
* Output: none. * Output: none.
*-------------------------------------------------------------------------- */ */
.globl ppcDcbz .globl ppcDcbz
ppcDcbz: ppcDcbz:
dcbz r0,r3 dcbz r0,r3
blr blr
/*-------------------------------------------------------------------------- */ /*
/* Function: ppcSync */ * Function: ppcSync
/* Description: Processor Synchronize */ * Description: Processor Synchronize
/* Input: none. */ * Input: none.
/* Output: none. */ * Output: none.
/*-------------------------------------------------------------------------- */ */
.globl ppcSync .globl ppcSync
ppcSync: ppcSync:
sync sync
blr blr
/*-----------------------------------------------------------------------*/
/* /*
* void relocate_code (addr_sp, gd, addr_moni) * void relocate_code (addr_sp, gd, addr_moni)
* *
@ -1205,7 +1203,6 @@ secondary_cpu_setup:
bl icache_enable bl icache_enable
sync sync
/* TBEN in HID0 */ /* TBEN in HID0 */
mfspr r4, HID0 mfspr r4, HID0
oris r4, r4, 0x0400 oris r4, r4, 0x0400

@ -64,7 +64,8 @@ print_backtrace(unsigned long *sp)
if (cnt++ % 7 == 0) if (cnt++ % 7 == 0)
printf("\n"); printf("\n");
printf("%08lX ", i); printf("%08lX ", i);
if (cnt > 32) break; if (cnt > 32)
break;
sp = (unsigned long *)*sp; sp = (unsigned long *)*sp;
} }
printf("\n"); printf("\n");
@ -80,21 +81,19 @@ show_regs(struct pt_regs * regs)
regs->nip, regs->xer, regs->link, regs, regs->trap, regs->dar); regs->nip, regs->xer, regs->link, regs, regs->trap, regs->dar);
printf("MSR: %08lx EE: %01x PR: %01x FP:" printf("MSR: %08lx EE: %01x PR: %01x FP:"
" %01x ME: %01x IR/DR: %01x%01x\n", " %01x ME: %01x IR/DR: %01x%01x\n",
regs->msr, regs->msr&MSR_EE ? 1 : 0, regs->msr&MSR_PR ? 1 : 0, regs->msr, regs->msr & MSR_EE ? 1 : 0,
regs->msr & MSR_FP ? 1 : 0,regs->msr&MSR_ME ? 1 : 0, regs->msr & MSR_PR ? 1 : 0, regs->msr & MSR_FP ? 1 : 0,
regs->msr&MSR_IR ? 1 : 0, regs->msr & MSR_ME ? 1 : 0, regs->msr & MSR_IR ? 1 : 0,
regs->msr & MSR_DR ? 1 : 0); regs->msr & MSR_DR ? 1 : 0);
printf("\n"); printf("\n");
for (i = 0; i < 32; i++) { for (i = 0; i < 32; i++) {
if ((i % 8) == 0) if ((i % 8) == 0) {
{
printf("GPR%02d: ", i); printf("GPR%02d: ", i);
} }
printf("%08lX ", regs->gpr[i]); printf("%08lX ", regs->gpr[i]);
if ((i % 8) == 7) if ((i % 8) == 7) {
{
printf("\n"); printf("\n");
} }
} }
@ -203,7 +202,6 @@ SoftEmuException(struct pt_regs *regs)
panic("Software Emulation Exception"); panic("Software Emulation Exception");
} }
void void
UnknownException(struct pt_regs *regs) UnknownException(struct pt_regs *regs)
{ {
@ -216,36 +214,13 @@ UnknownException(struct pt_regs *regs)
_exception(0, regs); _exception(0, regs);
} }
/* Probe an address by reading. If not present, return -1, otherwise /*
* return 0. * Probe an address by reading.
* If not present, return -1,
* otherwise return 0.
*/ */
int int
addr_probe(uint *addr) addr_probe(uint *addr)
{ {
#if 0
int retval;
__asm__ __volatile__( \
"1: lwz %0,0(%1)\n" \
" eieio\n" \
" li %0,0\n" \
"2:\n" \
".section .fixup,\"ax\"\n" \
"3: li %0,-1\n" \
" b 2b\n" \
".section __ex_table,\"a\"\n" \
" .align 2\n" \
" .long 1b,3b\n" \
".text" \
: "=r" (retval) : "r"(addr));
return (retval);
#endif
return 0; return 0;
} }

Loading…
Cancel
Save