1 1.7 nonaka /* $NetBSD: diskbuf.c,v 1.7 2017/01/24 11:09:14 nonaka Exp $ */ 2 1.1 perry 3 1.1 perry /* 4 1.1 perry * Copyright (c) 1996 5 1.1 perry * Matthias Drochner. All rights reserved. 6 1.1 perry * 7 1.1 perry * Redistribution and use in source and binary forms, with or without 8 1.1 perry * modification, are permitted provided that the following conditions 9 1.1 perry * are met: 10 1.1 perry * 1. Redistributions of source code must retain the above copyright 11 1.1 perry * notice, this list of conditions and the following disclaimer. 12 1.1 perry * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 perry * notice, this list of conditions and the following disclaimer in the 14 1.1 perry * documentation and/or other materials provided with the distribution. 15 1.1 perry * 16 1.1 perry * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 1.1 perry * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 1.1 perry * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 1.1 perry * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 1.1 perry * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21 1.1 perry * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 1.1 perry * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 1.1 perry * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 1.1 perry * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 1.1 perry * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 1.1 perry * 27 1.1 perry */ 28 1.1 perry 29 1.1 perry /* data buffer for BIOS disk / DOS I/O */ 30 1.1 perry 31 1.7 nonaka #include <sys/inttypes.h> 32 1.7 nonaka 33 1.5 junyoung #include <lib/libsa/stand.h> 34 1.1 perry #include "diskbuf.h" 35 1.1 perry 36 1.2 dsl char *diskbufp; /* allocated from heap */ 37 1.1 perry 38 1.2 dsl const void *diskbuf_user; 39 1.2 dsl 40 1.2 dsl /* 41 1.2 dsl * Global shared "diskbuf" is used as read ahead buffer. 42 1.2 dsl * This MAY have to not cross a 64k boundary. 43 1.2 dsl * In practise it is allocated out of the heap early on... 44 1.2 dsl * NB a statically allocated diskbuf is not guaranteed to not 45 1.2 dsl * cross a 64k boundary. 46 1.2 dsl */ 47 1.2 dsl char * 48 1.2 dsl alloc_diskbuf(const void *user) 49 1.2 dsl { 50 1.2 dsl diskbuf_user = user; 51 1.2 dsl if (!diskbufp) { 52 1.2 dsl diskbufp = alloc(DISKBUFSIZE); 53 1.7 nonaka #ifndef EFIBOOT 54 1.7 nonaka if (((uintptr_t)diskbufp & 0xffff) + DISKBUFSIZE > 0x10000) { 55 1.7 nonaka printf("diskbufp %" PRIxPTR "\n", (uintptr_t)diskbufp); 56 1.2 dsl panic("diskbuf crosses 64k boundary"); 57 1.3 fvdl } 58 1.7 nonaka #endif 59 1.2 dsl } 60 1.2 dsl return diskbufp; 61 1.2 dsl } 62