* Fix natfeat debugprintf, it actually works now.
* XHDI fixes, unfinished. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23593 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -125,8 +125,13 @@ class BlockHandle : public Handle {
|
|||||||
bool HasParameters() const { return fHasParameters; }
|
bool HasParameters() const { return fHasParameters; }
|
||||||
const drive_parameters &Parameters() const { return fParameters; }
|
const drive_parameters &Parameters() const { return fParameters; }
|
||||||
|
|
||||||
|
virtual status_t FillIdentifier();
|
||||||
|
|
||||||
disk_identifier &Identifier() { return fIdentifier; }
|
disk_identifier &Identifier() { return fIdentifier; }
|
||||||
uint8 DriveID() const { return fHandle; }
|
uint8 DriveID() const { return fHandle; }
|
||||||
|
status_t InitCheck() const { return fSize > 0 ? B_OK : B_ERROR; };
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
virtual ssize_t ReadBlocks(void *buffer, off_t first, int32 count);
|
virtual ssize_t ReadBlocks(void *buffer, off_t first, int32 count);
|
||||||
|
|
||||||
@@ -478,13 +483,6 @@ BlockHandle::~BlockHandle()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
|
||||||
BlockHandle::InitCheck() const
|
|
||||||
{
|
|
||||||
return fSize > 0 ? B_OK : B_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
BlockHandle::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize)
|
BlockHandle::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize)
|
||||||
{
|
{
|
||||||
@@ -500,9 +498,9 @@ BlockHandle::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize)
|
|||||||
|
|
||||||
// read partial block
|
// read partial block
|
||||||
if (offset) {
|
if (offset) {
|
||||||
ret = Rwabs(RW_READ | RW_NOTRANSLATE, gScratchBuffer, fBlockSize/256, -1, fHandle, pos * fBlockSize/256);
|
ret = ReadBlocks(gScratchBuffer, pos, 1);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return toserror(ret);
|
return ret;
|
||||||
totalBytesRead += fBlockSize - offset;
|
totalBytesRead += fBlockSize - offset;
|
||||||
memcpy(buffer, gScratchBuffer + offset, totalBytesRead);
|
memcpy(buffer, gScratchBuffer + offset, totalBytesRead);
|
||||||
|
|
||||||
@@ -552,11 +550,11 @@ BlockHandle::ReadBlocks(void *buffer, off_t first, int32 count)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*status_t
|
status_t
|
||||||
BlockHandle::FillIdentifier()
|
BlockHandle::FillIdentifier()
|
||||||
{
|
{
|
||||||
return B_NOT_ALLOWED;
|
return B_NOT_ALLOWED;
|
||||||
}*/
|
}
|
||||||
|
|
||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
@@ -631,69 +629,6 @@ BIOSDrive::~BIOSDrive()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ssize_t
|
|
||||||
BIOSDrive::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize)
|
|
||||||
{
|
|
||||||
int32 ret;
|
|
||||||
int sectorsPerBlocks = (fBlockSize / 256);
|
|
||||||
uint32 offset = pos % fBlockSize;
|
|
||||||
pos /= fBlockSize;
|
|
||||||
|
|
||||||
uint32 blocksLeft = (bufferSize + offset + fBlockSize - 1) / fBlockSize;
|
|
||||||
int32 totalBytesRead = 0;
|
|
||||||
|
|
||||||
//TRACE(("BIOS reads %lu bytes from %Ld (offset = %lu), drive %u\n",
|
|
||||||
// blocksLeft * fBlockSize, pos * fBlockSize, offset, fDriveID));
|
|
||||||
|
|
||||||
// read partial block
|
|
||||||
if (offset) {
|
|
||||||
ret = Rwabs(RW_READ | RW_NOTRANSLATE, gScratchBuffer, fBlockSize/256, -1, fHandle, pos * fBlockSize/256);
|
|
||||||
if (ret < 0)
|
|
||||||
return toserror(ret);
|
|
||||||
totalBytesRead += fBlockSize - offset;
|
|
||||||
memcpy(buffer, gScratchBuffer + offset, totalBytesRead);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32 scratchSize = SCRATCH_SIZE / fBlockSize;
|
|
||||||
|
|
||||||
while (blocksLeft > 0) {
|
|
||||||
uint32 blocksRead = blocksLeft;
|
|
||||||
if (blocksRead > scratchSize)
|
|
||||||
blocksRead = scratchSize;
|
|
||||||
|
|
||||||
int32 ret;
|
|
||||||
// XXX: check for AHDI 3.0 before using long recno!!!
|
|
||||||
ret = Rwabs(RW_READ | RW_NOTRANSLATE, gScratchBuffer, blocksRead * sectorsPerBlocks, -1, fHandle, pos * sectorsPerBlocks);
|
|
||||||
if (ret < 0)
|
|
||||||
return toserror(ret);
|
|
||||||
|
|
||||||
uint32 bytesRead = fBlockSize * blocksRead - offset;
|
|
||||||
// copy no more than bufferSize bytes
|
|
||||||
if (bytesRead > bufferSize)
|
|
||||||
bytesRead = bufferSize;
|
|
||||||
|
|
||||||
memcpy(buffer, (void *)(gScratchBuffer + offset), bytesRead);
|
|
||||||
pos += blocksRead;
|
|
||||||
offset = 0;
|
|
||||||
blocksLeft -= blocksRead;
|
|
||||||
bufferSize -= bytesRead;
|
|
||||||
buffer = (void *)((addr_t)buffer + bytesRead);
|
|
||||||
totalBytesRead += bytesRead;
|
|
||||||
}
|
|
||||||
|
|
||||||
return totalBytesRead;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ssize_t
|
|
||||||
BIOSDrive::WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize)
|
|
||||||
{
|
|
||||||
// we don't have to know how to write
|
|
||||||
return B_NOT_ALLOWED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
BIOSDrive::FillIdentifier()
|
BIOSDrive::FillIdentifier()
|
||||||
{
|
{
|
||||||
@@ -837,7 +772,6 @@ XHDIDrive::FillIdentifier()
|
|||||||
fIdentifier.device.unknown.check_sums[i].offset = -1;
|
fIdentifier.device.unknown.check_sums[i].offset = -1;
|
||||||
fIdentifier.device.unknown.check_sums[i].sum = 0;
|
fIdentifier.device.unknown.check_sums[i].sum = 0;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,22 +81,6 @@ real_entry:
|
|||||||
bsr putx
|
bsr putx
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 0
|
|
||||||
//_membot
|
|
||||||
//move.l #0x432,%a0
|
|
||||||
//move.l (%a0),%d0
|
|
||||||
//bsr putx
|
|
||||||
|
|
||||||
//_memtop
|
|
||||||
//move.l #0x436,%a0
|
|
||||||
//move.l (%a0),%d0
|
|
||||||
//bsr putx
|
|
||||||
|
|
||||||
//_v_bas_ad
|
|
||||||
move.l #0x44e,%a0
|
|
||||||
move.l (%a0),%d0
|
|
||||||
bsr putx
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// first, determine if .prg (user) or bootsect (super)
|
// first, determine if .prg (user) or bootsect (super)
|
||||||
// Super()
|
// Super()
|
||||||
@@ -125,9 +109,12 @@ floppy_start:
|
|||||||
lea str,%a0
|
lea str,%a0
|
||||||
bsr puts
|
bsr puts
|
||||||
//bra floppy_start
|
//bra floppy_start
|
||||||
|
|
||||||
// no interrupt
|
// no interrupt
|
||||||
or.w #0x0700,%sr
|
or.w #0x0700,%sr
|
||||||
|
|
||||||
//XXX: check for enough RAM
|
//XXX: check for enough RAM
|
||||||
|
|
||||||
// load the rest
|
// load the rest
|
||||||
move.w sNumSectors,%d2
|
move.w sNumSectors,%d2
|
||||||
// load at base + this code.
|
// load at base + this code.
|
||||||
@@ -220,8 +207,24 @@ prg_start:
|
|||||||
addq.l #6,%sp
|
addq.l #6,%sp
|
||||||
move.l %d0,saved_super_stack
|
move.l %d0,saved_super_stack
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
//_membot
|
||||||
|
move.l #0x432,%a0
|
||||||
|
move.l (%a0),%d0
|
||||||
|
bsr putx
|
||||||
|
|
||||||
|
//_memtop
|
||||||
|
move.l #0x436,%a0
|
||||||
|
move.l (%a0),%d0
|
||||||
|
bsr putx
|
||||||
|
|
||||||
|
//_v_bas_ad
|
||||||
|
move.l #0x44e,%a0
|
||||||
|
move.l (%a0),%d0
|
||||||
|
bsr putx
|
||||||
|
#endif
|
||||||
// disable interrupts
|
// disable interrupts
|
||||||
or.w #0x0700,%sr
|
//or.w #0x0700,%sr
|
||||||
|
|
||||||
lea h5,%a0
|
lea h5,%a0
|
||||||
bsr puts
|
bsr puts
|
||||||
|
|||||||
@@ -108,14 +108,17 @@ void
|
|||||||
_start(void)
|
_start(void)
|
||||||
{
|
{
|
||||||
stage2_args args;
|
stage2_args args;
|
||||||
|
Bconout(DEV_CON, 'H');
|
||||||
|
|
||||||
|
|
||||||
//asm("cld"); // Ain't nothing but a GCC thang.
|
//asm("cld"); // Ain't nothing but a GCC thang.
|
||||||
//asm("fninit"); // initialize floating point unit
|
//asm("fninit"); // initialize floating point unit
|
||||||
|
|
||||||
clear_bss();
|
clear_bss();
|
||||||
|
Bconout(DEV_CON, 'A');
|
||||||
call_ctors();
|
call_ctors();
|
||||||
// call C++ constructors before doing anything else
|
// call C++ constructors before doing anything else
|
||||||
|
Bconout(DEV_CON, 'I');
|
||||||
|
|
||||||
args.heap_size = HEAP_SIZE;
|
args.heap_size = HEAP_SIZE;
|
||||||
|
|
||||||
@@ -124,7 +127,9 @@ _start(void)
|
|||||||
|
|
||||||
//serial_init();
|
//serial_init();
|
||||||
console_init();
|
console_init();
|
||||||
|
Bconout(DEV_CON, 'K');
|
||||||
cpu_init();
|
cpu_init();
|
||||||
|
Bconout(DEV_CON, 'U');
|
||||||
//mmu_init();
|
//mmu_init();
|
||||||
|
|
||||||
// wait a bit to give the user the opportunity to press a key
|
// wait a bit to give the user the opportunity to press a key
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ xhdierror(int32 err)
|
|||||||
if (ide & (1 << 1)) { // track 0 not found
|
if (ide & (1 << 1)) { // track 0 not found
|
||||||
return B_DEV_FORMAT_ERROR;
|
return B_DEV_FORMAT_ERROR;
|
||||||
} else if (ide & (1 << 0)) { // DAM not found
|
} else if (ide & (1 << 0)) { // DAM not found
|
||||||
return B_DEV_FORMAT_ERROR,;
|
return B_DEV_FORMAT_ERROR;
|
||||||
} else if (ide & (1 << 4)) { // ID field not found
|
} else if (ide & (1 << 4)) { // ID field not found
|
||||||
return B_DEV_ID_ERROR;
|
return B_DEV_ID_ERROR;
|
||||||
} else if (ide & (1 << 7)) { // bad block mark
|
} else if (ide & (1 << 7)) { // bad block mark
|
||||||
@@ -160,11 +160,11 @@ xhdierror(int32 err)
|
|||||||
return toserror(err);
|
return toserror(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static void
|
||||||
dump_tos_cookie(const struct tos_cookie *c)
|
dump_tos_cookie(const struct tos_cookie *c)
|
||||||
{
|
{
|
||||||
if (c)
|
if (c)
|
||||||
dprintf("%4.4s: 0x%08lx, %d\n", &c->cookie, c->ivalue, c->ivalue);
|
dprintf("%4.4s: 0x%08lx, %ld\n", (const char *)&c->cookie, c->ivalue, c->ivalue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -182,7 +182,14 @@ dump_tos_cookies(void)
|
|||||||
status_t
|
status_t
|
||||||
init_xhdi(void)
|
init_xhdi(void)
|
||||||
{
|
{
|
||||||
|
struct tos_cookie *c;
|
||||||
|
c = tos_find_cookie(XHDI_COOKIE);
|
||||||
|
if (!c)
|
||||||
|
return ENOENT;
|
||||||
|
if (((uint32 *)c->pvalue)[-1] != XHDI_MAGIC)
|
||||||
|
return EINVAL;
|
||||||
|
gXHDIEntryPoint = c->pvalue;
|
||||||
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -366,6 +366,8 @@ static inline int Bconputs(int16 handle, const char *string)
|
|||||||
/* pointer to the XHDI dispatch function */
|
/* pointer to the XHDI dispatch function */
|
||||||
extern void *gXHDIEntryPoint;
|
extern void *gXHDIEntryPoint;
|
||||||
|
|
||||||
|
extern status_t init_xhdi(void);
|
||||||
|
|
||||||
/* void (no) arg */
|
/* void (no) arg */
|
||||||
#define xhdicallV(callnr) \
|
#define xhdicallV(callnr) \
|
||||||
({ \
|
({ \
|
||||||
@@ -541,11 +543,10 @@ static inline int32 nat_feat_getid(const char *name)
|
|||||||
|
|
||||||
#define nat_feat_call(id, code, a...) \
|
#define nat_feat_call(id, code, a...) \
|
||||||
({ \
|
({ \
|
||||||
int32 ret; \
|
int32 ret = -1; \
|
||||||
NatFeatCookie *c = nat_features(); \
|
NatFeatCookie *c = nat_features(); \
|
||||||
if (!c) \
|
if (c) \
|
||||||
return -1; \
|
ret = c->nfCall(id | code, a); \
|
||||||
ret = c->nfCall(id | code, a##...); \
|
|
||||||
ret; \
|
ret; \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user